iRules

20603 Topics
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/iRules\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/iRules\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[],\"name\":\"TagPage\",\"props\":{},\"url\":\"https://community.f5.com/tag/iRules\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/OverflowNav\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageView/MessageViewInline\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMore\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageUnreadCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageViewCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/kudos/KudosCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/kudos/KudosCount-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRepliesCount\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097583657"}],"cachedText({\"lastModified\":\"1743097583657\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097583657"}]},"CachedAsset:pages-1742463313756":{"__typename":"CachedAsset","id":"pages-1742463313756","value":[{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1742463313756,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"CachedAsset:theme:customTheme1-1742463312973":{"__typename":"CachedAsset","id":"theme:customTheme1-1742463312973","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1743097583657","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1743097583657","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/tags/TagPage-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-pages/tags/TagPage-1743097583657","value":{"tagPageTitle":"Tag:\"{tagName}\" | {communityTitle}","tagPageForNodeTitle":"Tag:\"{tagName}\" in \"{title}\" | {communityTitle}","name":"Tags Page","tag":"Tag: {tagName}"},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1743097587532":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/tags/TagPage:community:zihoc95639-1743097587532","value":{"id":"TagPage","container":{"id":"Common","headerProps":{"removeComponents":["community.widget.bannerWidget"],"__typename":"QuiltContainerSectionProps"},"items":[{"id":"tag-header-widget","layout":"ONE_COLUMN","bgColor":"var(--lia-bs-white)","showBorder":"BOTTOM","sectionEditLevel":"LOCKED","columnMap":{"main":[{"id":"tags.widget.TagsHeaderWidget","__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"},{"id":"messages-list-for-tag-widget","layout":"ONE_COLUMN","columnMap":{"main":[{"id":"messages.widget.messageListForNodeByRecentActivityWidget","props":{"viewVariant":{"type":"inline","props":{"useUnreadCount":true,"useViewCount":true,"useAuthorLogin":true,"clampBodyLines":3,"useAvatar":true,"useBoardIcon":false,"useKudosCount":true,"usePreviewMedia":true,"useTags":false,"useNode":true,"useNodeLink":true,"useTextBody":true,"truncateBodyLength":-1,"useBody":true,"useRepliesCount":true,"useSolvedBadge":true,"timeStampType":"conversation.lastPostingActivityTime","useMessageTimeLink":true,"clampSubjectLines":2}},"panelType":"divider","useTitle":false,"hideIfEmpty":false,"pagerVariant":{"type":"loadMore"},"style":"list","showTabs":true,"tabItemMap":{"default":{"mostRecent":true,"mostRecentUserContent":false,"newest":false},"additional":{"mostKudoed":true,"mostViewed":true,"mostReplies":false,"noReplies":false,"noSolutions":false,"solutions":false}}},"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"},"__typename":"OneColumnQuiltSection"}],"__typename":"QuiltContainer"},"__typename":"Quilt"},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1742463219590":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1742463219590","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1743097583657","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-1742463330781":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1742463330781","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1742463330781":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1742463330781","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1742463330781":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1742463330781","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1742463330781":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1742463330781","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1743097583657","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagsHeaderWidget-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagsHeaderWidget-1743097583657","value":{"tag":"{tagName}","topicsCount":"{count} {count, plural, one {Topic} other {Topics}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListForNodeByRecentActivityWidget-1743097583657","value":{"title@userScope:other":"Recent Content","title@userScope:self":"Contributions","title@board:FORUM@userScope:other":"Recent Discussions","title@board:BLOG@userScope:other":"Recent Blogs","emptyDescription":"No content to show","MessageListForNodeByRecentActivityWidgetEditor.nodeScope.label":"Scope","title@instance:1706288370055":"Content Feed","title@instance:1743095186784":"Most Recent Updates","title@instance:1704317906837":"Content Feed","title@instance:1743095018194":"Most Recent Updates","title@instance:1702668293472":"Community Feed","title@instance:1743095117047":"Most Recent Updates","title@instance:1704319314827":"Blog Feed","title@instance:1743095235555":"Most Recent Updates","title@instance:1704320290851":"My Contributions","title@instance:1703720491809":"Forum Feed","title@instance:1743095311723":"Most Recent Updates","title@instance:1703028709746":"Group Content Feed","title@instance:VTsglH":"Content Feed"},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"Forums"},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"TechnicalForum","nodeType":"board","conversationStyle":"FORUM","title":"Technical Forum","shortTitle":"Technical Forum","parent":{"__ref":"Category:category:Forums"}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"Articles"},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"TechnicalArticles","nodeType":"board","conversationStyle":"TKB","title":"Technical Articles","shortTitle":"Technical Articles","parent":{"__ref":"Category:category:Articles"}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"CrowdSRC"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"codeshare","nodeType":"board","conversationStyle":"TKB","title":"CodeShare","shortTitle":"CodeShare","parent":{"__ref":"Category:category:CrowdSRC"}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"displayId":"communityarticles","nodeType":"board","conversationStyle":"TKB","title":"Community Articles","shortTitle":"Community Articles","parent":{"__ref":"Category:category:CrowdSRC"}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Conversation:conversation:305921":{"__typename":"Conversation","id":"conversation:305921","topic":{"__typename":"TkbTopicMessage","uid":305921},"lastPostingActivityTime":"2024-05-20T14:22:28.187-07:00","solved":false},"User:user:51154":{"__typename":"User","uid":51154,"login":"JRahm","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01MTE1NC1uYzdSVFk?image-coordinates=0%2C0%2C1067%2C1067"},"id":"user:51154"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTZpNDA2Mzg3NjIzNDI0M0Q4RA?revision=27\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTZpNDA2Mzg3NjIzNDI0M0Q4RA?revision=27","title":"code-snapshot.png","associationType":"COVER","width":1152,"height":802,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTVpMDFCQjI5NEM1RjY0RDJGMg?revision=27\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTVpMDFCQjI5NEM1RjY0RDJGMg?revision=27","title":"code-snapshot.png","associationType":"BODY","width":1152,"height":802,"altText":"code-snapshot.png"},"TkbTopicMessage:message:305921":{"__typename":"TkbTopicMessage","subject":"iRules Style Guide","conversation":{"__ref":"Conversation:conversation:305921"},"id":"message:305921","revisionNum":27,"uid":305921,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:51154"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":8187},"postTime":"2022-12-22T08:00:00.023-08:00","lastPublishTime":"2024-05-20T14:22:28.187-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" \n This article (formatted here in collaboration with and from the notes of F5er Jim_Deucker) features an opinionated way to write iRules, which is an extension to the Tcl language. Tcl has its own style guide for reference, as do other languages like my personal favorite python. From the latter, Guido van Rossum quotes Ralph Waldo Emerson: \"A foolish consistency is the hobgoblin of little minds..,\" or if you prefer, Morpheus from the Matrix: \"What you must learn is that these rules are no different than the rules of a computer system. Some of them can be bent. Others can be broken.\" The point? This is a guide, and if there is a good reason to break a rule...by all means break it! \n Editor Settings \n Setting a standard is good for many reasons. It's easier to share code amongst colleagues, peers, or the larger community when code is consistent and professional looking. Settings for some tools are provided below, but if you're using other tools, here's the goal: \n \n indent 4 spaces (no tab characters) \n 100-column goal for line length (120 if you must) but avoid line continuations where possible \n file parameters\n \n ASCII \n Unix linefeeds (\\n) \n trailing whitespace trimmed from the end of each line \n file ends with a linefeed \n \n \n \n Visual Studio Code \n If you aren't using VSCode, why the heck not? This tool is amazing, and with the F5 Networks iRules extension coupled with The F5 Extension, you get the functionality of a powerful editor along with the connectivity control of your F5 hosts. With code diagnostics and auto formatting based on this very guide, the F5 Networks iRules Extension will make your life easy. Seriously...stop reading and go set up VSCode now. \n EditorConfig \n For those with different tastes in text editing using an editor that supports EditorConfig: \n # 4 space indentation\n[*.{irule,irul}]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ninsert_final_newline = true\ncharset = ascii\ntrim_trailing_whitespace = true \n Vim \n I'm a vi guy with sys-admin work, but I prefer a full-fledge IDE for development efforts. If you prefer the file editor, however, we've got you covered with these Vim settings: \n # in ~/.vimrc file\nset tabstop=4\nset shiftwidth=4\nset expandtab\nset fileencoding=ascii\nset fileformat=unix \n Sublime \n There are a couple tools for sublime, but all of them are a bit dated and might require some work to bring them up to speed. Unless you're already a Sublime apologist, I'd choose one of the other two options above. \n \n sublime-f5-irules (bitwisecook fork, billchurch origin) for editing \n Sublime Highlight for export to RTF/HTML \n \n Guidance \n \n Watch out for smart-quotes and non-breaking spaces inserted by applications like Microsoft Word as they can silently break code. The VSCode extension will highlight these occurrences and offer a fix automatically, so again, jump on that bandwagon! \n A single iRule has a 64KB limit. If you're reaching that limit it might be time to question your life choices, I mean, the wisdom of the solution. \n Break out your iRules into functional blocks. Try to separate (where possible) security from app functionality from stats from protocol nuances from mgmt access, etc. For example, when the DevCentral team managed the DevCentral servers and infrastructure, we had 13 iRules to handle maintenance pages, masking application error codes and data, inserting scripts for analytics, managing vanity links and other structural rewrites to name a few. With this strategy, priorities for your events are definitely your friend. \n Standardize on \"{\" placement at the end of a line and not the following line, this causes the least problems across all the BIG-IP versions. # ### THIS ###\n if { thing } {\n script\n } else {\n other_script\n }\n\n # ### NOT THIS ###\n if { thing } {\n script\n }\n else {\n other_script\n } \n 4-character indent carried into nested values as well, like in switch. # ### THIS ###\n switch -- ${thing} {\n \"opt1\" {\n command\n }\n default {\n command\n }\n } \n Comments (as image for this one to preserve line numbers)\n \n Always comment at the same indent-level as the code (lines 1, 4, 9-10) \n Avoid end-of-line comments (line 11) \n Always hash-space a comment (lines 1, 4, 9-10) \n Leave out the space when commenting out code (line 2) \n switch statements cannot have comments inline with options (line 6) \n \n \n Avoid multiple commands on a single line. # ### THIS ###\n set host [getfield [HTTP::host] 1]\n set port [getfield [HTTP::host] 2]\n\n # ### NOT THIS ###\n set host [getfield [HTTP::host] 1]; set port [getfield [HTTP::host] 2] \n Avoid single-line if statements, even for debug logs. # ### THIS ###\n if { ${debug} } {\n log local0. \"a thing happened....\"\n }\n\n # ### NOT THIS ###\n if { ${debug} } { log local0. \"a thing happened...\"} \n Even though Tcl allows a horrific number of ways to communicate truthiness, Always express or store state as 0 or 1 # ### THIS ###\nset f 0\nset t 1\nif { ${f} && ${t} } {\n ...\n}\n# ### NOT THIS ###\n# Valid false values\nset f_values \"n no f fal fals false of off\"\n# Valid true values\nset t_values \"y ye yes t tr tru true on\"\n# Set a single valid, but unpreferred, state\nset f [lindex ${f_values} [expr {int(rand()*[llength ${f_values}])}]]\nset t [lindex ${t_values} [expr {int(rand()*[llength ${t_values}])}]]\n\nif { ${f} && ${t} } {\n ...\n} \n Always use Tcl standard || and && boolean operators over the F5 special and and or operators in expressions, and use parentheses when you have multiple arguments to be explicitly clear on operations. # ### THIS ###\n if { ${state_active} && ${level_gold} } {\n if { (${state} == \"IL\") || (${state} == \"MO\") } {\n pool gold_pool\n }\n }\n\n # ### NOT THIS ###\n if { ${state_active} and ${level_gold} } {\n if { ${state} eq \"IL\" or ${state} eq \"MO\" } {\n pool gold_pool\n }\n } \n Always put a space between a closing curly bracket and an opening one. # ### THIS ###\nif { ${foo} } {\n log local0.info \"something\"\n}\n\n# ### NOT THIS ###\nif { ${foo} }{\n log local0.info \"something\"\n} \n Always wrap expressions in curly brackets to avoid double expansion. (Check out a deep dive on the byte code between the two approaches shown in the picture below) # ### THIS ###\n set result [expr {3 * 4}]\n\n # ### NOT THIS ###\n set result [expr 3 * 4] \n Always use space separation around variables in expressions such as if statements or expr calls. \n Always wrap your variables in curly brackets when referencing them as well. # ### THIS ###\n if { ${host} } {\n\n # ### NOT THIS ###\n if { $host } { \n Terminate options on commands like switch and table with \"--\" to avoid argument injection if if you're 100% sure you don't need them. The VSCode iRules extension will throw diagnostics for this. See K15650046 for more details on the security exposure. # ### THIS ###\n switch -- [whereis [IP::client_addr] country] {\n \"US\" {\n table delete -subtable states -- ${state}\n }\n }\n\n # ### NOT THIS ###\n switch [whereis [IP::client_addr] country] {\n \"US\" {\n table delete -subtable states ${state}\n }\n } \n Always use a priority on an event, even if you're 100% sure you don't need them. The default is 500 so use that if you have no other starting point. \n Always put a timeout and/or lifetime on table contents. Make sure you really need the table space before settling on that solution, and consider abusing the static:: namespace instead. \n Avoid unexpected scope creep with static:: and table variables by assigning prefixes. Lacking a prefix means if multiple rules set or use the variable changing them becomes a race condition on load or rule update. when RULE_INIT priority 500 {\n # ### THIS ###\n set static::appname_confvar 1\n\n # ### NOT THIS ###\n set static::confvar 1\n}​ \n Avoid using static:: for things like debug configurations, it's a leading cause of unintentional log storms and performance hits. If you have to use them for a provable performance reason follow the prefix naming rule. # ### THIS ###\nwhen CLIENT_ACCEPTED priority 500 {\n set debug 1\n}\n\nwhen HTTP_REQUEST priority 500 {\n if { ${debug} } {\n log local0.debug \"some debug message\"\n }\n}\n\n# ### NOT THIS ###\nwhen RULE_INIT priority 500 {\n set static::debug 1\n}\n\nwhen HTTP_REQUEST priority 500 {\n if { ${static::debug} } {\n log local0.debug \"some debug message\"\n }\n}\n​ \n Comments are fine and encouraged, but don't leave commented-out code in the final version. \n \n Wrapping up that guidance with a final iRule putting it all into practice: \n when HTTP_REQUEST priority 500 {\n # block level comments with leading space\n #command commented out\n if { ${a} } {\n command\n }\n if { !${a} } {\n command\n } elseif { ${b} > 2 || ${c} < 3 } {\n command\n } else {\n command\n }\n switch -- ${b} {\n \"thing1\" -\n \"thing2\" {\n # thing1 and thing2 business reason\n }\n \"thing3\" {\n # something else\n }\n default {\n # default branch\n }\n }\n # make precedence explicit with parentheses\n set d [expr { (3 + ${c} ) / 4 }]\n foreach { f } ${e} {\n # always braces around the lists\n }\n foreach { g h i } { j k l m n o p q r } {\n # so the lists are easy to add to\n }\n for { set i 0 } { ${i} < 10 } { incr i } {\n # clarity of each parameter is good\n }\n} \n What standards do you follow for your iRules coding styles? Drop a comment below! \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"9805","kudosSumWeight":23,"repliesCount":12,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTZpNDA2Mzg3NjIzNDI0M0Q4RA?revision=27\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMDU5MjEtMjExOTVpMDFCQjI5NEM1RjY0RDJGMg?revision=27\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:286851":{"__typename":"Conversation","id":"conversation:286851","topic":{"__typename":"TkbTopicMessage","uid":286851},"lastPostingActivityTime":"2023-01-26T04:42:17.478-08:00","solved":false},"User:user:406351":{"__typename":"User","uid":406351,"login":"Sven_Mueller","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-9.svg?time=0"},"id":"user:406351"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUwMDVpMTU3QTZGNTE0MDU4QkFBNA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUwMDVpMTU3QTZGNTE0MDU4QkFBNA?revision=1","title":"0151T000003ljjAQAQ.png","associationType":"BODY","width":606,"height":368,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTA2M2lDODUzMEQzMzJERTc0QzlD?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTA2M2lDODUzMEQzMzJERTc0QzlD?revision=1","title":"0151T000003ljjKQAQ.png","associationType":"BODY","width":939,"height":224,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtODAxMGk2OTNCMzcyQkJDMzEwRDc3?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtODAxMGk2OTNCMzcyQkJDMzEwRDc3?revision=1","title":"0151T000003ljjPQAQ.png","associationType":"BODY","width":939,"height":210,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTE0NWk4OUQ3NTEzREExMUI5Mjk2?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTE0NWk4OUQ3NTEzREExMUI5Mjk2?revision=1","title":"0151T000003ljjZQAQ.png","associationType":"BODY","width":195,"height":204,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUyNzBpRTRGQzE2NUJFRENDMTU3QQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUyNzBpRTRGQzE2NUJFRENDMTU3QQ?revision=1","title":"0151T000003ljjeQAA.png","associationType":"BODY","width":939,"height":272,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTIxMzBpNkUwMUU4RTIwQjZCNjc5MA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTIxMzBpNkUwMUU4RTIwQjZCNjc5MA?revision=1","title":"0151T000003ljjjQAA.png","associationType":"BODY","width":210,"height":343,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTE2OGkyMzI1OUJFMzVCMTZGQUE2?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTE2OGkyMzI1OUJFMzVCMTZGQUE2?revision=1","title":"0151T000003ljjoQAA.png","associationType":"BODY","width":939,"height":172,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzg3Nmk0REYwNUUyQzBERkNEOTAy?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzg3Nmk0REYwNUUyQzBERkNEOTAy?revision=1","title":"0151T000003lkFqQAI.png","associationType":"BODY","width":249,"height":356,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNTc4MGlBQ0QwMTRDNjZBRkM5MDBC?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNTc4MGlBQ0QwMTRDNjZBRkM5MDBC?revision=1","title":"0151T000003ljjtQAA.png","associationType":"BODY","width":939,"height":172,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTI5MzFpNTYwREREOUVDMTBBODY4QQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTI5MzFpNTYwREREOUVDMTBBODY4QQ?revision=1","title":"0151T000003ljjkQAA.png","associationType":"BODY","width":939,"height":395,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTMxMzhpNzNFRDNBNUQ4RTNEMDRGMw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTMxMzhpNzNFRDNBNUQ4RTNEMDRGMw?revision=1","title":"0151T000003ljk3QAA.png","associationType":"BODY","width":939,"height":160,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTA4MjRpNzI1NUQyNTc1MTBFNEU3Rg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTA4MjRpNzI1NUQyNTc1MTBFNEU3Rg?revision=1","title":"0151T000003llNLQAY.png","associationType":"BODY","width":270,"height":366,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNjc1M2lGOEFEMDlFNUM0MDE1OTcw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNjc1M2lGOEFEMDlFNUM0MDE1OTcw?revision=1","title":"0151T000003ljkDQAQ.png","associationType":"BODY","width":270,"height":418,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTczMGk3RjYyRTkxQ0YwRDQ5OEE3?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTczMGk3RjYyRTkxQ0YwRDQ5OEE3?revision=1","title":"0151T000003ljkIQAQ.png","associationType":"BODY","width":939,"height":160,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzIxNmk1MUU3QThGRUUxRjUxNjEz?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzIxNmk1MUU3QThGRUUxRjUxNjEz?revision=1","title":"0151T000003ljkNQAQ.png","associationType":"BODY","width":939,"height":164,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTYwMjRpNDE1NUFFOUMzNUMxNjRBOA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTYwMjRpNDE1NUFFOUMzNUMxNjRBOA?revision=1","title":"0151T000003llNQQAY.png","associationType":"BODY","width":245,"height":382,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTkyaTQyOEIzM0Y2OEY3RkI4REM?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTkyaTQyOEIzM0Y2OEY3RkI4REM?revision=1","title":"0151T000003llNVQAY.png","associationType":"BODY","width":2126,"height":536,"altText":null},"TkbTopicMessage:message:286851":{"__typename":"TkbTopicMessage","subject":"Demonstration of Device DoS and Per-Service DoS protection","conversation":{"__ref":"Conversation:conversation:286851"},"id":"message:286851","revisionNum":1,"uid":286851,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:406351"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":3903},"postTime":"2020-04-08T12:31:46.000-07:00","lastPublishTime":"2020-04-08T12:31:46.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Dear Reader, This article is intended to show what effect the different threshold modes have on the Device and Per-Service (VS/PO) context. I will be using practical examples to demonstrate those effects. You will get to review a couple of scripts which will help you to do DoS flood tests and “visualizing” results on the CLI. In my first article (https://devcentral.f5.com/s/articles/Concept-of-F5-Device-DoS-and-DoS-profiles), I talked about the concept of F5 Device DoS and Per-Service DoS protection (DoS profiles). I also covered the physical and logical data path, which explains the order of Device DoS and Per-Service DoS using the DoS profiles. In the second article (https://devcentral.f5.com/s/articles/Explanation-of-F5-DDoS-threshold-modes), I explained how the different threshold modes are working. In this third article, I would like to show you what it means when the different modes work together. But, before I start doing some tests to show the behavior, I would like to give you a quick introduction into the toolset I´m using for these tests. Toolset First of all, how to do some floods? Different tools that can be found on the Internet are available for use. Whatever tools you might prefer, just download the tool and run it against your Device Under Test (DUT). If you would like to use my script you can get it from GitHub: https://github.com/sv3n-mu3ll3r/DDoS-Scripts With this script - it uses hping - you can run different type of attacks. Simply start it with: $ ./attack_menu.sh <IP> <PORT> A menu of different attacks will be presented which you can launch against the used IP and port as a parameter. Figure 1: Attack Menu To see what L3/4 DoS events are currently ongoing on your BIG-IP, simply go to the DoS Overview page. Figure 2: DoS Overview page I personally prefer to use the CLI to get the details I´m interested in. This way I don´t need to switch between CLI to launch my attacks and GUI to see the results. For that reason, I created a script which shows me what I am most interested in. Figure 3: DoS stats via CLI You can download that script here: https://github.com/sv3n-mu3ll3r/F5_show_DoS_stats_scripts Simply run it with the “watch” command and the parameter “-c” to get a colored output (-c is only available starting with TMOS version 14.0): What is this script showing you? context_name:\tThis is the context, either PO/VS or the Device in which the vector is running vector_name:\t\tThis is the name of the DoS vector attack_detected: When it shows “1”, then an attack has been detected, which means the ‘stats_rate’ is above the ‘detection-rate'. stats_rate:\t\t\tShows you the current incoming pps rate for that vector in this context drops_rate:\t\tShows you the number dropped pps rate in software (not FPGA) for that vector in this context int_drops_rate:\tShows you the number dropped pps rate in hardware (FPGA) for that vector in this context ba_stats_rate:\tShows you the pps rate for bad actors                         ba_drops_rate:\tShows you the pps rate of dropped ‘bad actors’ in HW and SW bd_stats_rate:   Shows you the pps rate for attacked destination                      bd_drop_rate:\tShows you the pps rate for dropped ‘attacked destination’ mitigation_curr:\tShows the current mitigation rate (per tmm) for that vector in that context detection:\t\t\tShows you the current detection rate (per tmm) for that vector in that context wl_count:\t\t\tShows you the number of whitelist hits for that vector in that context hw_offload:\t\tWhen it shows ‘1’ it means that FPGAs are involved in the mitigation int_dropped_bytes_rate:\tGives you the rate of in HW dropped bytes for that vector in that context dropped_bytes_rate: \t\tGives you the rate of in SW dropped bytes for that vector in that context When a line is displayed in green, it means packets hitting that vector. However, no anomaly is detected or anything is mitigated (dropped) via DoS. If a line turns yellow, then an attack  - anomaly – has been detected but no packets are dropped via DoS functionalities. When the color turns red, then the system is actually mitigating and dropping packets via DoS functionalities on that vector in that context. Start Testing Before we start doing some tests, let me provide you with a quick overview of my own lab setup. I´m using a DHD (DDoS Hybrid Defender) running on a i5800 box with TMOS version 15.1 My traffic generator sends around 5-6 Gbps legitimate (HTTP and DNS) traffic through the box which is connected in L2 mode (v-wire) to my network.   On the “client” side, where my clean traffic generator is located, my attacking clients are located as well by use of my DoS script. On the “server” side, I run a web service and DNS service, which I´m going to attack. Ok, now let’s do some test so see the behavior of the box and double check that we really understand the DDoS mitigation concept of BIG-IP.   Y-MAS flood against a protected server Let’s start with a simple Y-MAS (all TCP flags cleared) flood. You can only configure this vector on the device context and only in manual mode. Which is ok, because this TCP packet is not valid and would get drop by the operating system (TMOS) anyway. But, because I want this type of packet get dropped in hardware (FPGA) very early, when they hit the box, mostly without touching the CPU, I set the thresholds to ‘10’ on the Mitigation Threshold EPS and to ‘10’ on Detection Threshold EPS. That means as soon as a TMM sees more then 10 pps for that vector it will give me a log message and also rate-limit this type of packets per TMM to 10 packets per second. That means that everything below that threshold will get to the operating system (TMOS) and get dropped there. Figure 4: Bad TCP Flags vector As soon as I start the attack, which targets the web service (10.103.1.50, port 80) behind the DHD with randomized source IPs. $ /usr/sbin/hping3 --ymas -p 80 10.103.1.50 --flood --rand-source I do get a log messages in /var/log/ltm: Feb 5 10:57:52 lon-i5800-1 err tmm3[15367]: 01010252:3: A Enforced Device DOS attack start was detected for vector Bad TCP flags (all cleared), Attack ID 546994598. And, my script shows me the details on that attack in real time (the line is in ‘red’, indicating we are mitigating): Currently 437569 pps are hitting the device. 382 pps are blocked by DDoS in SW (CPU) and 437187 are blocked in HW (FPGA). Figure 5: Mitigating Y-Flood Great, that was easy. :-) Now, let’s do another TCP flood against my web server.   RST-flood against a protected server with Fully manual Threshold mode: For this test I´m using the “Fully Manual” mode, which configures the thresholds for the whole service we are protecting with the DoS profile, which is attached to my VS/PO. Figure 6: RST flood with manual configuration My Detection Threshold and my Mitigation Threshold EPS is set to ‘100’. That means as soon as we see more then 100 RST packets hitting the configured VS/PO on my BIG-IP for this web server, the system will start to rate-limit and send a log message. Figure 7: Mitigating RST flood on PO level Perfect. We see the vector in the context of my web server (/Common/PO_10.103.1.50_HTTP) is blocking (rate-limiting) as expected from the configuration. Please ignore the 'IP bad src' which is in detected mode. This is because 'hping' creates randomized IPs and not all of them are valid. RST-flood against a protected server with Fully Automatic Threshold mode: In this test I set the Threshold Mode for the RST vector on the DoS profile which is attached to my web server to ‘Fully Automatic’ and this is what you would most likely do in the real world as well. Figure 8: RST vector configuration with Fully Automatic But, what does this mean for the test now? I run the same flood against the same destination and my script shows me the anomaly on the VS/PO (and on the device context), but it does not mitigate! Why would this happen? Figure 9: RST flood with Fully Automatic configuration When we take a closer look at the screenshot we see that the ‘stats_rate’ shows 730969 pps. The detection rate shows 25. From where is this 25 coming? As we know, when ‘Fully Automatic’ is enabled then the system learns from history. In this case, the history was even lower than 25, but because I set the floor value to 100, the detection rate per TMM is 25 (floor_value / number of TMMs), which in my case is 100/4 = 25 So, we need to recognize, that the ‘stats_rate’ value represents all packets for that vector in that context and the detection value is showing the per TMM value. This value explains us why the system has detected an attack, but why is it not dropping via DoS functionalities? To understand this, we need to remember that the mitigation in ‘Fully Automatic’ mode will ONLY kick in if the incoming rate for that vector is above the detection rate (condition is here now true) AND the stress on the service is too high. But, because BIG-IP is configures as a stateful device, this randomized RST packets will never reach the web service, because they get all dropped latest by the state engine of the BIG-IP. Therefor the service will never have stress caused by this flood.This is one of the nice benefits of having a stateful DoS device. So, the vector on the web server context will not mitigate here, because the web server will not be stressed by this type of TCP attack. This does also explains the Server Stress visualization in the GUI, which didn´t change before and during the attack. Figure 10: DoS Overview in the GUI But, what happens if the attack gets stronger and stronger or the BIG-IP is too busy dealing with all this RST packets? This is when the Device DOS kicks in but only if you have configured it in ‘Fully Automatic’ mode as well. As soon as the BIG-IP receives more RST packets then usually (detection rate) AND the stress (CPU load) on the BIG-IP gets too high, it starts to mitigate on the device context. This is what you can see here: Figure 11: 'massive' RST flood with Fully Automatic configuration The flood still goes against the same web server, but the mitigation is done on the device context, because the CPU utilization on the BIG-IP is too high.   In the screenshot below you can see that the value for the mitigation (mitigation_curr) is set to 5000 on the device context, which is the same as the detection value. This value results from the 'floor' value as well.  It is the smallest possible value, because the detection and mitigation rate will never be below the 'floor' value. The mitigation rate is calculated dynamically based on the stress of the BIG-IP. In this test I artificially increased the stress on the BIG-IP and therefor the mitigation rate was calculated to the lowest possible number, which is the same as the detection rate. I will provide an explanation of how I did that later. Figure 13: Device context configuration for RST Flood Because this is the device config, the value you enter in the GUI is per TMM and this is reflected on the script output as well. What does this mean for the false-positive rate? First of all, all RST packets not belonging to an existing flow will kicked out by the state engine. At this point we don´t have any false positives. If the attack increases and the CPU can´t handle the number of packets anymore, then the DOS protection on the device context kicks in. With the configuration we have done so far, it will do the rate-limiting on all RST packets hitting the BIG-IP. There is no differentiation anymore between good and bad RST, or if the RST has the destination of server 1 or server 2, and so on. This means that at this point we can face false positives with this configuration. Is this bad? Well, false-positives are always bad, but at this point you can say it´s better to have few false-positives then a service going down or, even more critical, when your DoS device goes down. What can you do to only have false positives on the destination which is under attack? You probably have recognized that you can also enable “Attacked Destination Detection” on the DoS vector, which makes sense on the device context and on a DoS profile which is used on protected object (VS), that covers a whole network. Figure 14: Device context configuration for RST Flood with 'Attacked Destination Detection' enabled If the attack now hits one or multiple IPs in that network, BIG-IP will identify them and will do the rate-limiting only on the destination(s) under attack. Which still means that you could face false positives, but they will be at least only on the IPs under attack. This is what we see here: Figure 15: Device context mitigation on attacked destination(s) The majority of the RST packet drops are done on the “bad destination” (bd_drops_rate), which is the IP under attack. The other option you can also set is “Bad Actor Detection”. When this is enabled the system identifies the source(s) which causes the load and will do the rate limiting for that IP address(es). This usually works very well for amplification attacks, where the attack packets coming from ‘specific’ hosts and are not randomized sources. Figure 16: Device context mitigation on attacked destination(s) and bad actor(s) Here you can see the majority of the mitigation is done on ‘bad actors’. This reduces the chance of false positives massively. Figure 17: Device context configuration for RST Flood with 'Attacked Destination Detection' and 'Bad Actor Detection' enabled You also have multiple additional options to deal with ‘attacked destination’ and ‘bad actors’, but this is something I will cover in another article. Artificial increase BIG-IPs CPU load Before I finish this article, I would like to give you an idea on how you could increase the CPU load of the BIG-IP for your own testing. Because, as we know, with “Fully Automatic” on the device context, the mitigation kicks only in if the packet rate is above the detection rate AND the CPU utilization on the BIG-IP is “too” high. This is sometimes difficult to archive in a lab because you may not be able to send enough packets to stress the CPUs of a HW BIG-IP.   In this use-case I use a simple iRule, which I attach to the VS/PO that is under attack. Figure 18: Stress iRule   When I start my attack, I send the traffic with a specific TTL for identification. This TTL is configured in my iRule in order to get a CPU intensive string compare function to work on every attack packet. Here is an example for 'hping': $ /usr/sbin/hping3 --rst -p 80 10.103.1.50 --ttl 5 --flood --rand-source This can easily drive the CPU very high and the DDoS rate-limiting kicks in very aggressive. Summary I hope that this article provides you with an even better understanding on what effect the different threshold modes have on the attack mitigation. Of course, keep in mind this are just the ‘static DoS’ vectors. In later articles I will explain also the 'Behavioral DoS' and the Cookie based mitigation, which helps to massively reduce the chance of a false positives. But, also keep in mind, the DoS vectors start to act in microseconds and are very effective for protecting. Thank you, sVen Mueller ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"15825","kudosSumWeight":12,"repliesCount":3,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUwMDVpMTU3QTZGNTE0MDU4QkFBNA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTA2M2lDODUzMEQzMzJERTc0QzlD?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtODAxMGk2OTNCMzcyQkJDMzEwRDc3?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTE0NWk4OUQ3NTEzREExMUI5Mjk2?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTUyNzBpRTRGQzE2NUJFRENDMTU3QQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTIxMzBpNkUwMUU4RTIwQjZCNjc5MA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTE2OGkyMzI1OUJFMzVCMTZGQUE2?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzg3Nmk0REYwNUUyQzBERkNEOTAy?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNTc4MGlBQ0QwMTRDNjZBRkM5MDBC?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTI5MzFpNTYwREREOUVDMTBBODY4QQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTMxMzhpNzNFRDNBNUQ4RTNEMDRGMw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTA4MjRpNzI1NUQyNTc1MTBFNEU3Rg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtNjc1M2lGOEFEMDlFNUM0MDE1OTcw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTczMGk3RjYyRTkxQ0YwRDQ5OEE3?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMzIxNmk1MUU3QThGRUUxRjUxNjEz?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtMTYwMjRpNDE1NUFFOUMzNUMxNjRBOA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODY4NTEtOTkyaTQyOEIzM0Y2OEY3RkI4REM?revision=1\"}"}}],"totalCount":17,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:283971":{"__typename":"Conversation","id":"conversation:283971","topic":{"__typename":"TkbTopicMessage","uid":283971},"lastPostingActivityTime":"2025-03-03T09:35:29.618-08:00","solved":false},"User:user:214133":{"__typename":"User","uid":214133,"login":"Hardeep_Kaur","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/custom/Frankenstack_02-1706129554890.svg?time=1706129593000"},"id":"user:214133"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTE2MDdpMzQzRkI0NEVGQTdBMTBBNg?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTE2MDdpMzQzRkI0NEVGQTdBMTBBNg?revision=9","title":"0151T0000040JicQAE.png","associationType":"BODY","width":1996,"height":579,"altText":"0151T0000040JicQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTQzOTNpRDlFNEY2NEMxNzUwMkYyMA?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTQzOTNpRDlFNEY2NEMxNzUwMkYyMA?revision=9","title":"0151T0000040Qc7QAE.png","associationType":"BODY","width":1280,"height":610,"altText":"0151T0000040Qc7QAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTI1M2k0QjREQjE0MDNGNzM0QjhB?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTI1M2k0QjREQjE0MDNGNzM0QjhB?revision=9","title":"0151T0000040JidQAE.png","associationType":"BODY","width":1798,"height":915,"altText":"0151T0000040JidQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzMWk5MUM4QkE3MEQ4NDE3RkQz?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzMWk5MUM4QkE3MEQ4NDE3RkQz?revision=9","title":"0151T0000040JihQAE.png","associationType":"BODY","width":1881,"height":1747,"altText":"0151T0000040JihQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTg2MGkxQUZDQzY2MjJFMUY2QzVG?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTg2MGkxQUZDQzY2MjJFMUY2QzVG?revision=9","title":"0151T0000040JimQAE.png","associationType":"BODY","width":1820,"height":1258,"altText":"0151T0000040JimQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODc1MGk5MTFFRkE4QkE2RDY5MDc5?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODc1MGk5MTFFRkE4QkE2RDY5MDc5?revision=9","title":"0151T0000040JinQAE.png","associationType":"BODY","width":1895,"height":1495,"altText":"0151T0000040JinQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTA4NjNpNTYyM0FBN0Q5MDgyQzhCRQ?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTA4NjNpNTYyM0FBN0Q5MDgyQzhCRQ?revision=9","title":"0151T0000040JirQAE.png","associationType":"BODY","width":1558,"height":1408,"altText":"0151T0000040JirQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDIzMWk1NThDNzNERUVDNDM2QUYy?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDIzMWk1NThDNzNERUVDNDM2QUYy?revision=9","title":"0151T0000040JiiQAE.png","associationType":"BODY","width":2092,"height":1413,"altText":"0151T0000040JiiQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtTnpNQ2xh?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtTnpNQ2xh?revision=9","title":"irule.png","associationType":"BODY","width":1449,"height":1027,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNTYxNGlFQTIzRjk4OTQ3MDM5OThC?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNTYxNGlFQTIzRjk4OTQ3MDM5OThC?revision=9","title":"0151T0000040JisQAE.png","associationType":"BODY","width":1276,"height":656,"altText":"0151T0000040JisQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNzI1OGk2QTM3NzVDNjM1QkVBQUZD?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNzI1OGk2QTM3NzVDNjM1QkVBQUZD?revision=9","title":"0151T0000040JitQAE.png","associationType":"BODY","width":1555,"height":386,"altText":"0151T0000040JitQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMjAyaTI3MkExOEM2MjAwMjI3NUM?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMjAyaTI3MkExOEM2MjAwMjI3NUM?revision=9","title":"0151T0000040JioQAE.png","associationType":"BODY","width":1435,"height":597,"altText":"0151T0000040JioQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMzYzOGk1QTA0REIyQ0M5NjIzQjBC?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMzYzOGk1QTA0REIyQ0M5NjIzQjBC?revision=9","title":"0151T0000040N2LQAU.png","associationType":"BODY","width":2222,"height":1018,"altText":"0151T0000040N2LQAU.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODYzM2lGNzREQzI1Q0Q5M0VBMEI2?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODYzM2lGNzREQzI1Q0Q5M0VBMEI2?revision=9","title":"0151T0000040MvyQAE.png","associationType":"BODY","width":2099,"height":419,"altText":"0151T0000040MvyQAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNjY2N2k1RTYxRDE4QjE3OTZCNkE1?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNjY2N2k1RTYxRDE4QjE3OTZCNkE1?revision=9","title":"0151T0000040MwDQAU.png","associationType":"BODY","width":1236,"height":331,"altText":"0151T0000040MwDQAU.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzNGlDRDdBN0JFQzVEOEMwODBB?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzNGlDRDdBN0JFQzVEOEMwODBB?revision=9","title":"0151T0000040Jj1QAE.png","associationType":"BODY","width":718,"height":450,"altText":"0151T0000040Jj1QAE.png"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDE1aTRDODQ3ODk3QjU5REQ2Njc?revision=9\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDE1aTRDODQ3ODk3QjU5REQ2Njc?revision=9","title":"0151T0000040MwNQAU.png","associationType":"BODY","width":2797,"height":1392,"altText":"0151T0000040MwNQAU.png"},"TkbTopicMessage:message:283971":{"__typename":"TkbTopicMessage","subject":"APM Configuration to Support Duo MFA using iRule","conversation":{"__ref":"Conversation:conversation:283971"},"id":"message:283971","revisionNum":9,"uid":283971,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:214133"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":17928},"postTime":"2021-03-03T08:35:12.000-08:00","lastPublishTime":"2025-03-03T09:35:29.618-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Overview \n BIG-IP APM has supported Duo as an MFA provider for a long time with RADIUS-based integration. Recently, Duo has added support for Universal Prompt that uses Open ID Connect (OIDC) protocol to provide two-factor authentication. To integrate APM as an OIDC client and resource server, and Duo as an Identity Provider (IdP), Duo requires the user’s logon name and custom parameters to be sent for Authentication and Token request.  \n This guide describes the configuration required on APM to enable Duo MFA integration using an iRule. iRules addresses the custom parameter challenges by generating the needed custom values and saving them in session variables, which the OAuth Client agent then uses to perform MFA with Duo. This integration procedure is supported on BIG-IP versions 13.1, 14.1x, 15.1x, and 16.x. \n To integrate Duo MFA with APM, complete the following tasks:  \n 1. Choose deployment type: Per-request or Per-session \n 2. Configure credentials and policies for MFA on the DUO web portal \n 3. Create OAuth objects on the BIG-IP system \n 4. Configure the iRule \n 5. Create the appropriate access policy/policies on the BIG-IP system \n 6. Apply policy/policies and iRule to the APM virtual server \n Choose deployment type \n APM supports two different types of policies for performing authentication functions. \n \n Per-session policies: Per-session policies provide authentication and authorization functions that occur only at the beginning of a user’s session. These policies are compatible with most APM use cases such as VPN, Webtop portal, Remote Desktop, federation IdP, etc. \n Per-request policies: Per-request policies provide dynamic authentication and authorization functionality that may occur at any time during a user’s session, such as step-up authentication or auditing functions only for certain resources. These policies are only compatible with Identity Aware Proxy and Web Access Management use cases and cannot be used with VPN or webtop portals. \n \n This guide contains information about setting up both policy types. \n Prerequisites \n Ensure the BIG-IP system has DNS and internet connectivity to contact Duo directly for validating the user's OAuth tokens. \n Configure credentials and policies for MFA on Duo web portal \n Before you can protect your F5 BIG-IP APM Web application with Duo, you will first need to sign up for a Duo account.  \n 1. Log in to the Duo Admin Panel and navigate to Applications. \n 2. Click Protect an application.  \n Figure 1: Duo Admin Panel – Protect an Application \n 3. Locate the entry for F5 BIG-IP APM Web in the applications list and click Protect to get the Client ID, Client secret, and API hostname. You will need this information to configure objects on APM. \n Figure 2: Duo Admin Panel – F5 BIG-IP APM Web \n 4. As DUO is used as a secondary authentication factor, the user’s logon name is sent along with the authentication request. Depending on your security policy, you may want to pre-provision users in Duo, or you may allow them to self-provision to set their preferred authentication type when they first log on.  \n To add users to the Duo system, navigate to the Dashboard page and click the Add New... -> Add User button. A Duo username should match the user's primary authentication username. Refer to the https://duo.com/docs/enrolling-users link for the different methods of user enrollment.  \n Refer to Duo Universal Prompt for additional information on Duo’s two-factor authentication.  \n Create OAuth objects on the BIG-IP system \n Create a JSON web key \n When APM is configured to act as an OAuth client or resource server, it uses JSON web keys (JWKs) to validate the JSON web tokens it receives from Duo. \n To create a JSON web key: \n 1. On the Main tab, select Access > Federation > JSON Web Token > Key Configuration. \n The Key Configuration screen opens. \n 2. To add a new key configuration, click Create. \n 3. In the ID and Shared Secret fields, enter the Client ID and Client Secret values respectively obtained from Duo when protecting the application.  \n 4. In the Type list, select the cryptographic algorithm used to sign the JSON web key. \n Figure 3: Key Configuration screen \n 5. Click Save.  \n Create a JSON web token \n As an OAuth client or resource server, APM validates the JSON web tokens (JWT) it receives from Duo.  \n To create a JSON web token: \n 1. On the Main tab, select Access > Federation > JSON Web Token > Token Configuration. \n The Token Configuration screen opens. \n 2. To add a new token configuration, click Create. \n 3. In the Issuer field, enter the API hostname value obtained from Duo when protecting the application.  \n 4. In the Signing Algorithms area, select from the Available list and populate the Allowed and Blocked lists. \n 5. In the Keys (JWK) area, select the previously configured JSON web key in the allowed list of keys. \n  Figure 4: Token Configuration screen \n 6. Click Save. \n Configure Duo as an OAuth provider \n APM uses the OAuth provider settings to get URIs on the external OAuth authorization server for JWT web tokens. \n To configure an OAuth provider: \n 1. On the Main tab, select Access > Federation > OAuth Client / Resource Server > Provider. \n The Provider screen opens. \n 2. To add a provider, click Create. \n 3. In the Name field, type a name for the provider. \n 4. From the Type list, select Custom. \n 5. For Token Configuration (JWT), select a configuration from the list.  \n 6. In the Authentication URI field, type the URI on the provider where APM should redirect the user for authentication. The hostname is the same as the API hostname in the Duo application. \n 7. In the Token URI field, type the URI on the provider where APM can get a token. The hostname is the same as the API hostname in the Duo application. \n Figure 5: OAuth Provider screen \n 8. Click Finished. \n Configure Duo server for APM \n The OAuth Server settings specify the OAuth provider and role that Access Policy Manager (APM) plays with that provider. It also sets the Client ID, Client Secret, and Client’s SSL certificates that APM uses to communicate with the provider. \n To configure a Duo server: \n 1. On the Main tab, select Access > Federation > OAuth Client / Resource Server > OAuth Server. \n The OAuth Server screen opens. \n 2. To add a server, click Create. \n 3. In the Name field, type a name for the Duo server. \n 4. From the Mode list, select how you want the APM to be configured. \n 5. From the Type list, select Custom. \n 6. From the OAuth Provider list, select the Duo provider. \n 7. From the DNS Resolver list, select a DNS resolver (or click the plus (+) icon, create a DNS resolver, and then select it). \n 8. In the Token Validation Interval field, type a number. \n In a per-request policy subroutine configured to validate the token, the subroutine repeats at this interval or the expiry time of the access token, whichever is shorter. \n 9. In the Client Settings area, paste the Client ID and Client secret you obtained from Duo when protecting the application. \n 10. From the Client's ServerSSL Profile Name, select a server SSL profile. \n Figure 6: OAuth Server screen \n 11. Click Finished. \n Configure an auth-redirect-request and a token-request \n Requests specify the HTTP method, parameters, and headers to use for the specific type of request. An auth-redirect-request tells Duo where to redirect the end-user, and a token-request accesses the authorization server for obtaining an access token. \n To configure an auth-redirect-request: \n 1. On the Main tab, select Access > Federation > OAuth Client / Resource Server > Request. \n The Request screen opens. \n 2. To add a request, click Create. \n 3. In the Name field, type a name for the request. \n 4. For the HTTP Method, select GET. \n 5. For the Type, select auth-redirect-request. \n 6. As shown in Figure 7, specify the list of GET parameters to be sent: \n \n request parameter with value depending on the type of policy \n For per-request policy: %{subsession.custom.jwt_duo}  \n For per-session policy: %{session.custom.jwt_duo} \n client_id parameter with type client-id \n response_type parameter with type response-type \n \n Figure 7: Request screen with auth-redirect-request (Use “subsession.custom…” for Per-request or “session.custom…” for Per-session) \n 7. Click Finished. \n To configure a token-request: \n 1. On the Main tab, select Access > Federation > OAuth Client / Resource Server > Request. \n The Request screen opens. \n 2. To add a request, click Create. \n 3. In the Name field, type a name for the request. \n 4. For the HTTP Method, select POST. \n 5. For the Type, select token-request. \n 6. As shown in Figure 8, specify the list of POST parameters to be sent: \n \n client_assertion parameter with value depending on the type of policy \n For per-request policy: %{subsession.custom.jwt_duo_token}  \n For per-session policy: %{session.custom.jwt_duo_token} \n client_assertion_type parameter with value urn:ietf:params:oauth:client-assertion-type:jwt-bearer \n grant_type parameter with type grant-type \n redirect_uri parameter with type redirect-uri  \n \n Figure 8: Request screen with token-request (Use “subsession.custom…” for Per-request or “session.custom…” for Per-session) \n 7. Click Finished. \n Configure the iRule \n iRules gives you the ability to customize and manage your network traffic. Configure an iRule that creates the required sub-session variables and usernames for Duo integration.  \n Note: This iRule has sections for both per-request and per-session policies and can be used for either type of deployment. \n To configure an iRule: \n 1. On the Main tab, click Local Traffic > iRules. \n 2. To create an iRules, click Create. \n 3. In the Name field, type a name for the iRule. \n 4. Copy the sample code given below and paste it in the Definition field.  \n Replace the following variables with values specific to the Duo application: \n \n <Duo Client ID> in the getClientId function with Duo Application ID.  \n <Duo API Hostname> in the createJwtToken function with API Hostname. For example, https://api-duohostname.com/oauth/v1/token. \n <JSON Web Key> in the getJwkName function with the configured JSON web key. \n \n Note: The iRule ID here is set as JWT_CREATE. You can rename the ID as desired. You specify this ID in the iRule Event agent in Visual Policy Editor. \n when ACCESS_POLICY_AGENT_EVENT {\n if { [ACCESS::policy agent_id] eq \"JWT_CREATE\" } {\n set duo_uname [ACCESS::session data get \"session.logon.last.username\"]\n\n # Inline logic for creating JWT\n set header \"{\\\"alg\\\":\\\"HS512\\\",\\\"typ\\\":\\\"JWT\\\"}\"\n set exp [expr {[clock seconds] + 900}]\n set client_id \"<Duo Client ID>\"\n\n set redirect_uri \"https://[ACCESS::session data get session.server.network.name]/oauth/client/redirect\"\n set payload \"{\\\"response_type\\\": \\\"code\\\",\\\"scope\\\":\\\"openid\\\",\\\"exp\\\":${exp},\\\"client_id\\\":\\\"${client_id}\\\",\\\"redirect_uri\\\":\\\"${redirect_uri}\\\",\\\"duo_uname\\\":\\\"${duo_uname}\\\"}\"\n\n set jwt_duo [ACCESS::oauth sign -header $header -payload $payload -alg HS512 -key \"<JSON Web Key>\"]\n ACCESS::session data set session.custom.jwt_duo $jwt_duo\n\n # JWT Token creation\n set aud \"<Duo API Hostname>\"\n set jti [string range [clock seconds] 0 31]\n set token_payload \"{\\\"sub\\\": \\\"${client_id}\\\",\\\"iss\\\":\\\"${client_id}\\\",\\\"aud\\\":\\\"${aud}\\\",\\\"exp\\\":${exp},\\\"jti\\\":\\\"${jti}\\\"}\"\n\n set jwt_duo_token [ACCESS::oauth sign -header $header -payload $token_payload -alg HS512 -key \"<JSON Web Key>\"]\n ACCESS::session data set session.custom.jwt_duo_token $jwt_duo_token\n }\n}\n\nwhen ACCESS_PER_REQUEST_AGENT_EVENT {\n if { [ACCESS::perflow get perflow.irule_agent_id] eq \"JWT_CREATE\" } {\n set duo_uname [ACCESS::session data get \"session.logon.last.username\"]\n\n set header \"{\\\"alg\\\":\\\"HS512\\\",\\\"typ\\\":\\\"JWT\\\"}\"\n set exp [expr {[clock seconds] + 900}]\n set client_id \"<Duo Client ID>\"\n\n set redirect_uri \"https://[ACCESS::session data get session.server.network.name]/oauth/client/redirect\"\n set payload \"{\\\"response_type\\\": \\\"code\\\",\\\"scope\\\":\\\"openid\\\",\\\"exp\\\":${exp},\\\"client_id\\\":\\\"${client_id}\\\",\\\"redirect_uri\\\":\\\"${redirect_uri}\\\",\\\"duo_uname\\\":\\\"${duo_uname}\\\"}\"\n\n set jwt_duo [ACCESS::oauth sign -header $header -payload $payload -alg HS512 -key \"<JSON Web Key>\"]\n ACCESS::perflow set perflow.custom $jwt_duo\n\n # JWT Token creation\n set aud \"<Duo API Hostname>\"\n set jti [string range [clock seconds] 0 31]\n set token_payload \"{\\\"sub\\\": \\\"${client_id}\\\",\\\"iss\\\":\\\"${client_id}\\\",\\\"aud\\\":\\\"${aud}\\\",\\\"exp\\\":${exp},\\\"jti\\\":\\\"${jti}\\\"}\"\n\n set jwt_duo_token [ACCESS::oauth sign -header $header -payload $token_payload -alg HS512 -key \"<JSON Web Key>\"]\n ACCESS::perflow set perflow.scratchpad $jwt_duo_token\n }\n} \n Note: iRule updated 11/27/2024 to eliminate CMP demotion. \n \n Figure 9: iRule screen \n 5. Click Finished. \n Create the appropriate access policy/policies on the BIG-IP system \n Per-request policy \n Skip this section for a per-session type deployment \n The per-request policy is used to perform secondary authentication with Duo. Configure the access policies through the access menu, using the Visual Policy Editor. The per-request access policy must have a subroutine with an iRule Event, Variable Assign, and an OAuth Client agent that requests authorization and tokens from an OAuth server. You may use other per-request policy items such as URL branching or Client Type to call Duo only for certain target URIs. \n Figure 10 shows a subroutine named duosubroutine in the per-request policy that handles Duo MFA authentication.  \n Figure 10: Per-request policy in Visual Policy Editor \n Configuring the iRule Event agent \n The iRule Event agent specifies the iRule ID to be executed for Duo integration. In the ID field, type the iRule ID as configured in the iRule.  \n Figure 11: iRule Event agent in Visual Policy Editor \n Configuring the Variable Assign agent \n The Variable Assign agent specifies the variables for token and redirect requests and assigns a value for Duo MFA in a subroutine. This is required only for per-request type deployment. Add sub-session variables as custom variables and assign their custom Tcl expressions as shown in Figure 12. \n \n subsession.custom.jwt_duo_token = return [mcget {perflow.scratchpad}] \n subsession.custom.jwt_duo = return [mcget {perflow.custom}] \n \n Figure 12: Variable Assign agent in Visual Policy Editor  \n Configuring the OAuth Client agent \n An OAuth Client agent requests authorization and tokens from the Duo server. Specify OAuth parameters as shown in Figure 13.  \n \n In the Server list, select the Duo server to which the OAuth client directs requests. \n In the Authentication Redirect Request list, select the auth-redirect-request configured earlier. \n In the Token Request list, select the token-request configured earlier. \n Some deployments may not need the additional information provided by OpenID Connect. You could, in that case, disable it. \n \n Figure 13: OAuth Client agent in Visual Policy Editor  \n Per-session policy \n Configure the Per Session policy as appropriate for your chosen deployment type. \n \n Per-request: The per-session policy must contain at least one logon page to set the username variable in the user’s session. Preferably it should also perform some type of primary authentication. This validated username is used later in the per-request policy. \n Per-session: The per-session policy is used for all authentication. A per-request policy is not used. \n \n Figures 14a and 14b show a per-session policy that runs when a client initiates a session. Depending on the actions you include in the access policy, it can authenticate the user and perform actions that populate session variables with data for use throughout the session. \n Figure 14a: Per-session policy in Visual Policy Editor performs both primary authentication and Duo authentication (for per-session use case) \n Figure 14b: Per-session policy in Visual Policy Editor performs primary authentication only (for per-request use case) \n Apply policy/policies and iRule to the APM virtual server \n Finally, apply the per-request policy, per-session policy, and iRule to the APM virtual server. You assign iRules as a resource to the virtual server that users connect. Configure the virtual server’s default pool to the protected local web resource. \n Apply policy/policies to the virtual server \n Per-request policy \n To attach policies to the virtual server: \n 1. On the Main tab, click Local Traffic > Virtual Servers. \n 2. Select the Virtual Server. \n 3. In the Access Policy section, select the policy you created. \n 4. Click Finished. \n Figure 15: Access Policy section in Virtual Server (per-request policy)  \n Per-session policy \n Figure 16 shows the Access Policy section in Virtual Server when the per-session policy is deployed. \n Figure 16: Access Policy section in Virtual Server (per-session policy) \n Apply iRule to the virtual server \n To attach the iRule to the virtual server:  \n 1. On the Main tab, click Local Traffic > Virtual Servers. \n 2. Select the Virtual Server. \n 3. Select the Resources tab. \n 4. Click Manage in the iRules section. \n 5. Select an iRule from the Available list and add it to the Enabled list. \n 6. Click Finished. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"17700","kudosSumWeight":12,"repliesCount":52,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTE2MDdpMzQzRkI0NEVGQTdBMTBBNg?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTQzOTNpRDlFNEY2NEMxNzUwMkYyMA?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTI1M2k0QjREQjE0MDNGNzM0QjhB?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzMWk5MUM4QkE3MEQ4NDE3RkQz?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTg2MGkxQUZDQzY2MjJFMUY2QzVG?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODc1MGk5MTFFRkE4QkE2RDY5MDc5?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMTA4NjNpNTYyM0FBN0Q5MDgyQzhCRQ?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDIzMWk1NThDNzNERUVDNDM2QUYy?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtTnpNQ2xh?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNTYxNGlFQTIzRjk4OTQ3MDM5OThC?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNzI1OGk2QTM3NzVDNjM1QkVBQUZD?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMjAyaTI3MkExOEM2MjAwMjI3NUM?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtMzYzOGk1QTA0REIyQ0M5NjIzQjBC?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtODYzM2lGNzREQzI1Q0Q5M0VBMEI2?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNjY2N2k1RTYxRDE4QjE3OTZCNkE1?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDYzNGlDRDdBN0JFQzVEOEMwODBB?revision=9\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODM5NzEtNDE1aTRDODQ3ODk3QjU5REQ2Njc?revision=9\"}"}}],"totalCount":17,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:280936":{"__typename":"Conversation","id":"conversation:280936","topic":{"__typename":"TkbTopicMessage","uid":280936},"lastPostingActivityTime":"2020-10-09T06:04:46.000-07:00","solved":false},"User:user:115030":{"__typename":"User","uid":115030,"login":"Rodrigo_Albuque","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-6.svg?time=0"},"id":"user:115030"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzQwNGk3N0MwNEY5QzU2M0YwRDZE?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzQwNGk3N0MwNEY5QzU2M0YwRDZE?revision=1","title":"0151T000003WHBJQA4.png","associationType":"BODY","width":2752,"height":1134,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDA1M2k1OUY4NENBNUNBOTAyRjg4?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDA1M2k1OUY4NENBNUNBOTAyRjg4?revision=1","title":"0151T000003WHBKQA4.png","associationType":"BODY","width":1798,"height":326,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjU2OWkwNTJFNkFGNTMxMzlFMDVE?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjU2OWkwNTJFNkFGNTMxMzlFMDVE?revision=1","title":"0151T000003WHBOQA4.png","associationType":"BODY","width":2266,"height":1114,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTQ1MTRpRkNEMDczQUUyRjNEQUQ5NA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTQ1MTRpRkNEMDczQUUyRjNEQUQ5NA?revision=1","title":"0151T000003WHBTQA4.png","associationType":"BODY","width":2406,"height":196,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzIxNmkwMkI0MjA1ODRCREFDMTlD?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzIxNmkwMkI0MjA1ODRCREFDMTlD?revision=1","title":"0151T000003WHBPQA4.png","associationType":"BODY","width":2400,"height":642,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzgzOGkyODVFRDcxMzRBNkNDODVF?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzgzOGkyODVFRDcxMzRBNkNDODVF?revision=1","title":"0151T000003WHBUQA4.png","associationType":"BODY","width":2406,"height":646,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTY4OWk4Mzk2NDhFMTEyRTU0NkQy?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTY4OWk4Mzk2NDhFMTEyRTU0NkQy?revision=1","title":"0151T000003WHBYQA4.gif","associationType":"BODY","width":2338,"height":1162,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTUxMmlEREY4ODhDMzI2MUY4MEZG?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTUxMmlEREY4ODhDMzI2MUY4MEZG?revision=1","title":"0151T000003WHBQQA4.gif","associationType":"BODY","width":2338,"height":1162,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTExMDNpREVDN0VGRUFERDhGNDNGRA?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTExMDNpREVDN0VGRUFERDhGNDNGRA?revision=1","title":"0151T000003WHBZQA4.gif","associationType":"BODY","width":2338,"height":1162,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTI4NWkwOEQ0MTZFNDMyQUY2NDUw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTI4NWkwOEQ0MTZFNDMyQUY2NDUw?revision=1","title":"0151T000003WHBVQA4.png","associationType":"BODY","width":2758,"height":70,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtOTI3N2kyOTU3MDg1QkY3OTFDMTY4?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtOTI3N2kyOTU3MDg1QkY3OTFDMTY4?revision=1","title":"0151T000003WHBaQAO.png","associationType":"BODY","width":2756,"height":242,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDU4NGlGQUFGQzRCOTU5QTY4NjMx?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDU4NGlGQUFGQzRCOTU5QTY4NjMx?revision=1","title":"0151T000003WHBWQA4.png","associationType":"BODY","width":2400,"height":1182,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDEwOGk3Q0U1RDYxRDFBRDRDNTVC?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDEwOGk3Q0U1RDYxRDFBRDRDNTVC?revision=1","title":"0151T000003WHBXQA4.png","associationType":"BODY","width":2006,"height":782,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTM0M2kzQjdBOThGNjI1OUM3N0E1?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTM0M2kzQjdBOThGNjI1OUM3N0E1?revision=1","title":"0151T000003WHBdQAO.png","associationType":"BODY","width":1778,"height":1792,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjUwOGlCOENDMTY2MTFFMkQ1RDk3?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjUwOGlCOENDMTY2MTFFMkQ1RDk3?revision=1","title":"0151T000003WHBiQAO.png","associationType":"BODY","width":2716,"height":498,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjYyOWkxMUI4QUIyRjgwNjAwOUE5?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjYyOWkxMUI4QUIyRjgwNjAwOUE5?revision=1","title":"0151T000003WHBbQAO.png","associationType":"BODY","width":2752,"height":142,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI5MTFpQ0FGRTY2QUVEQjE2RjUwMQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI5MTFpQ0FGRTY2QUVEQjE2RjUwMQ?revision=1","title":"0151T000003WHBeQAO.png","associationType":"BODY","width":2798,"height":300,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTE1NTJpQUJGMURBQzI1RUI0QTVCMg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTE1NTJpQUJGMURBQzI1RUI0QTVCMg?revision=1","title":"0151T000003WHBnQAO.png","associationType":"BODY","width":2396,"height":42,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjY0Mmk3QTA5NzgwRDFDNDgzNjRG?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjY0Mmk3QTA5NzgwRDFDNDgzNjRG?revision=1","title":"0151T000003WHBoQAO.png","associationType":"BODY","width":2802,"height":164,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODAxOGkyMTREQkYxQjMxN0RCREYz?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODAxOGkyMTREQkYxQjMxN0RCREYz?revision=1","title":"0151T000003WHBcQAO.png","associationType":"BODY","width":2402,"height":982,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzIyMGlEQTZDN0JGRUFFNjZFNUUw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzIyMGlEQTZDN0JGRUFFNjZFNUUw?revision=1","title":"0151T000003WHBkQAO.png","associationType":"BODY","width":2000,"height":386,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODM5MWkwMzdBNzQ2NzEzMTcyQjlB?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODM5MWkwMzdBNzQ2NzEzMTcyQjlB?revision=1","title":"0151T000003WHBlQAO.png","associationType":"BODY","width":1402,"height":46,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI3MjFpRDI4NUFBRENEOEFDN0QxNQ?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI3MjFpRDI4NUFBRENEOEFDN0QxNQ?revision=1","title":"0151T000003WHBLQA4.png","associationType":"BODY","width":2802,"height":152,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI1MzBpMjQ5MDdGNUFGQzg5NTAyMg?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI1MzBpMjQ5MDdGNUFGQzg5NTAyMg?revision=1","title":"0151T000003WHBsQAO.png","associationType":"BODY","width":598,"height":702,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjM3MmlBMjA3OTQxMzU5QTFBQzUw?revision=1\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjM3MmlBMjA3OTQxMzU5QTFBQzUw?revision=1","title":"0151T000003WHBpQAO.png","associationType":"BODY","width":1358,"height":504,"altText":null},"TkbTopicMessage:message:280936":{"__typename":"TkbTopicMessage","subject":"Decrypting TLS traffic on BIG-IP","conversation":{"__ref":"Conversation:conversation:280936"},"id":"message:280936","revisionNum":1,"uid":280936,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:115030"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":12742},"postTime":"2020-04-23T04:23:45.000-07:00","lastPublishTime":"2020-04-23T04:23:45.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" 1 Introduction As soon as I joined F5 Support, over 5 years ago, one of the first things I had to learn quickly was to decrypt TLS traffic because most of our customers useL7 applications protected by TLS layer. In this article, I will show 4 ways to decrypt traffic on BIG-IP, including the new one just release in v15.x that is ideal for TLS1.3 where TLS handshake is also encrypted. If that's what you want to know just skip to tcpdump --f5 ssl option section as this new approach is just a parameter added to tcpdump. As this article is very hands-on, I will show my lab topology for the tests I performed and then every possible way I used to decrypt customer's traffic working for Engineering Services at F5. 2 Lab Topology This is the lab topology I used for the lab test where all tests were performed: Also, for every capture I issued the following curl command: Update: the virtual server's IP address is actually 10.199.3.145/32 2 The 4 ways to decrypt BIG-IP's traffic RSA private key decryption There are 3 constraints here: Full TLS handshake has to be captured Check Appendix 2 to learn how to to disable BIG-IP's cache RSA key exchange has to be used, i.e. no (EC)DHE Check Appendix 1 to understand how to check what's key exchange method used in your TLS connection Check Appendix 2 to understand how to prioritise RSA as key exchange method Private key has to be copied to Wireshark machine (ssldump command solves this problem) Roughly, to accomplish that we can set Cache Size to 0 on SSL profile and remove (EC)DHE from Cipher Suites (see Appendix 1 for details) I first took a packet capture using :p modifier to capture only the client and server flows specific to my Client's IP address (10.199.3.1): Note: The 0.0 interface will capture any forwarding plane traffic (tmm) and nnn is the highest noise to capture as much flow information as possible to be displayed on the F5 dissector header. For more details about tcpdump syntax, please have a look at K13637: Capturing internal TMM information with tcpdump and K411: Overview of packet tracing with the tcpdump utility. Also, we need to make sure we capture the full TLS handshake. It's perfectly fine to capture resumed TLS sessions as long as full TLS handshake has been previously captured. Initially, our capture is unencrypted as seen below: On Mac, I clicked on Wireshark → Preferences: Then Protocols → TLS → RSA keys list where we see a window where we can reference BIG-IP's (or server if we want to decrypt server SSL side) private key: Once we get there, we need to add any IP address of the flow we want Wireshark to decrypt, the corresponding port and the private key file (default.crt for Client SSL profile in this particular lab test): Note: For Client SSL profile, this would be the private key on Certificate Chain field corresponding to the end entity Certificate being served to client machines through the Virtual Server. For Server SSL profile, the private key is located on the back-end server and the key would be the one corresponding to the end entity Certificate sent in the TLS Certificate message sent from back-end server to BIG-IP during TLS handshake. Once we click OK, we can see the HTTP decrypted traffic (in green): In production environment, we would normally avoid copying private keys to different machines so another option is use ssldump command directly on the server we're trying to capture. Again, if we're capturing Client SSL traffic, ssldump is already installed on BIG-IP. We would follow the same steps as before but instead of copying private key to Wireshark machine, we would simply issue this command on the BIG-IP (or back-end server if it's Server SSL traffic): Syntax: ssldump -r <capture.pcap> -k <private key.key> -M <type a name for your ssldump file here.pms> . For more details, please have a look at K10209: Overview of packet tracing with the ssldump utility. In ssldump-generated.pms, we should find enough information for Wireshark to decrypt the capture: Syntax: ssldump -r <capture.pcap> -k <private key.key> -M <type a name for your ssldump file here.pms> . For more details, please have a look at K10209: Overview of packet tracing with the ssldump utility. In ssldump-generated.pms, we should find enough information for Wireshark to decrypt the capture: After I clicked OK, we indeed see the decrypted http traffic back again: We didn't have to copy BIG-IP's private key to Wireshark machine here. iRules The only constraint here is that we should apply the iRule to the virtual server in question. Sometimes that's not desirable, especially when we're troubleshooting an issue where we want the configuration to be unchanged. Note: there is a bug that affects versions 11.6.x and 12.x that was fixed on 13.x. It records the wrong TLS Session ID to LTM logs. The workaround would be to manually copy the Session ID from tcpdump capture or to use RSA decryption as in previous example. You can also combine both SSL::clientrandom and SSL::sessionid which is the ideal: Reference: K12783074: Decrypting SSL traffic using the SSL::sessionsecret iRules command (12.x and later) Again, I took a capture using tcpdump command: After applying above iRule to our HTTPS virtual server and taking tcpdump capture, I see this on /var/log/ltm: To copy this to a *.pms file we can use on Wireshark we can use sed command (reference: K12783074): Note: If you don't want to overwrite completely the PMS file make sure you use >> instead of >. The end result would be something like this: As both resumed and full TLS sessions have client random value, I only had to copy CLIENT_RANDOM + Master secret to our PMS file because all Wireshark needs is a session reference to apply master secret. To decrypt file on Wireshark just go to Wireshark →  Preferences → Protocols → TLS → Pre-Master Key logfile name like we did in ssldump section and add file we just created: As seen on LTM logs, CLIENTSSL_HANDSHAKE event captured master secret from our client-side connection and SERVERSSL_HANDSHAKE from server side. In this case, we should have both client and server sides decrypted, even though we never had access to back-end server: Notice added an http filter to show you both client and and server traffic were decrypted this time. tcpdump --f5 ssl option This was introduced in 15.x and we don't need to change virtual server configuration by adding iRules. The only thing we need to do is to enable tcpdump.sslprovider db variable which is disabled by default: After that, when we take tcpdump capture, we just need to add --f5 ssl to the command like this: Notice that we've got a warning message because Master Secret will be copied to tcpdump capture itself, so we need to be careful with who we share such capture with. I had to update my Wireshark to v3.2.+ and clicked on Analyze  → Enabled Protocols: And enable F5 TLS dissector: Once we open the capture, we can find all the information you need to create our PMS file embedded in the capture: Very cool, isn't it? We can then copy the Master Secret and Client Random values by right clicking like this: And then paste it to a blank PMS file. I first pasted the Client Random value followed by Master Secret value like this: Note: I manually typed CLIENT_RANDOM and then pasted both values for both client and server sides directly from tcpdump capture. The last step was to go to  Wireshark →  Preferences →  Protocols → TLS and add it to Pre-master-Secret log filename and click OK: Fair enough! Capture decrypted on both client and server sides: I used http filter to display only decrypted HTTP packets just like in iRule section. Appendix 1 How do we know which Key Exchange method is being used? RSA private key can only decrypt traffic on Wireshark if RSA is the key exchange method negotiated during TLS handshake. Client side will tell the Server side which ciphers it support and server side will reply with the chosen cipher on Server Hello message. With that in mind, on Wireshark, we'd click on Server Hello header under Cipher Suite: Key Exchange and Authentication both come before the WITH keyword. In above example, because there's only RSA we can say that RSA is used for both Key Exchange and Authentication. In the following example, ECDHE is used for key exchange and RSA for authentication: Appendix 2 Disabling Session Resumption and Prioritising RSA key exchange We can set Cache Size to 0 to disable TLS session resumption and change the Cipher Suites to anything that makes BIG-IP pick RSA for Key Exchange: ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"9596","kudosSumWeight":12,"repliesCount":10,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzQwNGk3N0MwNEY5QzU2M0YwRDZE?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDA1M2k1OUY4NENBNUNBOTAyRjg4?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjU2OWkwNTJFNkFGNTMxMzlFMDVE?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTQ1MTRpRkNEMDczQUUyRjNEQUQ5NA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNzIxNmkwMkI0MjA1ODRCREFDMTlD?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzgzOGkyODVFRDcxMzRBNkNDODVF?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDc","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTY4OWk4Mzk2NDhFMTEyRTU0NkQy?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDg","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTUxMmlEREY4ODhDMzI2MUY4MEZG?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDk","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTExMDNpREVDN0VGRUFERDhGNDNGRA?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEw","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTI4NWkwOEQ0MTZFNDMyQUY2NDUw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtOTI3N2kyOTU3MDg1QkY3OTFDMTY4?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDU4NGlGQUFGQzRCOTU5QTY4NjMx?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDEz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNDEwOGk3Q0U1RDYxRDFBRDRDNTVC?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE0","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNTM0M2kzQjdBOThGNjI1OUM3N0E1?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE1","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjUwOGlCOENDMTY2MTFFMkQ1RDk3?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE2","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMjYyOWkxMUI4QUIyRjgwNjAwOUE5?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE3","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI5MTFpQ0FGRTY2QUVEQjE2RjUwMQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE4","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTE1NTJpQUJGMURBQzI1RUI0QTVCMg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE5","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjY0Mmk3QTA5NzgwRDFDNDgzNjRG?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDIw","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODAxOGkyMTREQkYxQjMxN0RCREYz?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDIx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMzIyMGlEQTZDN0JGRUFFNjZFNUUw?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDIy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtODM5MWkwMzdBNzQ2NzEzMTcyQjlB?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDIz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI3MjFpRDI4NUFBRENEOEFDN0QxNQ?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI0","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtMTI1MzBpMjQ5MDdGNUFGQzg5NTAyMg?revision=1\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI1","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODA5MzYtNjM3MmlBMjA3OTQxMzU5QTFBQzUw?revision=1\"}"}}],"totalCount":33,"pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI1","hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:326298":{"__typename":"Conversation","id":"conversation:326298","topic":{"__typename":"TkbTopicMessage","uid":326298},"lastPostingActivityTime":"2024-07-02T10:32:04.332-07:00","solved":false},"User:user:50672":{"__typename":"User","uid":50672,"login":"Joseph_Martin","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS01MDY3Mi1IeTcxUWc?image-coordinates=0%2C4%2C1092%2C1097"},"id":"user:50672"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMTdpOEFDM0NBMzVDNjZGMzNGOQ?revision=8\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMTdpOEFDM0NBMzVDNjZGMzNGOQ?revision=8","title":"JA4.png","associationType":"BODY","width":960,"height":540,"altText":"JA4 TLS Client Fingerprint Format"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMThpQjUxRTcyNDVGQUMyOTAwMQ?revision=8\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMThpQjUxRTcyNDVGQUMyOTAwMQ?revision=8","title":"JA4-request-log.png","associationType":"BODY","width":1273,"height":447,"altText":"JA4-request-log.png"},"TkbTopicMessage:message:326298":{"__typename":"TkbTopicMessage","subject":"Fingerprinting TLS Clients with JA4 on F5 BIG-IP","conversation":{"__ref":"Conversation:conversation:326298"},"id":"message:326298","revisionNum":8,"uid":326298,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:50672"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" JA4+ is a set of simple network fingerprints that are both human and machine readable to facilitate more effective threat-hunting and analysis.  In this article you will learn how you can use F5 iRules to gerenate JA4 TLS fingerprints. ","introduction":"","metrics":{"__typename":"MessageMetrics","views":4204},"postTime":"2024-01-09T05:00:00.044-08:00","lastPublishTime":"2024-07-02T10:32:04.332-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" \n What is JA4? \n JA4 is a subset of the larger JA4+ set of network fingerprints.  JA4+ is a set of simple network fingerprints for a number of protocols that are intended to be both human and machine readable, and replaces the JA3 TLS fingerprinting standard from 2017 (Salesforce is no longer maintaining JA3).  Currently, JA4+ includes JA4/S/H/L/X/SSH, or JA4+ for short. \n JA4+ Fingerprints \n JA4 — TLS Client JA4S — TLS Server Response JA4H — HTTP Client JA4L — Light Distance/Location JA4X — X509 TLS Certificate JA4SSH — SSH Traffic \n More fingerprints are in development and will be added to the JA4+ family as they are released. \n From the previous table, JA4 is the network fingerprint for TLS clients.  If you are not familiar with network fingerprinting or TLS fingerprinting, please see John Althouse's excellent article detailing the release of JA4+. \n Like JA3 (the predecessor to JA4), JA4 generates the fingerprint through passive analysis of the TLS CLIENT_HELLO packet.  Using the information provided in this protocol packet, an easily readable and sharable fingerprint is generated using the following format: \n \n  For details on the technical implementation of JA4+ please see the JA4+ github page. \n Like all of the other JA4+ fingerprints, the JA4 client TLS fingerprint is broken into three parts in an a_b_c format.  The intent of this format is to allow for tracking of similar, but not identical, fingerprints.  For example, as John explains in his blog, one vendor already implementing JA4 into their product has \"an actor who scans the internet with a constantly changing single TLS cipher. This generates a massive amount of completely different JA3 fingerprints but with JA4, only the b part of the JA4 fingerprint changes, parts a and c remain the same. As such, they can track the actor by looking at the JA4_ac fingerprint (joining a+c, dropping b)\". \n Implementing JA4 on F5 BIG-IP \n While F5 MAY implement JA4 natively into its various products and services at some point, that doesn't help us NOW.  So, how can we take advantage of JA4 on F5 BIGIP TODAY?  F5 iRules, of course!!! \n Following the technical implementation detailed in the JA4+ github documentation, I wrote an iRule to generate JA4 client TLS fingerprints.  I will not explain all the details of the iRule, as I tried to include enough inline comments in the iRule itself sufficiently to document what each section of the iRule is doing. \n Update Jan 19, 2024: There was a change to the JA4 spec (prior to it's release) that I did not capture in the previous version of this iRule.  The iRule has been updated to include this change. \n Update April 24, 2024:  Removing the inline iRule in favor of a link to the Github repository so readers will also have latest version of the iRule.  \n JA4 Client TLS Fingerprint iRule: \n All of the F5 iRules for JA4 can be found on the DevCentral Github Repository here. \n As you may be able to tell from the last few lines of the iRule, the JA4 fingerprint is injected into an HTTP request header.  This allows the web server (or, potentially, any other security component in the path) to \"see\" and act on the JA4 fingerprint.  Also, because this HTTP header is injected at HTTP_REQUEST time, it allows other modules in the BIGIP to \"see\" and potentially act on the JA4 fingerprint. \n JA4 Fingerprint in HTTP Request Log \n In my next article in this series on JA4, I'll detail how I could use F5 Advanced Web Application Firewall (AWAF) to block traffic based on the \"reputation\" of a JA4 fingerprint. \n Requirements and Caveats \n Currently, this iRule uses SSL iRule events and commands.  As such, it requires a Client SSL profile to be attached to any virtual server that has this iRule assigned.  This also means that SSL/TLS is terminated at the F5 device.  Depending on demand, I MAY create another version of this iRule that does not have this requirement. \n EDIT:  The latest version of the JA4 iRule no longer requires SSL/TLS termination at the F5 BIGIP.  It will work whether the SSL/TLS is terminated at the F5 BIGIP or not. \n Also, because the iRule is injecting an HTTP header, it requires that an HTTP profile is also assigned to the virtual server.   The latest version of the JA4 iRules uses a separate iRule to inject JA4+ fingerprints as HTTP headers.  This allows use of the JA4 iRules without needing to modify them.  If you do not want to inject the JA4 as an HTTP header, you will then want to log the JA4 fingerprint. Or, you could inject the JA4 fingerprint into the underlying protocol in some way; otherwise, you are simply generating a JA4 fingerprint and doing nothing with it. \n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"4863","kudosSumWeight":10,"repliesCount":0,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMTdpOEFDM0NBMzVDNjZGMzNGOQ?revision=8\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMjYyOTgtMjcxMThpQjUxRTcyNDVGQUMyOTAwMQ?revision=8\"}"}}],"totalCount":2,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:278650":{"__typename":"Conversation","id":"conversation:278650","topic":{"__typename":"TkbTopicMessage","uid":278650},"lastPostingActivityTime":"2022-01-16T11:35:11.000-08:00","solved":false},"User:user:72543":{"__typename":"User","uid":72543,"login":"Aaron_Hooley","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg?time=0"},"id":"user:72543"},"TkbTopicMessage:message:278650":{"__typename":"TkbTopicMessage","subject":"iRule to set SameSite for compatible clients and remove it for incompatible clients (LTM|ASM|APM)","conversation":{"__ref":"Conversation:conversation:278650"},"id":"message:278650","revisionNum":1,"uid":278650,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:72543"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":14343},"postTime":"2020-02-10T20:19:53.000-08:00","lastPublishTime":"2020-02-10T20:19:53.000-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" A bunch of us have been refining approaches to help customers handle the new browser enforcement of the HTTP cookie SameSite attribute. I think we have a pretty solid approach now to handle compatible and incompatible user-agents. \n The iRule:\n Allows the admin to set the SameSite attribute on BIG-IP and web application cookies (all cookies, explicitly named cookies or cookies that start with a string) for user-agents that handle the SameSite attribute Allows the admin to remove the SameSite attribute for user-agents which do not support SameSite=None. The behavior for an incompatible client receiving a cookie with SameSite not set should be the same as a compatible client handling SameSite=None (the incompatible client should send the cookie on third party requests) \n The iRule uses Simon Kowallik's updated string matching logic to handle the incompatible user-agent from Chomium's blog: https://www.chromium.org/updates/same-site/incompatible-clients Note this iRule only modifies BIG-IP and web application cookies found in Set-Cookie headers. It does not attempt to modify cookies that the BIG-IP or web application sets via Javascript or other methods. BIG-IP ASM is known to set some cookies via Javascript. If you require support for this, please open a case with F5 support (https://support.f5.com) and request your case be added to: \n BZ875909: Allow admin configuration of SameSite attribute on ASM system cookies set via Set-Cookie and Javascript Updates to the iRule can be found in the irules-toolbox repo on GitHub. This specific version is for v12+, but there is a pre-v12 version in the repo as well. Configuration options in the iRule: \n samesite_security: Set this to Strict, Lax or None. The description for these values is in the iRule quoted below:\n  # Set BIG-IP and app cookies found in Set-Cookie headers using this iRule to:\n #\n # none: Cookies will be sent in both first-party context and cross-origin requests; \n #   however, the value must be explicitly set to None and all browser requests must \n #   follow the HTTPS protocol and include the Secure attribute which requires an encrypted \n #   connection. Cookies that don't adhere to that requirement will be rejected.\n #   Both attributes are required together. If just None is specified without Secure or \n #   if the HTTPS protocol is not used, the third-party cookie will be rejected.\n #\n # lax: Cookies will be sent automatically only in a first-party context and with HTTP GET requests. \n #   SameSite cookies will be withheld on cross-site sub-requests, such as calls to load images or iframes, \n #   but will be sent when a user navigates to the URL from an external site, e.g., by following a link.\n #\n # strict: browser never sends cookies in requests to third party domains\n #\n #   Above definitions from: https://docs.microsoft.com/en-us/microsoftteams/platform/resources/samesite-cookie-update \n #\n # Note: this iRule does not modify cookies set on the client using Javascript or other methods outside of Set-Cookie headers!\n set samesite_security \"none\"\n \n\n Uncomment the next command if you're using this iRule on an APM virtual server with an access profile:  # Uncomment when using this iRule on an APM-enabled virtual server so the MRHSession cookies will be rewritten\n # The iRule cannot be saved on a virtual server with this option uncommented if there is no Access profile also enabled\n #ACCESS::restrict_irule_events disable\n \n Now define whether you want to rewrite all web application and BIG-IP cookies found in the Set-Cookie header(s). Set this to 1 to rewrite SameSite on all cookies in Set-Cookie headers. Else, if you want to define specifically named or prefixed cookies, set this option to 0, and proceed to the next two config options, #2 and #3  # 1. If you want to set SameSite on all BIG-IP and web application cookies for compliant user-agents, set this option to 1\n # Else, if you want to use the next two options for rewriting explicit named cookies or cookie prefixes, set this option to 0\n set set_samesite_on_all 0\n \n If you don't want to rewrite all cookies using option #1 above, you can choose to rewrite explicitly named cookies in option #2. Set the exact cookie names in the named_cookie list. Replace MRHSession and LastMRH_Session, which are examples of the cookies APM uses. If you do not want to rewrite exact cookie names, comment out the first example and uncomment the second example \"set named_cookies {}\"  # 2. Rewrite SameSite on specific named cookies\n #\n # To enable this, list the specific named cookies in the list command and comment out the second set command below\n # To disable this, set this variable to {} and comment out the first set command below\n set named_cookies [list {MRHSession} {LastMRH_Session}]\n #set named_cookies {}\n \n If you don't want to rewrite all cookies using option #1 above, you can choose to rewrite cookies using a prefix in option #3. Set the cookie name prefixes in the named_cookie list. Replace BIGipServer and TS, which are examples of the cookie prefixes LTM uses for persistence and ASM uses for session tracking, with the prefixes of the cookie names you want to rewrite. If you do not want to rewrite using cookie name prefixes, comment out the first example and uncomment the second example \"set named_cookies {}\"  # 3. Rewrite cookies with a prefix like BIG-IP persistence cookies\n # To enable this, list the cookie name prefixes in the list command and comment out the second set command below\n # To disable this, set this variable to {} and comment out the first set command below\n set cookie_prefixes [list {BIGipServer} {TS}]\n #set cookie_prefixes {}\n If your application or BIG-IP configuration sets cookies in the Set-Cookie headers with SameSite=None, incompatible user-agents will either reject the cookie or treat the cookie as if it was set for SameSite=Strict (https://www.chromium.org/updates/same-site/incompatible-clients). \n You can set remove_samesite_for_incompatible_user_agents to 1 to have this iRule remove SameSite attributes from all cookies sent to incompatible browsers.  # For incompatible user-agents, this iRule can remove the SameSite attribute from all cookies sent to the client via Set-Cookie headers\n # This is only necessary if BIG-IP or the web application being load balanced sets SameSite=None for all clients\n # set to 1 to enable, 0 to disable\n set remove_samesite_for_incompatible_user_agents 1\n \n While testing, you can set samesite_debug to 1 to test and get debug written to /var/log/ltm. Make sure to disable this option when you're done testing, before putting the iRule into production!  # Log debug to /var/log/ltm? 1=yes, 0=no\n # set to 0 after testing\n set samesite_debug 1\n \nThe full iRule: (Updates can be found in the irules-toolbox repo on GitHub. This specific version is for v12+, but there is a pre-v12 version in the repo as well.) # iRule: samesite_cookie_handling\n# author: Simon Kowallik\n# version: 1.3\n#\n# History: version - author - description\n#\t 1.0 - Simon Kowallik - initial version \n#\t 1.1 - Aaron Hooley - updated to add support for setting SameSite to Strict|Lax|None for BIG-IP and app cookies in Set-Cookie headers\n#\t\t\t\t\t\t\t\t\t\t\t- Add option to remove SameSite=None cookies for incompatible browsers\n#\t 1.2 - Aaron Hooley - Added option to rewrite all cookies without naming them explicitly or with prefixes\n#\t 1.3 - Aaron Hooley - set samesite_compatible to 0 by default instead of a null string \n#\n# What the iRule does:\n# Sets SameSite to Strict, Lax or None (and sets Secure when SameSite=None) for compatible user-agents\n# Optionally removes SameSite attribute from all cookies for incompatible user-agents so they'll handle cookies as if they were SameSite=None\n#\n# The iRule should work for:\n# - LTM for web app cookies and persistence cookies, except those that the web app sets via Javascript\n# - ASM for web app cookies and all ASM cookies except those that ASM or the web app sets via Javascript\n# - APM for web app cookies and all APM cookies you configure in the config variable $named_cookies, except those that the web app sets via Javascript\n#\n# The iRule requires BIG-IP v12 or greater to use the HTTP::cookie attribute command\n#\n# RFC \"standards\"\n# https://tools.ietf.org/html/draft-west-cookie-incrementalism-00\n# https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-05\n# further reading:\n# https://web.dev/samesite-cookies-explained/\n# https://web.dev/samesite-cookie-recipes/\n# https://blog.chromium.org/2019/10/developers-get-ready-for-new.html\n# https://www.chromium.org/updates/same-site\n# https://www.chromium.org/updates/same-site/incompatible-clients\n\nproc checkSameSiteCompatible {user_agent} {\n\t# Procedure to check if a user-agent supports SameSite=None on cookies\n\t#\n\t# usage: \n\t#\t\tset isSameSiteCompatible [call checkSameSiteCompatible {User-Agent-String}]\n\t#\n\t# check for incompatible user-agents: https://www.chromium.org/updates/same-site/incompatible-clients\n\t# based on https://devcentral.f5.com/s/articles/HTTP-cookie-SameSite-test-detection-of-browsers-with-incompatible-SameSite-None-handling\n\tswitch -glob -- [set user_agent [string tolower $user_agent]] {\n\t\t{*chrome/5[1-9].[0-9]*} -\n\t\t{*chrome/6[0-6].[0-9]*} -\n\t\t{*chromium/5[1-9].[0-9]*} -\n\t\t{*chromium/6[0-6].[0-9]*} -\n\t\t{*ip?*; cpu *os 12*applewebkit*} -\n\t\t{*macintosh;*mac os x 10_14*version*safari*} -\n\t\t{mozilla*macintosh;*mac os x 10_14*applewebkit*khtml, like gecko*} {\n\t\t\t# no samesite support\n\t\t\treturn 0\n\t\t}\n\t\t{*ucbrowser/*} {\n\t\t\tswitch -glob -- $user_agent {\n\t\t\t\t{*ucbrowser/[1-9].*} -\n\t\t\t\t{*ucbrowser/1[0-1].*} -\n\t\t\t\t{*ucbrowser/12.[0-9].*} -\n\t\t\t\t{*ucbrowser/12.1[0-1].*} -\n\t\t\t\t{*ucbrowser/12.12.*} -\n\t\t\t\t{*ucbrowser/12.13.[0-2]*} {\n\t\t\t\t\t# no samesite support\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t# If the current user-agent didn't match any known incompatible browser list, assume it can handle SameSite=None \n\treturn 1\n\n\t# CPU Cycles on Executing (>100k test runs)\n\t#\t Average\t\t\t\t\t\t\t\t 22000-42000 (fastest to slowest path)\n\t#\t Maximum\t\t\t\t\t\t\t\t214263\n\t#\t Minimum\t\t\t\t\t\t\t\t 13763\n}\n\n# the iRule code\nwhen CLIENT_ACCEPTED priority 100 {\n\n\t# Set BIG-IP and app cookies found in Set-Cookie headers using this iRule to:\n\t#\n\t# none: Cookies will be sent in both first-party context and cross-origin requests; \n\t#\t\thowever, the value must be explicitly set to None and all browser requests must \n\t#\t\tfollow the HTTPS protocol and include the Secure attribute which requires an encrypted \n\t#\t\tconnection. Cookies that don't adhere to that requirement will be rejected.\n\t#\t\tBoth attributes are required together. If just None is specified without Secure or \n\t#\t\tif the HTTPS protocol is not used, the third-party cookie will be rejected.\n\t#\n\t# lax: Cookies will be sent automatically only in a first-party context and with HTTP GET requests. \n\t#\t\tSameSite cookies will be withheld on cross-site sub-requests, such as calls to load images or iframes, \n\t#\t\tbut will be sent when a user navigates to the URL from an external site, e.g., by following a link.\n\t#\n\t# strict: browser never sends cookies in requests to third party domains\n\t#\n\t#\t\tAbove definitions from: https://docs.microsoft.com/en-us/microsoftteams/platform/resources/samesite-cookie-update \n\t#\n\t# Note: this iRule does not modify cookies set on the client using Javascript or other methods outside of Set-Cookie headers!\n\tset samesite_security \"none\"\n\n\t# Uncomment when using this iRule on an APM-enabled virtual server so the MRHSession cookies will be rewritten\n\t# The iRule cannot be saved on a virtual server with this option uncommented if there is no Access profile also enabled\n\t#ACCESS::restrict_irule_events disable\n\n\t# 1. If you want to set SameSite on all BIG-IP and web application cookies for compliant user-agents, set this option to 1\n\t# Else, if you want to use the next two options for rewriting explicit named cookies or cookie prefixes, set this option to 0\n\tset set_samesite_on_all 0\n\n\t# 2. Rewrite SameSite on specific named cookies\n\t#\n\t# To enable this, list the specific named cookies in the list command and comment out the second set command below\n\t# To disable this, set this variable to {} and comment out the first set command below\n\tset named_cookies [list {MRHSession} {LastMRH_Session}]\n\t#set named_cookies {}\n\n\t# 3. Rewrite cookies with a prefix like BIG-IP persistence cookies\n\t# To enable this, list the cookie name prefixes in the list command and comment out the second set command below\n\t# To disable this, set this variable to {} and comment out the first set command below\n\tset cookie_prefixes [list {BIGipServer} {TS}]\n\t#set cookie_prefixes {}\n\n\t# For incompatible user-agents, this iRule can remove the SameSite attribute from all cookies sent to the client via Set-Cookie headers\n\t# This is only necessary if BIG-IP or the web application being load balanced sets SameSite=None for all clients\n\t# set to 1 to enable, 0 to disable\n\tset remove_samesite_for_incompatible_user_agents 1\n\n\t# Log debug to /var/log/ltm? 1=yes, 0=no\n\t# set to 0 after testing\n\tset samesite_debug 1\n\n\t# You shouldn't have to make changes to configuration below here\n\n\t# Track the user-agent and whether it supports the SameSite cookie attribute\n\tset samesite_compatible 0\n\tset user_agent {}\n\n\tif { $samesite_debug }{\n\t\tset prefix \"[IP::client_addr]:[TCP::client_port]:\"\n\t\tlog local0. \"$prefix [string repeat \"=\" 40]\"\n\t\tlog local0. \"$prefix \\$samesite_security=$samesite_security; \\$set_samesite_on_all=$set_samesite_on_all; \\$named_cookies=$named_cookies; \\$cookie_prefixes=$cookie_prefixes, \\\n\t\t\t\\$remove_samesite_for_incompatible_user_agents=$remove_samesite_for_incompatible_user_agents\"\n\t}\n}\n\n# Run this test event before any other iRule HTTP_REQUEST events to set the User-Agent header value\n# Comment out this event when done testing user-agents\n#when HTTP_REQUEST priority 2 {\n\n\t# known compatible \n#\tHTTP::header replace user-agent {my compatible user agent string}\n\t# known INcompatible \n#\tHTTP::header replace user-agent {chrome/51.10}\n#}\n\n# Run this iRule before any other iRule HTTP_REQUEST events\nwhen HTTP_REQUEST priority 100 {\n\n\t# If we're setting samesite=none, we need to check the user-agent to see if it's compatible\n\tif { not [string equal -nocase $samesite_security \"none\"] }{\n\n\t\t# Not setting SameSite=None, so exit this event\n\t\treturn\n\t}\n\n\t# Inspect user-agent once per TCP session for higher performance if the user-agent hasn't changed\n\tif { $samesite_compatible == 0 or $user_agent ne [HTTP::header value {User-Agent}]} {\n\t\tset user_agent [HTTP::header value {User-Agent}]\n\t\tset samesite_compatible [call checkSameSiteCompatible $user_agent]\n\t\tif { $samesite_debug }{\n\t\t\tlog local0. \"$prefix Got \\$samesite_compatible=$samesite_compatible and saved current \\$user_agent: $user_agent\"\n\t\t}\n\t}\n}\n# Run this response event with priority 900 after all other iRules to parse the final cookies from the application and BIG-IP\nwhen HTTP_RESPONSE_RELEASE priority 900 {\n\n\t# Log the pre-existing Set-Cookie header values\n\tif { $samesite_debug }{ log local0. \"$prefix Set-Cookie value(s): [HTTP::header values {Set-Cookie}]\" }\n\n\tif { $samesite_compatible } {\n\t\t# user-agent is compatible with SameSite=None, set SameSite on matching cookies\n\n\t\tif { $set_samesite_on_all }{\n\t\t\tif { $samesite_debug }{ log local0. \"$prefix Setting SameSite=$samesite_security on all cookies and exiting\" }\n\t\t\tforeach cookie [HTTP::cookie names] {\n\n\t\t\t\tif { $samesite_debug }{ log local0. \"$prefix Set SameSite=$samesite_security on $cookie\" }\n\n\t\t\t\t# Remove any prior instances of SameSite attributes\n\t\t\t\tHTTP::cookie attribute $cookie remove {samesite} \n\n\t\t\t\t# Insert a new SameSite attribute\n\t\t\t\tHTTP::cookie attribute $cookie insert {samesite} $samesite_security\n\n\t\t\t\t# If samesite attribute is set to None, then the Secure flag must be set for browsers to accept the cookie\n\t\t\t\tif {[string equal -nocase $samesite_security \"none\"]} {\n\t\t\t\t\tHTTP::cookie secure $cookie enable\n\t\t\t\t}\n\t\t\t}\n\t\t\t# Exit this event in this iRule as we've already rewritten all cookies with SameSite\n\t\t\treturn\n\t\t}\n\t\t# Match named cookies exactly\n\t\tif { $named_cookies ne {} }{\n\t\t\tforeach cookie $named_cookies {\n\t\t\t\tif { [HTTP::cookie exists $cookie] } {\n\t\t\t\t\t# Remove any pre-existing SameSite attributes from this cookie as most clients use the most strict value if multiple instances are set\n\t\t\t\t\tHTTP::cookie attribute $cookie remove {SameSite}\n\n\t\t\t\t\t# Insert the SameSite attribute\n\t\t\t\t\tHTTP::cookie attribute $cookie insert {SameSite} $samesite_security\n\n\t\t\t\t\t# If samesite attribute is set to None, then the Secure flag must be set for browsers to accept the cookie\n\t\t\t\t\tif {[string equal -nocase $samesite_security \"none\"]} {\n\t\t\t\t\t\tHTTP::cookie secure $cookie enable\n\t\t\t\t\t}\n\t\t\t\tif { $samesite_debug }{ log local0. \"$prefix Matched explicitly named cookie $cookie, set SameSite=$samesite_security\" }\n\t\t\t\tif { $samesite_debug }{ log local0. \"$prefix \" }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t# Match a cookie prefix (cookie name starts with a prefix from the $cookie_prefixes list)\n\t\tif { $cookie_prefixes ne {} }{\n\t\t\tforeach cookie [HTTP::cookie names] {\n\t\t\t\tforeach cookie_prefix $cookie_prefixes {\n\t\t\t\t\tif { $cookie starts_with $cookie_prefix } {\n\t\t\t\t\t\t# Remove any pre-existing SameSite attributes from this cookie as most clients use the most strict value if multiple instances are set\n\t\t\t\t\t\tHTTP::cookie attribute $cookie remove {SameSite}\n\n\t\t\t\t\t\t# Insert the SameSite attribute\n\t\t\t\t\t\tHTTP::cookie attribute $cookie insert {SameSite} $samesite_security\n\n\t\t\t\t\t\t# If samesite attribute is set to None, then the Secure flag must be set for browsers to accept the cookie\n\t\t\t\t\t\tif { [string equal -nocase $samesite_security \"none\"] } {\n\t\t\t\t\t\t\tHTTP::cookie secure $cookie enable\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif { $samesite_debug }{ log local0. \"$prefix Matched prefixed cookie $cookie, with prefix $cookie_prefix, set SameSite=$samesite_security, breaking from loop\" }\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\n\t\t# User-agent can't handle SameSite=None\n\n\t\tif { $remove_samesite_for_incompatible_user_agents }{\n\n\t\t\t# User-agent can't handle SameSite=None, so remove SameSite attribute from all cookies if SameSite=None\n\t\t\t# This will use CPU cycles on BIG-IP so only enable it if you know BIG-IP or the web application is setting \n\t\t\t# SameSite=None for all clients including incompatible ones\n\t\t\tforeach cookie [HTTP::cookie names] {\n\t\t\t\tif { [string tolower [HTTP::cookie attribute $cookie value SameSite]] eq \"none\" }{\n\t\t\t\t\tHTTP::cookie attribute $cookie remove SameSite\n\t\t\t\t\tif { $samesite_debug }{ log local0. \"$prefix Removing SameSite for incompatible client from cookie=$cookie\" }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t# Log the modified Set-Cookie header values\n\tif { $samesite_debug }{ log local0. \"$prefix Final Set-Cookies: [HTTP::header values {Set-Cookie}]\" }\n}\n ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"19137","kudosSumWeight":9,"repliesCount":21,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:247263":{"__typename":"Conversation","id":"conversation:247263","topic":{"__typename":"ForumTopicMessage","uid":247263},"lastPostingActivityTime":"2019-05-23T07:57:39.000-07:00","solved":false},"User:user:153304":{"__typename":"User","uid":153304,"login":"A-P","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg?time=0"},"id":"user:153304"},"ForumTopicMessage:message:247263":{"__typename":"ForumTopicMessage","subject":"Why you have broken DevCentral?","conversation":{"__ref":"Conversation:conversation:247263"},"id":"message:247263","revisionNum":1,"uid":247263,"depth":0,"board":{"__ref":"Forum:board:TechnicalForum"},"author":{"__ref":"User:user:153304"},"metrics":{"__typename":"MessageMetrics","views":606},"postTime":"2019-05-23T01:24:31.000-07:00","lastPublishTime":"2019-05-23T01:24:31.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Why oh why have you broken DevCentral completely? None of the google hits to devcentral don't work anymore. None of the internal links in devcentral to other articles don't work. Fonts and the UI is horrible to read. Articles can't be opened to new tabs or windows, because links are not links but some javascript shit.   If I still manage to find some article, like this https://devcentral.f5.com/s/articles/irules-101-01-introduction-to-irules, I would like to be able to freaking READ THE CONTENT! Not some 404 page not found pages. Those I have read already too many times.   Please, bring the old working site back. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"640","kudosSumWeight":9,"repliesCount":7,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:282079":{"__typename":"Conversation","id":"conversation:282079","topic":{"__typename":"TkbTopicMessage","uid":282079},"lastPostingActivityTime":"2019-11-29T06:33:16.000-08:00","solved":false},"User:user:88719":{"__typename":"User","uid":88719,"login":"Jer-O","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg?time=0"},"id":"user:88719"},"TkbTopicMessage:message:282079":{"__typename":"TkbTopicMessage","subject":"Decrypting tcpdumps in Wireshark without key files (such as when FIPS is in use)","conversation":{"__ref":"Conversation:conversation:282079"},"id":"message:282079","revisionNum":1,"uid":282079,"depth":0,"board":{"__ref":"Tkb:board:codeshare"},"author":{"__ref":"User:user:88719"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":2004},"postTime":"2019-10-18T21:15:46.000-07:00","lastPublishTime":"2019-10-18T21:15:46.000-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Problem this snippet solves: This procedure allows you to decrypt a tcpdump made on the F5 without requiring access to the key file. Despite multiple F5 pages that claim to document this procedure, none of them worked for me. This solution includes the one working iRule I found, trimmed down to the essentials. The bash command is my own, which generates a file with all the required elements from the LTM log lines generated by the iRule, needed to decrypt the tcpdump in Wireshark 3.x. How to use this snippet: Upgrade Wireshark to Version 3+. Apply this iRule to the virtual server targeted by the tcpdump: rule sessionsecret {\n  when CLIENTSSL_HANDSHAKE {\n    log local0.debug \"CLIENT_RANDOM [SSL::clientrandom] [SSL::sessionsecret]\"\n    log local0.debug \"RSA Session-ID:[SSL::sessionid] Master-Key:[SSL::sessionsecret]\"\n  }\n  when SERVERSSL_HANDSHAKE {\n    log local0.debug \"CLIENT_RANDOM [SSL::clientrandom] [SSL::sessionsecret]\"\n    log local0.debug \"RSA Session-ID:[SSL::sessionid] Master-Key:[SSL::sessionsecret]\"\n  }\n}\n Run tcpdump on the F5 using all required hooks to grab both client and server traffic. tcpdump -vvni 0.0:nnnp -s0 host <ip> -w /var/tmp/`date +%F-%H%M`.pcap\n Conduct tests to reproduce the problem, then stop the tcpdump  (Control C) and remove the iRule from the virtual server. Collect the log lines into a file. cat /var/log/ltm | grep -oe \"RSA Session.*$\" -e \"CLIENT_RANDOM.*$\" > /var/tmp/pms\n Copy the .pcap and pms files to the computer running Wireshark 3+. Reference the \"pms\" file in \"Wireshark > Preferences > Protocols > TLS > (Pre)-Master-Secret log filename\" (hence the pms file name). Ensure that Wireshark > Analyze > Enabled Protocols > \"F5 Ethernet trailer\" and \"f5ethtrailer\" boxes are checked. Open the PCAP file in Wireshark; it will be decrypted. IMPORTANT TIP: Decrypting any large tcpdump brings a workstation to its knees, even to the point of running out of memory. A much better approach is to temporarily move the pms file, open the tcpdump in its default encrypted state, identify the problem areas using filters or F5 TCP conversation and export them to a much smaller file. Then you can move the pms file back to the expected location and decrypt the smaller file quickly and without significant impact on the CPU and memory. Code : Please refer to the \"How to use this Code Snippet\" section above. This procedure was successfully tested in 12.1.2 with a full-proxy virtual server. Tested this on version: 12.1","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2589","kudosSumWeight":8,"repliesCount":8,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:339530":{"__typename":"Conversation","id":"conversation:339530","topic":{"__typename":"TkbTopicMessage","uid":339530},"lastPostingActivityTime":"2025-03-19T13:50:42.084-07:00","solved":false},"User:user:82968":{"__typename":"User","uid":82968,"login":"Daniel_Wolf","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS04Mjk2OC01U0JzNUE?image-coordinates=0%2C815%2C2736%2C3551"},"id":"user:82968"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtSUlGRU9m?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtSUlGRU9m?revision=2","title":"image.jpg","associationType":"TEASER","width":368,"height":207,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtNXo5MVp1?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtNXo5MVp1?revision=2","title":"image.png","associationType":"BODY","width":787,"height":140,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtWm01aUhE?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtWm01aUhE?revision=2","title":"image.png","associationType":"BODY","width":819,"height":191,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtN2VWbVVD?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtN2VWbVVD?revision=2","title":"image.png","associationType":"BODY","width":819,"height":502,"altText":""},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtOENIdUFl?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtOENIdUFl?revision=2","title":"image.png","associationType":"BODY","width":829,"height":149,"altText":""},"TkbTopicMessage:message:339530":{"__typename":"TkbTopicMessage","subject":"Hey DeepSeek, can you write iRules?","conversation":{"__ref":"Conversation:conversation:339530"},"id":"message:339530","revisionNum":2,"uid":339530,"depth":0,"board":{"__ref":"Tkb:board:communityarticles"},"author":{"__ref":"User:user:82968"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":" ","introduction":"Revisiting my article from 2 years ago, I asked the same question to DeepSeek and gave it the same tasks that I gave ChatGPT back then.","metrics":{"__typename":"MessageMetrics","views":524},"postTime":"2025-02-03T11:10:19.912-08:00","lastPublishTime":"2025-02-03T11:42:30.588-08:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Back in time... \n Two years ago I asked ChatGPT whether it could write iRules. \n \n My conclusion after giving several tasks to ChatGPT was, that it can help with simple tasks but it cannot write intermediate or complex iRules. \n A new AI enters the competition \n Two weeks ago DeepSeek entered the scene and thought it's a good idea to ask it about its capabilities to write iRules. \n \n Spoiler alert: It cannot. \n New AI, same challenges \n I asked DeepSeek the same questions I asked ChatGPT 2 years ago. \n \n Write me an iRule that redirects HTTP to HTTPS \n Can you write an iRule that rewrites the host header in HTTP Request and Response? \n Can you write an iRule that will make a loadbalancing decision based on the HTTP Host header? \n Can you write an iRule that will make a loadbalancing decision based on the HTTP URI header? \n Write me an iRule that shows different ASM blocking pages based on the host header. The response should include the support ID. \n \n I stopped DeepSeek asking after the 5th question, DeepSeek is clueless about iRules. \n The answer I got from DeepSeek to 1, 2, 4 and 5 was always the same: \n when HTTP_REQUEST {\n # Check if the request is coming to port 80 (HTTP)\n if { [TCP::local_port] equals 80 } {\n # Construct the HTTPS URL\n set host [HTTP::host]\n set uri [HTTP::uri]\n set redirect_url \"https://${host}${uri}\"\n\n # Perform the redirect\n HTTP::redirect $redirect_url\n }\n} \n While this is a solution to task 1, it is plain wrong for 2, 3, 4 and 5. And even for the first challenge this is not a good. Actually it hurts me reading this iRule... \n Here for example task 2, just wrong... \n \n For task 3 DeepSeeks answer was: \n \n ChatGPT in 2025 \n For completeness, I gave the same tasks from 2023 to ChatGPT again. Briefly said - ChatGPT was OK in solving tasks 1-4 in 2023 and still is. It improved it's solution for task 5, the ASM iRule challenge. In 2023 I had two more tasks related to rewriting and redirecting. ChatGPT still failed to provide a solid solution for those two tasks. \n Conclusion \n DeepSeek cannot write iRules and ChatGPT still isn't good at it. Write your own iRules or ask the friendly people here on devcentral to help you. \n   ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"2264","kudosSumWeight":7,"repliesCount":13,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtSUlGRU9m?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtNXo5MVp1?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtWm01aUhE?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtN2VWbVVD?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0zMzk1MzAtOENIdUFl?revision=2\"}"}}],"totalCount":5,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Conversation:conversation:279235":{"__typename":"Conversation","id":"conversation:279235","topic":{"__typename":"TkbTopicMessage","uid":279235},"lastPostingActivityTime":"2024-09-26T08:06:08.676-07:00","solved":false},"User:user:216790":{"__typename":"User","uid":216790,"login":"Chase_Abbott","registrationData":{"__typename":"RegistrationData","status":null},"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/images/dS0yMTY3OTAtMTcxMjhpRTUxRjc5QkI2RjcxNDQ5OA"},"id":"user:216790"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTE0NjlpOTY3QjUzNEVCNDhCOUNGNQ?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTE0NjlpOTY3QjUzNEVCNDhCOUNGNQ?revision=15","title":"0151T000002diPlQAI.png","associationType":"BODY","width":1079,"height":658,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTEzMzdpRTQzNjdFQzM5RkI0ODg5Qg?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTEzMzdpRTQzNjdFQzM5RkI0ODg5Qg?revision=15","title":"0151T000002diPiQAI.png","associationType":"BODY","width":1079,"height":678,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTI3ODlpQ0REODBEODA2MDY0MjY4OQ?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTI3ODlpQ0REODBEODA2MDY0MjY4OQ?revision=15","title":"0151T000002diPjQAI.png","associationType":"BODY","width":1073,"height":678,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMzA3aUMzMjI3NTM3RTk2OThCQzE?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMzA3aUMzMjI3NTM3RTk2OThCQzE?revision=15","title":"0151T000002diPqQAI.png","associationType":"BODY","width":1073,"height":678,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTIxOThpRENBRjg3MTE3MjlDODgzNQ?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTIxOThpRENBRjg3MTE3MjlDODgzNQ?revision=15","title":"0151T000002diPkQAI.png","associationType":"BODY","width":1073,"height":678,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTM0OTRpMzdDNjYwRTI4MDlCOUI5NA?revision=15\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTM0OTRpMzdDNjYwRTI4MDlCOUI5NA?revision=15","title":"0151T000002diPvQAI.png","associationType":"BODY","width":1073,"height":678,"altText":null},"TkbTopicMessage:message:279235":{"__typename":"TkbTopicMessage","subject":"APM-DHCP Access Policy Example and Detailed Instructions","conversation":{"__ref":"Conversation:conversation:279235"},"id":"message:279235","revisionNum":15,"uid":279235,"depth":0,"board":{"__ref":"Tkb:board:TechnicalArticles"},"author":{"__ref":"User:user:216790"},"teaser@stripHtml({\"removeProcessingText\":true,\"truncateLength\":-1})":"","introduction":"","metrics":{"__typename":"MessageMetrics","views":15303},"postTime":"2019-08-28T00:13:49.000-07:00","lastPublishTime":"2023-09-07T21:17:23.785-07:00","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})":" Prepared with Mark Quevedo, F5 Principal Software Engineer May, 2020 \n Sectional Navigation links Important Version Notes   ||  Installation Guide   ||  What Is Going On Here?   ||  Parameters You Set In Your APM Access Policy   ||  Results of DHCP Request You Use in Access Policy   ||  Compatibility Tips and Troubleshooting \n Introduction \n Ordinarily you assign an IP address to the “inside end” of an APM Network Tunnel (full VPN connection) from an address Lease Pool, from a static list, or from an LDAP or RADIUS attribute. However, you may wish to assign an IP address you get from a DHCP server.  Perhaps the DHCP server manages all available client addresses.  Perhaps it handles dynamic DNS for named client workstations.  Or perhaps the DHCP server assigns certain users specific IP addresses (for security filtering).  Your DHCP server may even assign client DNS settings as well as IP addresses. APM lacks DHCP address assignment support (though f5's old Firepass VPN had it ).  We will use f5 iRules to enable DHCP with APM.  We will send data from APM session variables to the DHCP server so it can issue the “right” IP address to each VPN tunnel based on user identity, client info, etc. \n Important Version Notes \n Version v4c includes important improvements and bug fixes.  If you are using an older version, you should upgrade.  Just import the template with “Overwrite existing templates” checked, then “reconfigure” your APM-DHCP Application Service—you can simply click “Finished” without changing any options to update the iRules in place. \n Installation Guide \n First install the APM-DHCP iApp template (file DHCP_for_APM.tmpl). Create a new Application Service as shown (choose any name you wish).  Use the iApp to manage the APM-DHCP virtual servers you need.  (The iApp will also install necessary iRules.) You must define at least one APM-DHCP virtual server to receive and send DHCP packets.  Usually an APM-DHCP virtual server needs an IP address on the subnet on which you expect your DHCP server(s) to assign client addresses.  You may define additional APM-DHCP virtual servers to request IP addresses on additional subnets from DHCP.  However, if your DHCP server(s) support subnet-selection (see session.dhcp.subnet below) then you may only need a single APM-DHCP virtual server and it may use any IP that can talk to your DHCP server(s). It is best to give each APM-DHCP virtual server a unique IP address but you may use an BIG-IP Self IP as per SOL13896 .  Ensure your APM and APM-DHCP virtual servers are in the same TMOS Traffic Group (if that is impossible set TMOS db key tmm.sessiondb.match_ha_unit to false). Ensure that your APM-DHCP virtual server(s) and DHCP server(s) or relay(s) are reachable via the same BIG-IP route domain.  Specify in your IP addresses any non-zero route-domains you are using (e.g., “192.168.0.20%3”)—this is essential. \n (It is not mandatory to put your DHCP-related Access Policy Items into a Macro—but doing so makes the below screenshot less wide!) \n \n Into your APM Access Policy, following your Logon Page and AD Auth (or XYZ Auth) Items (etc.) but before any (Full/Advanced/simple) Resource Assign Item which assigns the Network Access Resource (VPN), insert both Machine Info and Windows Info Items.  (The Windows Info Item will not bother non-Windows clients.) Next insert a Variable Assign Item and name it “DHCP Setup”.  In your “DHCP Setup” Item, set any DHCP parameters (explained below) that you need as custom session variables.  You must set session.dhcp.servers.  You must also set session.dhcp.virtIP to the IP address of an APM-DHCP virtual server (either here or at some point before the “DHCP_Req” iRule Event Item). Finally, insert an iRule Event Item (name it “DHCP Req”) and set its Agent ID to DHCP_req.  Give it a Branch Rule “Got IP” using the expression “expr {[mcget {session.dhcp.address}] ne \"\"}” as illustrated. You must attach iRule ir-apm-policy-dhcp to your APM virtual server (the virtual server to which your clients connect). Neither the Machine Info Item nor the Windows Info Item is mandatory.  However, each gathers data which common DHCP servers want to see.  By default DHCP_req will send that data, when available, to your DHCP servers. See below for advanced options:  DHCP protocol settings, data sent to DHCP server(s), etc.  Typically your requests will include a user identifier from session.dhcp.subscriber_ID and client (machine or connection) identifiers from other parameters. The client IP address assigned by DHCP will appear in session.dhcp.address.  By default, the DHCP_req iRule Event handler will also copy that IP address into session.requested.clientip where the Network Access Resource will find it.  You may override that behavior by setting session.dhcp.copy2var (see below). Any “vendor-specific information” supplied by the DHCP server 1 (keyed by the value of session.dhcp.vendor_class) will appear in variables session.dhcp.vinfo.N  where N is a tag number (1-254).  You may assign meanings to tag numbers. Any DNS parameters the DHCP server supplies 2 are in session.dhcp.dns_servers and session.dhcp.dns_suffix.   If you want clients to use those DNS server(s) and/or DNS default search domain, put the name of every Network Access Resource your Access Policy may assign to the client into the session.dhcp.dns_na_list option. NB:  this solution does not renew DHCP address leases automatically, but it does release IP addresses obtained from DHCP after APM access sessions terminate. 3 Please configure your DHCP server(s) for an address lease time longer than your APM Maximum Session Timeout. \n Do not configure APM-DHCP virtual servers in different BIG-IP route domains so they share any part of a DHCP client IP range (address lease pool).  For example, do not use two different APM-DHCP virtual servers 10.1.5.2%6 and 10.1.5.2%8 with one DHCP client IP range 10.1.5.10—10.1.5.250.  APM-DHCP won’t recognize when two VPN sessions in different route domains get the same client IP from a non-route-domain-aware DHCP server, so it may not release their IP’s in proper sequence. This solution releases DHCP address leases for terminated APM sessions every once in a while, when a new connection comes in to the APM virtual server (because the BIG IP only executes the relevant iRules on the “event” of each new connection).  When traffic is sparse (say, in the middle of the night) there may be some delay in releasing addresses for dead sessions. If ever you think this solution isn’t working properly, be sure to check the BIG IP’s LTM log for warning and error messages. \n DHCP Setup (a Variable Assign Item) will look like: \n Put the IP of (one of) your APM-DHCP virtual server(s) in session.dhcp.virtIP. Your DHCP server list may contain addresses of DHCP servers or relays.  You may list a directed broadcast address (e.g., “172.16.11.255”) instead of server addresses but that will generate extra network chatter. To log information about DHCP processing for the current APM session you may set variable session.dhcp.debug to true (don’t leave it enabled when not debugging). \n DHCP Req (an iRule Event Item) will look like: \n \n Note DHCP Req branch rules: \n \n If DHCP fails, you may wish to warn the user: \n (It is not mandatory to Deny access after DHCP failure—you may substitute another address into session.requested.clientip or let the Network Access Resource use a Lease Pool.) \n What is going on here? \n We may send out DHCP request packets easily enough using iRules’ SIDEBAND functions, but it is difficult to collect DHCP replies using SIDEBAND. 4 Instead, we must set up a distinct LTM virtual server to receive DHCP replies on UDP port 67 at a fixed address. We tell the DHCP server(s) we are a DHCP relay device so replies will come back to us directly (no broadcasting). 5 For a nice explanation of the DHCP request process see http://technet.microsoft.com/en-us/library/cc940466.aspx. At this time, we support only IPv4, though adding IPv6 would require only toil, not genius. By default, a DHCP server will assign a client IP on the subnet where the DHCP relay device (that is, your APM-DHCP virtual server) is homed. For example, if your APM-DHCP virtual server’s address were 172.30.4.2/22 the DHCP server would typically lease out a client IP on subnet 172.30.4.0.  Moreover, the DHCP server will communicate directly with the relay-device IP so appropriate routes must exist and firewall rules must permit.  If you expect to assign client IP’s to APM tunnel endpoints on multiple subnets you may need multiple APM-DHCP virtual servers (one per subnet).  Alternatively, some but not all DHCP servers 6 support the rfc3011 “subnet selection” or rfc3527 “subnet/link-selection sub-option” so you can request a client IP on a specified subnet using a single APM-DHCP virtual server (relay device) IP which is not homed on the target subnet but which can communicate easily with the DHCP server(s):  see parameter session.dhcp.subnet below. \n NOTE: The subnet(s) on which APM Network Access (VPN) tunnels are homed need not exist on any actual VLAN so long as routes to any such subnet(s) lead to your APM (BIG-IP) device.  Suppose you wish to support 1000 simultaneous VPN connections and most of your corporate subnets are /24’s—but you don’t want to set up four subnets for VPN users.  You could define a virtual subnet—say, 172.30.4.0/22—tell your DHCP server(s) to assign addresses from 172.30.4.3 thru 172.30.7.254 to clients, put an APM-DHCP virtual server on 172.30.4.2, and so long as your Layer-3 network knows that your APM BIG-IP is the gateway to 172.30.4.0/22, you’re golden. \n When an APM Access Policy wants an IP address from DHCP, it will first set some parameters into APM session variables (especially the IP address(es) of one or more DHCP server(s)) using a Variable Assign Item, then use an iRule Event Item to invoke iRule Agent DHCP_req in ir apm policy dhcp.  DHCP_req will send DHCPDISCOVERY packets to the specified DHCP server(s).  The DHCP server(s) will reply to those packets via the APM-DHCP virtual-server, to which iRule ir apm dhcp must be attached.  That iRule will finish the 4-packet DHCP handshake to lease an IP address. DHCP_req handles timeouts/retransmissions and copies the client IP address assigned by the DHCP server into APM session variables for the Access Policy to use. We use the APM Session-ID as the DHCP transaction-ID XID and also (by default) in the value of chaddr to avert collisions and facilitate log tracing. \n Parameters You Set In Your APM Access Policy \n Required Parameters \n \n \n \n session.dhcp.virtIP \n \n \n IP address of an APM-DHCP virtual-server (on UDP port 67) with iRule ir-apm-dhcp. \n This IP must be reachable from your DHCP server(s). \n A DHCP server will usually assign a client IP on the same subnet as this IP, though you may be able to override that by setting session.dhcp.subnet. \n You may create APM-DHCP virtual servers on different subnets, then set session.dhcp.virtIP in your Access Policy (or branch) to any one of them as a way to request a client IP on a particular subnet. \n No default. \n Examples (“Custom Expression” format):  expr {\"172.16.10.245\"} or expr {\"192.0.2.7%15\"} \n \n \n \n \n session.dhcp.servers \n \n \n A TCL list of one or more IP addresses for DHCP servers (or DHCP relays, such as a nearby IP router). \n When requesting a client IP address, DHCP packets will be sent to every server on this list. \n NB:  IP broadcast addresses like 10.0.7.255 may be specified but it is better to list specific servers (or relays). \n Default: none. \n Examples (“Custom Expression” format):\n \n expr {[list \"10.0.5.20\" \"10.0.7.20\"]}  or \n expr {[list \"172.30.1.20%5\"]} \n \n \n \n \n \n \n \n Optional Parameters (including some DHCP Options) \n NOTE:  when you leave a parameter undefined or empty, a suitable value from the APM session environment may be substituted (see details below).  The defaults produce good results in most cases.  Unless otherwise noted, set parameters as Text values.  To exclude a parameter entirely set its Text value to '' [two ASCII single-quotes] (equivalent to Custom Expression return {''} ).  White-space and single-quotes are trimmed from the ends of parameter values, so '' indicates a nil value. It is best to put “Machine Info” and “Windows Info” Items into your Access Policy ahead of your iRule Event “DHCP_req” Item (Windows Info is not available for Mac clients beginning at version 15.1.5 as they are no longer considered safe). \n \n \n \n session.dhcp.debug \n \n \n Set to 1 or “true” to log DHCP-processing details for the current APM session. \n Default:  false. \n \n \n \n \n session.dhcp.firepass \n \n \n Leave this undefined or empty (or set to “false”) to use APM defaults (better in nearly all cases). \n Set to “true” to activate “Firepass mode” which alters the default values of several other options to make DHCP messages from this Access Policy resemble messages from the old F5 Firepass product. \n \n \n \n \n session.dhcp.copy2var \n \n \n Leave this undefined or empty (the default) and the client IP address from DHCP will be copied into the Access Policy session variable session.requested.clientip, thereby setting the Network Access (VPN) tunnel’s inside IP address.  To override the default, name another session variable here or set this to (Text) '' to avert copying the IP address to any variable. \n \n \n \n \n session.dhcp.dns_na_list \n \n \n To set the client's DNS server(s) and/or DNS default search domain from DHCP, put here a Custom Expression TCL list of the name(s) of the Network Access Resource(s) you may assign to the client session. \n Default:  none. \n Example:  expr {[list \"/Common/NA\" \"/Common/alt-NA\"]} \n \n \n \n \n session.dhcp.broadcast \n \n \n Set to “true” to set the DHCP broadcast flag (you almost certainly should not use this). \n \n \n \n \n session.dhcp.vendor_class Option 60 \n \n \n A short string (32 characters max) identifying your VPN server. \n Default: “f5 APM”. \n Based on this value the DHCP server may send data to session.dhcp.vinfo.N (see below). \n \n \n \n \n session.dhcp.user_class Option 77 \n \n \n A Custom Expression TCL list of strings by which the DHCP server may recognize the class of the client device (e.g., “kiosk”). \n Default:  none (do not put '' here). \n Example:  expr {[list \"mobile\" \"tablet\"]} \n \n \n \n \n session.dhcp.client_ID Option 61 \n \n \n A unique identifier for the remote client device. Microsoft Windows DHCP servers expect a representation of the MAC address of the client's primary NIC. \n If left undefined or empty the primary MAC address discovered by the Access Policy Machine Info Item (if any) will be used. \n If no value is set and no Machine Info is available then no client_ID will be sent and the DHCP server will distinguish clients by APM-assigned ephemeral addresses (in session.dhcp.hwcode). \n If you supply a client_ID value you may specify a special code, a MAC address, a binary string, or a text string. \n Set the special code “NONE” (or '') to avoid sending any client_ID, whether Machine Info is available or not. \n Set the special code “XIDMAC” to send a unique MAC address for each APM VPN session—that will satisfy DHCP servers desiring client_ID‘s while averting IP collisions due to conflicting Machine Info MAC’s like Apple Mac Pro’s sometimes provide. \n A value containing twelve hexadecimal digits, possibly separated by hyphens or colons into six groups of two or by periods into three groups of four, will be encoded as a MAC address. \n Values consisting only of hexadecimal digits, of any length other than twelve hexits, will be encoded as a binary string. \n A value which contains chars other than [0-9A-Fa-f] and doesn't seem to be a MAC address will be encoded as a text string. \n You may enclose a text string in ASCII single-quotes (') to avert interpretation as hex/binary (the quotes are not part of the text value). \n On the wire, MAC-addresses and text-strings will be prefixed by type codes 0x01 and 0x00 respectively; if you specify a binary string (in hex format) you must include any needed codes.  \n Default:  client MAC from Machine Info, otherwise none. \n Example (Text value): “08-00-2b-2e-d8-5e”. \n \n \n \n \n session.dhcp.hostname Option 12  \n \n \n A hostname for the client. \n If left undefined or empty, the short computer name discovered by the APM Access Policy Windows Info Item (if any) will be used. \n \n \n \n \n session.dhcp.subscriber_ID Sub-option 6 of Option 82  \n \n \n An identifier for the VPN user. \n If undefined or empty, the value of APM session variable session.logon.last.username will be used (generally the user's UID or SAMAccountName). \n \n \n \n \n session.dhcp.circuit_ID Sub-option 1 of Option 82 \n \n \n An identifier for the “circuit” or network endpoint to which client connected. \n If left undefined or empty, the IP address of the (current) APM virtual server will be used. \n \n \n \n \n session.dhcp.remote_ID Sub-option 2 of Option 82 \n \n \n An identifier for the client's end of the connection. \n If left undefined or empty, the client’s IP address + port will be used. \n \n \n \n \n session.dhcp.subnet Option 118 Sub-option 5 of Option 82 \n \n \n The address (e.g., 172.16.99.0) of the IP subnet on which you desire a client address. \n With this option you may home session.dhcp.virtIP on another (more convenient) subnet.  MS Windows Server 2016 added support for this but some other DHCP servers still lack support. \n Default: none. \n \n \n \n \n session.dhcp.hwcode \n \n \n Controls content of BOOTP htype, hlen, and chaddr fields. \n If left undefined or empty, a per-session value optimal in most situations will be used (asserting that chaddr, a copy of XID, identifies a “serial line”). \n If your DHCP server will not accept the default, you may set this to “MAC” and chaddr will be a locally-administered Ethernet MAC (embedding XID). \n When neither of those work you may force any value you wish by concatenating hexadecimal digits setting the value of htype (2 hexits) and chaddr (a string of 0–32 hexits).  E.g., a 6-octet Ethernet address resembles “01400c2925ea88”. \n Most useful in the last case is the MAC address of session.dhcp.virtIP (i.e., a specific BIG-IP MAC) since broken DHCP servers may send Layer 2 packets directly to that address. \n \n \n \n \n \n   \n Results of DHCP Request For Use In Access Policy \n session.dhcp.address  <-- client IP address assigned by DHCP! session.dhcp.message session.dhcp.server, session.dhcp.relay session.dhcp.expires, session.dhcp.issued session.dhcp.lease, session.dhcp.rebind, session.dhcp.renew session.dhcp.vinfo.N session.dhcp.dns_servers, session.dhcp.dns_suffix session.dhcp.xid, session.dhcp.hex_client_id, session.dhcp.hwx If a DHCP request succeeds the client IP address appears in session.dhcp.address. If that is empty look in session.dhcp.message for an error message. The IP address of the DHCP server which issued (or refused) the client IP is in session.dhcp.server (if session.dhcp.relay differs then DHCP messages were relayed). Lease expiration time is in session.dhcp.expires.  Variables session.dhcp.{lease, rebind, renew} indicate the duration of the address lease, plus the rebind and renew times, in seconds relative to the clock value in session.dhcp.issued (issued time). See session.dhcp.vinfo.N  where N is tag number for Option 43 vendor-specific information. If the DHCP server sends client DNS server(s) and/or default search domain, those appear in session.dhcp.dns_servers and/or session.dhcp.dns_suffix. To assist in log analysis and debugging, session.dhcp.xid contains the XID code used in the DHCP request.  The client_ID value (if any) sent to the DHCP server(s) is in session.dhcp.hex_client_id.  The DHCP request’s htype and chaddr values (in hex) are concatenated in session.dhcp.hwx. \n Compatibility Tips and Troubleshooting \n \n \n \n Concern \n Response \n \n \n \n \n \n My custom parameter seems to be ignored.  \n \n \n You should set most custom parameters as Text values (they may morph to Custom Expressions). \n \n \n \n My users with Apple Mac Pro’s sometimes get no DHCP IP or a conflicting one. \n \n A few Apple laptops sometimes give the Machine Info Item bogus MAC addresses.  Set session.dhcp.client_ID to “XIDMAC“ to use unique per-session identifiers for clients. \n \n \n \n After a VPN session ends, I expect the very next session to reuse the same DHCP IP but that doesn’t happen. \n Many DHCP servers cycle through all the client IP’s available for one subnet before reusing any.  Also, after a session ends APM-DHCP takes a few minutes to release its DHCP IP. \n \n \n When I test APM-DHCP with APM VE running on VMware Workstation, none of my sessions gets an IP from DHCP. \n VMware Workstation’s built-in DHCP server sends bogus DHCP packets.  Use another DHCP server for testing (Linux dhcpd(8) is cheap and reliable). \n \n \n I use BIG-IP route domains and I notice that some of my VPN clients are getting duplicate DHCP IP addresses. \n Decorate the IP addresses of your APM-DHCP virtual servers, both in the iApp and in session.dhcp.virtIP, with their route-domain ID’s in “percent notation” like “192.0.2.5%3”. \n \n \n APM-DHCP is not working. \n Double-check your configuration.  Look for errors in the LTM log.  Set session.dhcp.debug to “true” before trying to start a VPN session, then examine DHCP debugging messages in the LTM log to see if you can figure out the problem. \n \n \n Even after looking at debugging messages in the log I still don’t know why APM-DHCP is not working.  \n Run “tcpdump –ne -i 0.0 -s0 port 67” to see where the DHCP handshake fails. Are DISCOVER packets sent? Do any DHCP servers reply with OFFER packets? Is a REQUEST sent to accept an OFFER? Does the DHCP server ACK that REQUEST? If you see an OFFER but no REQUEST, check for bogus multicast MAC addresses in the OFFER packet. If no OFFER follows DISCOVER, what does the DHCP server’s log show? Is there a valid zone/lease-pool for you? Check the network path for routing errors, hostile firewall rules, or DHCP relay issues. \n \n \n \n Endnotes \n \n In DHCP Option 43 (rfc2132). \n In DHCP Options 6 and 15 (rfc2132). \n Prior to version v3h, under certain circumstances with some DHCP servers, address-release delays could cause two active sessions to get the same IP address. \n And even more difficult using [listen], for those of you in the back of the room. \n A bug in some versions of VMware Workstation’s DHCP server makes this solution appear to fail. The broken DHCP server sends messages to DHCP relays in unicast IP packets encapsulated in broadcast MAC frames.  A normal BIG-IP virtual server will not receive such packets. \n As of Winter 2017 the ISC, Cisco, and MS Windows Server 2016 DHCP servers support the subnet/link selection options but older Windows Server and Infoblox DHCP servers do not. \n \n Supporting Files - Download attached ZIP File Here. ","body@stripHtml({\"removeProcessingText\":true,\"removeSpoilerMarkup\":true,\"removeTocMarkup\":true,\"truncateLength\":-1})@stringLength":"23414","kudosSumWeight":7,"repliesCount":61,"readOnly":false,"images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTE0NjlpOTY3QjUzNEVCNDhCOUNGNQ?revision=15\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTEzMzdpRTQzNjdFQzM5RkI0ODg5Qg?revision=15\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTI3ODlpQ0REODBEODA2MDY0MjY4OQ?revision=15\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDQ","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMzA3aUMzMjI3NTM3RTk2OThCQzE?revision=15\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDU","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTIxOThpRENBRjg3MTE3MjlDODgzNQ?revision=15\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMnwyLjF8b3wyNXxfTlZffDY","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yNzkyMzUtMTM0OTRpMzdDNjYwRTI4MDlCOUI5NA?revision=15\"}"}}],"totalCount":6,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"videos":{"__typename":"VideoConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/Navbar-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1743097583657","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1743097583657","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1743097583657","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1743097583657","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1743097583657","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1743097583657","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagSubscriptionAction-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagSubscriptionAction-1743097583657","value":{"success.follow.title":"Following Tag","success.unfollow.title":"Unfollowed Tag","success.follow.message.followAcrossCommunity":"You will be notified when this tag is used anywhere across the community","success.unfollowtag.message":"You will no longer be notified when this tag is used anywhere in this place","success.unfollowtagAcrossCommunity.message":"You will no longer be notified when this tag is used anywhere across the community","unexpected.error.title":"Error - Action Failed","unexpected.error.message":"An unidentified problem occurred during the action you took. Please try again later.","buttonTitle":"{isSubscribed, select, true {Unfollow} false {Follow} other{}}","unfollow":"Unfollow"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageListTabs-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageListTabs-1743097583657","value":{"mostKudoed":"{value, select, IDEA {Most Votes} other {Most Likes}}","mostReplies":"Most Replies","mostViewed":"Most Viewed","newest":"{value, select, IDEA {Newest Ideas} OCCASION {Newest Events} other {Newest Topics}}","newestOccasions":"Newest Events","mostRecent":"Most Recent","noReplies":"No Replies Yet","noSolutions":"No Solutions Yet","solutions":"Solutions","mostRecentUserContent":"Most Recent","trending":"Trending","draft":"Drafts","spam":"Spam","abuse":"Abuse","moderation":"Moderation","tags":"Tags","PAST":"Past","UPCOMING":"Upcoming","sortBymostRecent":"Sort By Most Recent","sortBymostRecentUserContent":"Sort By Most Recent","sortBymostKudoed":"Sort By Most Likes","sortBymostReplies":"Sort By Most Replies","sortBymostViewed":"Sort By Most Viewed","sortBynewest":"Sort By Newest Topics","sortBynewestOccasions":"Sort By Newest Events","otherTabs":" Messages list in the {tab} for {conversationStyle}","guides":"Guides","archives":"Archives"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1743097583657","value":{"title":"Query Handler"},"localOverride":false},"Category:category:top":{"__typename":"Category","id":"category:top","nodeType":"category"},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1743097583657","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/OverflowNav-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/OverflowNav-1743097583657","value":{"toggleText":"More"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewInline-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewInline-1743097583657","value":{"bylineAuthor":"{bylineAuthor}","bylineBoard":"{bylineBoard}","anonymous":"Anonymous","place":"Place {bylineBoard}","gotoParent":"Go to parent {name}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMore-1743097583657","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1743097583657","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1743097583657","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1743097583657","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1743097583657","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1743097583657","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1743097583657","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageUnreadCount-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageUnreadCount-1743097583657","value":{"unread":"{count} unread","comments":"{count, plural, one { unread comment} other{ unread comments}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageViewCount-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageViewCount-1743097583657","value":{"textTitle":"{count, plural,one {View} other{Views}}","views":"{count, plural, one{View} other{Views}}"},"localOverride":false},"CachedAsset:text:en_US-components/kudos/KudosCount-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/kudos/KudosCount-1743097583657","value":{"textTitle":"{count, plural,one {{messageType, select, IDEA{Vote} other{Like}}} other{{messageType, select, IDEA{Votes} other{Likes}}}}","likes":"{count, plural, one{like} other{likes}}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRepliesCount-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRepliesCount-1743097583657","value":{"textTitle":"{count, plural,one {{conversationStyle, select, IDEA{Comment} OCCASION{Comment} other{Reply}}} other{{conversationStyle, select, IDEA{Comments} OCCASION{Comments} other{Replies}}}}","comments":"{count, plural, one{Comment} other{Comments}}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1743097583657":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1743097583657","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false}}}},"page":"/tags/TagPage/TagPage","query":{"messages.widget.messagelistfornodebyrecentactivitywidget-tab-main-messages-list-for-tag-widget-0":"mostKudoed","tagName":"iRules"},"buildId":"q_bLpq2mflH0BeZigxpj6","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.2.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tags/TagsHeaderWidget/TagsHeaderWidget.tsx","./components/messages/MessageListForNodeByRecentActivityWidget/MessageListForNodeByRecentActivityWidget.tsx","./components/tags/TagSubscriptionAction/TagSubscriptionAction.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/ListGroup/ListGroup.tsx","./components/messages/MessageView/MessageView.tsx","./components/messages/MessageView/MessageViewInline/MessageViewInline.tsx","../shared/client/components/common/Pager/PagerLoadMore/PagerLoadMore.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}