<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://jasonrahm.ulitzer.com"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Latest News from Jason Rahm</title>
 <link>http://jasonrahm.ulitzer.com/</link>
 <description>Latest News from Jason Rahm</description>
 <language>en</language>
 <copyright>Copyright 2012 Ulitzer.com</copyright>
 <generator>Ulitzer.com</generator>
 <lastBuildDate>Thu, 17 May 2012 18:21:05 EDT</lastBuildDate>
 <docs>http://backend.userland.com/rss</docs>
 <ttl>360</ttl>
<item>
 <title>Come Join DevCentral for the Seattle DotNetNuke User Group Meeting</title>
 <link>http://jasonrahm.ulitzer.com/node/2153119</link>
 <description>&lt;p&gt;If you didn’t know, the &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; platform runs on DotNetNuke, the leading open source ASP.Net CMS. It’s a great development platform for turning out rich sites, and we’re excited to be hosting the next Seattle DNN User Group meeting next &lt;strong&gt;Wednesday, February 8th&lt;/strong&gt;, beginning at 6pm at 401 Elliot Ave West, Seattle, WA.&lt;/p&gt;  &lt;h3&gt;Agenda&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;6:00 - Arrive Sign in&lt;/li&gt;    &lt;li&gt;6:10 - Tour F5 facilities&lt;/li&gt;    &lt;li&gt;6:30 – Presentation Begins &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Steven – Introductions and DC/DNN Overview&lt;/li&gt;      &lt;li&gt;April – Managing a Community&lt;/li&gt;      &lt;li&gt;Jason – Overview of the infrastructure we run&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;7:20 – Q &amp;amp; A&lt;/li&gt;    &lt;li&gt;7:30 – Social Hour – &lt;a href=&quot;http://www.buckleysseattle.com&quot; target=&quot;_blank&quot;&gt;Buckley’s&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We’re super excited to be involved in this next DNN user group, hope to see you there!&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:42868e54-be3e-4364-bdf7-38307c7c4170&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/DotNetNuke&quot; rel=&quot;tag&quot;&gt;DotNetNuke&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/DNN&quot; rel=&quot;tag&quot;&gt;DNN&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Seattle+DNN+User+Group&quot; rel=&quot;tag&quot;&gt;Seattle DNN User Group&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Buckley&#039;s&quot; rel=&quot;tag&quot;&gt;Buckley&#039;s&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1104467.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/5nW70crQVt4&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2153119&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 02 Feb 2012 03:07:20 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2153119</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2153119#feedback</comments>
</item>
<item>
 <title>Juice-Jacking Revisited</title>
 <link>http://jasonrahm.ulitzer.com/node/2151144</link>
 <description>&lt;p&gt;It’s a crazy world out there. I ran (well, by “ran” I mean jogged slowly enough to pass the old ladies on the track) this morning at the YMCA, lifted weights for a little while, and then hit the elliptical for 20 minutes before heading home. My gym’s ellipticals have the Nike+ package where you can store your workouts on your iPhone/iPod, and without thinking I jacked in. Approximately 38 ms later (my internal meter is not calibrated)  I facepalmed and disconnected my iPhone in shame. Have I learned nothing?&lt;/p&gt;  &lt;p&gt;Turns out, after closer inspection, the cable was a standard cable plugged into a standard elliptical trainer, but I didn’t inspect it initially. I just trusted that everything was as it should be. &lt;a href=&quot;http://devcentral.f5.com/weblogs/jmichaels/archive/2011/12/22/building-a-security-mindset.aspx&quot; target=&quot;_blank&quot;&gt;Josh wrote about this trust back in December&lt;/a&gt;. This offense, of course, would be fine if it was my iPod, which holds nothing of value on it. But my iPhone? Well, it has quite a bit more I’d rather not share with Mr. or Mrs. Hacker. So what am I worried about?&lt;/p&gt;  &lt;p&gt;Juice-Jacking is another physical security attack vector. With smartphones battery charging capabilites tied also to the data access port, any maliciously minded individual could stand up a charging booth, offer it up for free, and the lambs would willingly head to the slaughter. As power surges into their batteries, their data surges into the hands of the enemy. Such was the case at DefCon this year, where at least 360 attendees, made acutely aware of connecting in any way to anything within a 2 mile radius of the conference, still powered up. Brian Krebs had a good &lt;a href=&quot;http://krebsonsecurity.com/2011/08/beware-of-juice-jacking/&quot; target=&quot;_blank&quot;&gt;post-DefCon write-up on Juice-Jacking&lt;/a&gt; you should check out. Be careful out there.&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dc87c8bb-dd19-40a9-81ac-557f9c133a2c&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Security&quot; rel=&quot;tag&quot;&gt;Security&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Juice-Jacking&quot; rel=&quot;tag&quot;&gt;Juice-Jacking&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Josh+Michaels&quot; rel=&quot;tag&quot;&gt;Josh Michaels&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1104460.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/tlA0UIWGCqs&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2151144&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 31 Jan 2012 03:22:09 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2151144</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2151144#feedback</comments>
</item>
<item>
 <title>Managing Ramcache Entries with Pycontrol</title>
 <link>http://jasonrahm.ulitzer.com/node/2124057</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;A DevCentral user posted a question in the forums asking for verification of an attribute on the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__RAMCacheKey.ashx&quot;&gt;RamCacheKey&lt;/a&gt; structure. The maximum_responses attribute should be a long integer. With his C# code, the maximum_responses returned from his iControl call is always double the setting. I fired up pycontrol to see if this was a bug, and in my pycontrol code, I received the expected responses. While he’s taking a look at his code and the .Net library he’s using, I took an interest in the ramcache methods as I have not messed with the Ramcache module much. In this article, I’ll build out a pycontrol script that will enable users to query/evict ramcache entries.&lt;/p&gt;
&lt;h3&gt;The Interface&lt;/h3&gt;
&lt;p&gt;The iControl interface for querying/evicting Ramcache entries is &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation.ashx&quot;&gt;RAMCacheInformation&lt;/a&gt;. The methods I’ll handle in the script are:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__get_ramcache_entry.ashx&quot;&gt;get_ramcache_entry&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__get_ramcache_entry_exact_match.ashx&quot;&gt;get_ramcache_entry_exact_match&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__evict_ramcache_entry_v2.ashx&quot;&gt;evict_ramcache_entry_v2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__evict_all_ramcache_entries.ashx&quot;&gt;evict_all_ramcache_entries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two more methods defined:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__get_version.ashx&quot;&gt;get_version&lt;/a&gt; – All interfaces have this method, not important to Ramcache function&lt;/li&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.LocalLB__RAMCacheInformation__evict_ramcache_entry.ashx&quot;&gt;get_ramcache_entry&lt;/a&gt; – Deprecated in favor of _v2 above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Preparing the BIG-IP&lt;/h3&gt;
&lt;p&gt;Beginning in v11, the ramcache configuration was removed from the http profile and moved into its own under Local Traffic-&amp;gt;Profiles-&amp;gt;Services-&amp;gt;Web Acceleration. I created a profile called lcache with a parent profile of optimized-caching, increasing the cache size to 25 MB and decreasing the max age to 3600 seconds for testing. I left all the other settings default.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;728b7cc7&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2012/Jan/Windows-Live-Writer-Managing-Ramcache-Entries-with-pycontrol_D58F-jan10_tt_1_2.png&quot;&gt;&lt;img width=&quot;644&quot; border=&quot;0&quot; height=&quot;394&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2012/Jan/Windows-Live-Writer-Managing-Ramcache-Entries-with-pycontrol_D58F-jan10_tt_1_thumb.png&quot; alt=&quot;jan10_tt_1&quot; title=&quot;jan10_tt_1&quot; style=&quot;background-image: none; border-right-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apply this profile to an http virtual and a pool member with some content and I’m ready to move to the iControl work.&lt;/p&gt;
&lt;h3&gt;Building the Script&lt;/h3&gt;
&lt;p&gt;Because there are multiple actions in this interface I want to address, I’ll use command line options to control the script flow:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Host – (-H) &lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;Required&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Username (-u) &lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;Required&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Get Entries (-g) &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;Profile Required&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/li&gt;
    &lt;li&gt;Get Exact Entry (-x) &lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;Profile, Host and URI required &lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(as a white-space separated list in quotes. Ex. “lcache 10.10.20.60 /images/img1.png”&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Evict Entry (-E) &lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;Profile, Host and partial URI required&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Evict Exact Entry (-X)&amp;#160; &lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;Profile, Host and URI required&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Evict All Entries (-A) &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;No arguments necessary, empties the ramcache&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that plan in place, I can configure the parser options, shown in the following code snippet:&lt;/p&gt;
&lt;pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  1:  from optparse &lt;span style=&quot;color: #0000ff&quot;&gt;import&lt;/span&gt; OptionParser
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  2:   
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  3:  parser = OptionParser()
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  4:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-H&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--host&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;host&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  5:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-u&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--user&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;uname&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  6:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-g&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--get&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;get&lt;/span&gt;&quot;, help=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Supply profile name&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  7:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-x&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--get_exact&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;get_exact&lt;/span&gt;&quot;, help=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Supply profile name, host, and URI&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  8:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-E&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--evict&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;evict_entry&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  9:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-X&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--evict_exact&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store&lt;/span&gt;&quot;, type=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;string&lt;/span&gt;&quot;, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;evict_exact&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 10:  parser.add_option(&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;-A&lt;/span&gt;&quot;, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;--evict_all&lt;/span&gt;&quot;, action=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;store_false&lt;/span&gt;&quot;, default=False, dest=&quot;&lt;span style=&quot;color: #8b0000&quot;&gt;evict_all&lt;/span&gt;&quot;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 11:  (options, args) = parser.parse_args()
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 12: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 13:  &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; (options.host is None) or (options.uname is None):
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 14:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;\n\tHost (-H) and username (-u) must be supplied, exiting...&lt;/span&gt;&quot;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 15:   &lt;span style=&quot;color: #0000ff&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: #0000ff&quot;&gt;exit&lt;/span&gt;()&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;Now that the options are in place, we need to act based on the options provided&lt;/p&gt;
&lt;pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  1:  &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; options.get is not None:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  2:   rce = getRAMCacheEntries(rc, options.get)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  3:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; rce
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  4: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  5:  elif options.get_exact is not None:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  6:   rce = getRAMCacheExactEntry(rc, options.get_exact)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  7:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; rce
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  8: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  9:  elif options.evict_entry is not None:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 10:   rce = evictRAMCacheEntry(rc, options.evict_entry)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 11:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; rce
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 12: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 13:  elif options.evict_exact is not None:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 14:   rce = evictRAMCacheExactEntry(rc, options.evict_exact)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 15:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; rce
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 16: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 17:  elif options.evict_all is not None:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 18:   rce = evictRAMCacheAllEntries(rc)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 19:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; rce
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 20: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 21:  &lt;span style=&quot;color: #0000ff&quot;&gt;else&lt;/span&gt;:
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 22:   &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;No options selected!&lt;/span&gt;&quot;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
 23:   &lt;span style=&quot;color: #0000ff&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: #0000ff&quot;&gt;exit&lt;/span&gt;()&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;In this code, I’m checking for the options and if none are set, I’m exiting. For each option, I’m calling a function to operate on that particular action. I’m passing the iControl object (see code below) and the argument list (“profile host uri”) as necessary to each function.&lt;/p&gt;
&lt;pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  1:  b = pc.BIGIP(
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  2:   hostname = options.host,
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  3:   username = options.uname,
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  4:   password = upass,
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  5:   fromurl = True,
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  6:   wsdls = [&#039;LocalLB.RAMCacheInformation&#039;]
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  7:  )
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  8: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  9:  rc = b.LocalLB.RAMCacheInformation&lt;/pre&gt;
&lt;/pre&gt;
&lt;pre&gt;
&amp;#160;&lt;/pre&gt;
&lt;p&gt;For all the functions except the one to handle evicting all ramcache entries, I need to create an object for the RamCacheKey structure. This is done in pycontrol with the typefactory. Once the structure is created, I just need to add the appropriate attributes as defined in the API: profile_name, host_name, uri, and maximum_responses. The first three are strings, the last is a long integer. So the code is very similar in each function:&lt;/p&gt;
&lt;pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  1:  rc_key=obj.typefactory.create(&#039;LocalLB.RAMCacheInformation.RAMCacheKey&#039;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  2: 
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  3:  key_attr = rc_info.&lt;span style=&quot;color: #0000ff&quot;&gt;split&lt;/span&gt;(&#039; &#039;)
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  4:  rc_key.profile_name = key_attr[0]
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  5:  rc_key.host_name = &#039;&#039;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  6:  rc_key.uri = &#039;&#039;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  7:  rc_key.maximum_responses = 100L&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;I split the arguments to get each attribute isolated, then assign as appropriate. For a general get, I only need the profile name so I set the host and uri to an empty string. I chose 100 as a max response just to pick something. Now that the structure is defined, I can make an iControl call, in this case, to get all ramcache entries, then I return those values from the function to the variable making the function call above.    &lt;/p&gt;
&lt;pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  1:  rc_entry = obj.get_ramcache_entry(keys=[rc_key])
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 11px&quot;&gt;
  2:  &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; rc_entry&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;So if I put all this together, I can issue this command at the command line, with the data below returned:&lt;/p&gt;
&lt;pre class=&quot;text&quot;&gt;
C:\Users\jrahm\PycharmProjects\pyControl_Scripts&amp;gt;python ramcache_manager.py -H 10.10.20.5 -u admin -g lcache
Please enter the password for user admin
Password:
[](LocalLB.RAMCacheInformation.RAMCacheEntry){
   profile_name = &quot;lcache&quot;
   host_name = &quot;10.10.20.60&quot;
   uri = &quot;/images/gnome-64.png&quot;
   vary_type = &quot;RAM_CACHE_VARY_NONE&quot;
   vary_count = 1
   hits = 0
   received = 1326237864
   last_sent = 1326237864
   expiration = 1326241060
   size = 4677
 }, (LocalLB.RAMCacheInformation.RAMCacheEntry){
   profile_name = &quot;lcache&quot;
   host_name = &quot;10.10.20.60&quot;
   uri = &quot;/images/ad_remoteauth_ssh_1.png&quot;
   vary_type = &quot;RAM_CACHE_VARY_NONE&quot;
   vary_count = 1
   hits = 0
   received = 1326237873
   last_sent = 1326237873
   expiration = 1326241069
   size = 16304
 }, (LocalLB.RAMCacheInformation.RAMCacheEntry){
   profile_name = &quot;lcache&quot;
   host_name = &quot;10.10.20.60&quot;
   uri = &quot;/images/ad_descr.png&quot;
   vary_type = &quot;RAM_CACHE_VARY_NONE&quot;
   vary_count = 1
   hits = 0
   received = 1326237818
   last_sent = 1326237818
   expiration = 1326241014
   size = 17942
 }[]&lt;/pre&gt;
&lt;p&gt;Now, if I want to evict one of those, I can change my options a little and try again, then do another query:&lt;/p&gt;
&lt;pre class=&quot;text&quot;&gt;
C:\Users\jrahm\PycharmProjects\pyControl_Scripts&amp;gt;python ramcache_manager.py -H 10.10.20.5 -u admin -E &quot;lcache 10.10.20.60 /images/ad_descr.png&quot;
Please enter the password for user admin
Password:
None

C:\Users\jrahm\PycharmProjects\pyControl_Scripts&amp;gt;python ramcache_manager.py -H 10.10.20.5 -u admin -g lcache
Please enter the password for user admin
Password:
[](LocalLB.RAMCacheInformation.RAMCacheEntry){
   profile_name = &quot;lcache&quot;
   host_name = &quot;10.10.20.60&quot;
   uri = &quot;/images/gnome-64.png&quot;
   vary_type = &quot;RAM_CACHE_VARY_NONE&quot;
   vary_count = 1
   hits = 0
   received = 1326237864
   last_sent = 1326237864
   expiration = 1326241060
   size = 4677
 }, (LocalLB.RAMCacheInformation.RAMCacheEntry){
   profile_name = &quot;lcache&quot;
   host_name = &quot;10.10.20.60&quot;
   uri = &quot;/images/ad_remoteauth_ssh_1.png&quot;
   vary_type = &quot;RAM_CACHE_VARY_NONE&quot;
   vary_count = 1
   hits = 0
   received = 1326237873
   last_sent = 1326237873
   expiration = 1326241069
   size = 16304
 }[]&lt;/pre&gt;
&lt;p&gt;You can see that the entry is now gone. And finally, If I evict all:&lt;/p&gt;
&lt;pre class=&quot;text&quot;&gt;
C:\Users\jrahm\PycharmProjects\pyControl_Scripts&amp;gt;python ramcache_manager.py -H 10.10.20.5 -u admin -A
Please enter the password for user admin
Password:
None

C:\Users\jrahm\PycharmProjects\pyControl_Scripts&amp;gt;python ramcache_manager.py -H 10.10.20.5 -u admin -g lcache
Please enter the password for user admin
Password:
[][]&lt;/pre&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;There is access to great power via the iControl interface of your BIG-IP. With just a few lines of code, you can manage the ramcache from the CLI. For the full script, please check out the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.pyControl-v2-RAMCache-Manager.ashx&quot;&gt;RAMCache Manager&lt;/a&gt; wiki page in the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iControl.CodeShare.ashx&quot;&gt;iControl codeshare&lt;/a&gt;. Happy Coding!&lt;/p&gt;
&lt;div style=&quot;clear:both;height:11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/3_cZaQb3L84&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2124057&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 10 Jan 2012 10:30:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2124057</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2124057#feedback</comments>
</item>
<item>
 <title>v11.1: DNS Blackhole with iRules</title>
 <link>http://jasonrahm.ulitzer.com/node/2112183</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;Back in October, I attended a &lt;a href=&quot;http://www.securitybsides.com/w/page/12194156/FrontPage&quot; target=&quot;_blank&quot;&gt;Security B-Sides&lt;/a&gt; event in Jefferson City (&lt;a href=&quot;/weblogs/jason/archive/2011/10/25/bsidesmo-wrap-up.aspx&quot; target=&quot;_blank&quot;&gt;review here&lt;/a&gt;). One of the presenters (@bethayoung) talked about poisoning the internal DNS intentionally for known purveyors of all things bad. I indicated in my write-up that I’d be detailing an F5-based solution, and whereas a few weeks has turned into a couple months, well, here we are. As much as I had hoped to get it all together on my own, F5er Hugh O’Donnell beat me to it, and did a fantastic job. F5er Lee Orrick also contributed to the solution and I’ll have more from him in a future article.&lt;/p&gt;
&lt;h3&gt;Conceptual Overview&lt;/h3&gt;
&lt;p&gt;Before jumping into the nuts and bolts, I’d like to describe the solution. First, consider normal operation: Joe Anonymous is surfing and hits a popular page that has been compromised. He hits a link for a cute video about puppies and rainbows and NOT SO FAST MY FRIEND! Instead of said cute puppies and rainbows video, he ends up with a nasty case of malware and his friendly neighborhood IT staff gets to spend some time remediating the damage—if it’s caught at all. See, DNS is if not the backbone of the internet, at least several of the vertebrae.&amp;#160; And it does its job very well. Asked and answered. Done. If you hit a link with a malicious domain, there’s a very very good chance your DNS server will have no safeguards in place, it’ll answer away. This is what a blackhole DNS solution is configured to overcome. The networking folks in the audience will be familiar with blackhole routing, and this is really no different a concept. When a user makes a query, the service inspects the destination, and if it matches a list of well known badness, it returns an address of an internal site where remediation or at least notification can take place. In either event, the request is not hitting the malicious destination, which protects user and organization. See Figure 1 for the flow detail.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:0a7dde54-4c45-48c4-b240-a084e9003a29&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_1-8x6.png&quot; title=&quot;Figure 1. DNS Blackhole Flow&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;c30503fb&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;576&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_1_7.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Building the Datagroup&lt;/h3&gt;
&lt;p&gt;As with iFiles in v11.1, datagroups can also be imported via the GUI and then referenced similarly. To import your blacklisted domains (there’s a big list here: &lt;a href=&quot;http://mirror1.malwaredomains.com/files/domains.txt&quot; target=&quot;_blank&quot;&gt;mirror1.malwaredomains.com&lt;/a&gt;), make sure your text editor is set for line feed terminator only (CR-LF won’t work) and use this format for each entry:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“.abbcp.cn” := “harmful”,&lt;/p&gt;
&lt;p&gt;“.3dglases-panasonic-tv.com” := “zeusv2”,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first field is the domain, and the second field is a type description. The first will match your traffic, the second is strictly for classification purposes and can be edited as necessary.&lt;/p&gt;
&lt;h3&gt;Intercepting the DNS Requests&lt;/h3&gt;
&lt;p&gt;This solution can be implemented with LTM or GTM, though if the latter, the iRule will still need to be attached to the virtual server associated with the wideIP instead of the wideIP itself. In this article, I’ll implement the LTM-based solution. As I’ll be utilizing the new DNS:: commands, a DNS profile will need to be attached to the virtual server as well as the iRule below. Note that the blackhole class (named appropriately Blackhole_Class in the iRule below) should be present on the system for this solution to work.&lt;/p&gt;
&lt;div style=&quot;border: 1px solid silver; text-align: left; padding: 4px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 20px 0px 10px; width: 97.5%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; max-height: 200px; font-size: 10pt; overflow: auto; cursor: text;&quot; id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Author:  Hugh O&#039;Donnell, F5 Consulting&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt; when RULE_INIT {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Set IPV4 address that is returned for Blackhole matches for A records&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::blackhole_reply_IPV4 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;10.10.20.50&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Set IPV6 address that is returned for Blackhole matches for AAAA records&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::blackhole_reply_IPV6 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;2001:19b8:101:2::f5f5:1d&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum7&quot;&gt;   7:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Set TTL used for all Blackhole replies&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum8&quot;&gt;   8:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::blackhole_ttl &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;300&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum9&quot;&gt;   9:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum10&quot;&gt;  10:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum11&quot;&gt;  11:&lt;/span&gt; when DNS_REQUEST {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum12&quot;&gt;  12:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# debugging statement see all questions and request details&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum13&quot;&gt;  13:&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log -noname local0. &quot;Client: [IP::client_addr] Question:[DNS::question name] Type:[DNS::question type] Class:[DNS::question class] Origin:[DNS::origin]&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum14&quot;&gt;  14:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum15&quot;&gt;  15:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Blackhole_Match is used to track when a Query matches the blackhole list&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum16&quot;&gt;  16:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Ensure it is always set to 0 or false at beginning of the DNS request&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum17&quot;&gt;  17:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; Blackhole_Match 0&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum18&quot;&gt;  18:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum19&quot;&gt;  19:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Blackhole_Type is used to track why this FQDN was added to the Blackhole_Class&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum20&quot;&gt;  20:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; Blackhole_Type &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum21&quot;&gt;  21:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum22&quot;&gt;  22:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# When the FQDN from the DNS Query is checked against the Blackhole class, the FQDN must start with a&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum23&quot;&gt;  23:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# period.  This ensures we match a FQDN and all names to the left of it.  This prevents against&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum24&quot;&gt;  24:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# malware that dynamically prepends characters to the domain name in order to bypass exact matches&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum25&quot;&gt;  25:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; {!([DNS::question name] == &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;.&quot;&lt;/span&gt;)} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum26&quot;&gt;  26:&lt;/span&gt;         &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; fqdn_name .[DNS::question name]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum27&quot;&gt;  27:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum28&quot;&gt;  28:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum29&quot;&gt;  29:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; { [class match $fqdn_name ends_with Blackhole_Class] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum30&quot;&gt;  30:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Client made a DNS request for a Blackhole site.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum31&quot;&gt;  31:&lt;/span&gt;         &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; Blackhole_Match 1&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum32&quot;&gt;  32:&lt;/span&gt;         &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; Blackhole_Type [class match -value $fqdn_name ends_with Blackhole_Class ]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum33&quot;&gt;  33:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum34&quot;&gt;  34:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Prevent processing by GTM, DNS Express, BIND and GTM Listener&#039;s pool. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum35&quot;&gt;  35:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Want to ensure we don&#039;t request a prohibited site and allow their server to identify or track the GTM source IP.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum36&quot;&gt;  36:&lt;/span&gt;         DNS::return&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum37&quot;&gt;  37:&lt;/span&gt;     }    &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum38&quot;&gt;  38:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum39&quot;&gt;  39:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum40&quot;&gt;  40:&lt;/span&gt; when DNS_RESPONSE {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum41&quot;&gt;  41:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# debugging statement to see all questions and request details&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum42&quot;&gt;  42:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log -noname local0. &quot;Request: $fqdn_name Answer: [DNS::answer] Origin:[DNS::origin] Status: [DNS::header rcode] Flags: RD [DNS::header rd] RA [DNS::header ra]&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum43&quot;&gt;  43:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum44&quot;&gt;  44:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; { $Blackhole_Match } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum45&quot;&gt;  45:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# This DNS request was for a Blackhole FQDN. Take different actions based on the request type.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum46&quot;&gt;  46:&lt;/span&gt;         &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;switch&lt;/span&gt; [DNS::question type] {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum47&quot;&gt;  47:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;A&quot;&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum48&quot;&gt;  48:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Clear out any DNS responses and insert the custom response.  RA header = recursive answer&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum49&quot;&gt;  49:&lt;/span&gt;                     DNS::answer clear&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum50&quot;&gt;  50:&lt;/span&gt;                     DNS::answer insert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;[DNS::question name]. $static::blackhole_ttl [DNS::question class] [DNS::question type] $static::blackhole_reply_IPV4&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum51&quot;&gt;  51:&lt;/span&gt;                     DNS::header ra &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum52&quot;&gt;  52:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum53&quot;&gt;  53:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log example:  Apr  3 14:54:23 local/tmm info tmm[4694]:&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum54&quot;&gt;  54:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#     Blackhole: 10.1.1.148#4902 requested foo.com query type: A class IN A-response: 10.1.1.60&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum55&quot;&gt;  55:&lt;/span&gt;                     log -noname local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Blackhole: [IP::client_addr]#[UDP::client_port] requested [DNS::question name] query type: [DNS::question type] class [DNS::question class] A-response: $static::blackhole_reply_IPV4 BH type: $Blackhole_Type&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum56&quot;&gt;  56:&lt;/span&gt;                     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum57&quot;&gt;  57:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;AAAA&quot;&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum58&quot;&gt;  58:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Clear out any DNS responses and insert the custom response.  RA header = recursive answer&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum59&quot;&gt;  59:&lt;/span&gt;                     DNS::answer clear&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum60&quot;&gt;  60:&lt;/span&gt;                     DNS::answer insert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;[DNS::question name]. $static::blackhole_ttl [DNS::question class] [DNS::question type] $static::blackhole_reply_IPV6&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum61&quot;&gt;  61:&lt;/span&gt;                     DNS::header ra &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum62&quot;&gt;  62:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum63&quot;&gt;  63:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log example:  Apr  3 14:54:23 local/tmm info tmm[4694]:&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum64&quot;&gt;  64:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#     Blackhole: 10.1.1.148#4902 requested foo.com query type: A class IN AAAA-response: 2001:19b8:101:2::f5f5:1d&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum65&quot;&gt;  65:&lt;/span&gt;                     log -noname local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Blackhole: [IP::client_addr]#[UDP::client_port] requested [DNS::question name] query type: [DNS::question type] class [DNS::question class] AAAA-response: $static::blackhole_reply_IPV6 BH type: $Blackhole_Type&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum66&quot;&gt;  66:&lt;/span&gt;                     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum67&quot;&gt;  67:&lt;/span&gt;             &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;default&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum68&quot;&gt;  68:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# For other record types, e.g. MX, NS, TXT, etc, provide a blank NOERROR response&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum69&quot;&gt;  69:&lt;/span&gt;                     DNS::last_act reject&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum70&quot;&gt;  70:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum71&quot;&gt;  71:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log example:  Apr  3 14:54:23 local/tmm info tmm[4694]:&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum72&quot;&gt;  72:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#     Blackhole: 10.1.1.148#4902 requested foo.com query type: A class IN unable to respond&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum73&quot;&gt;  73:&lt;/span&gt;                     log -noname local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Blackhole: [IP::client_addr]#[UDP::client_port] requested [DNS::question name] query type: [DNS::question type] class [DNS::question class] unable to respond  BH type: $Blackhole_Type&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum74&quot;&gt;  74:&lt;/span&gt;                     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum75&quot;&gt;  75:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum76&quot;&gt;  76:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum77&quot;&gt;  77:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(96, 96, 96);&quot; id=&quot;lnum78&quot;&gt;  78:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This iRule handles the DNS request, responding on behalf of GTM or any DNS servers being load balanced by LTM. And since we’re handling the blackhole site, we can serve that up as well from an iRule on an HTTP virtual server.&lt;/p&gt;
&lt;h3&gt;Serving the Remediation Page&lt;/h3&gt;
&lt;p&gt;The remediation page can be as simple as a text message indicating malware, or it can be a little more complex to show the category of the problem site as well as provide some contact information. The iRule below is an example of the latter.&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot; style=&quot;border: 1px solid silver; text-align: left; padding: 4px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 20px 0px 10px; width: 97.5%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; max-height: 200px; font-size: 10pt; overflow: auto; cursor: text;&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Author: Hugh O’Donnell, F5 Consulting&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt; when HTTP_REQUEST {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# the static HTML pages include the logo that is referenced in HTML as corp-logo.gif&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# intercept requests for this and reply with the image that is stored in an iFile defined in RULE_INIT below&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; {[HTTP::uri] ends_with &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;/_maintenance-page/corp-logo.png&quot;&lt;/span&gt; } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Present&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;        HTTP::respond 200 content $static::corp_logo&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt;     } &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Request for Blackhole webpage.  Identify what type of block was in place&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  13:&lt;/span&gt;         &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;switch&lt;/span&gt; -glob [class match -value &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;.]HTTP::host[&quot;&lt;/span&gt; ends_with Blackhole_Class ] {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  14:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;virus&quot;&lt;/span&gt;     { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; block_reason &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Virus site&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum15&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  15:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;phishing&quot;&lt;/span&gt;     { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; block_reason &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Phishing site&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum16&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  16:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;generic&quot;&lt;/span&gt;     { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; block_reason &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Unacceptable Usage&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum17&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  17:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;default&lt;/span&gt;     { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; block_reason &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Denied Per Policy - Other Sites&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum18&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum19&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  19:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum20&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  20:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Log details about the blackhole request to the remote syslog server&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum21&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  21:&lt;/span&gt;         log -noname local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Blackhole: From [IP::client_addr]:[TCP::client_port] \&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum22&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  22:&lt;/span&gt;           to [IP::local_addr]:[TCP::local_port], [HTTP::request_num], \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum23&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  23:&lt;/span&gt;           [HTTP::method],[HTTP::uri],[HTTP::version], [HTTP::host],  [HTTP::header value Referer], \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum24&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  24:&lt;/span&gt;           [HTTP::header User-Agent], [HTTP::header names],[HTTP::cookie names], BH category: $block_reason,&quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum25&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  25:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum26&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  26:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Send an HTML page to the user.  The page is defined in the RULE_INIT event below&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum27&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  27:&lt;/span&gt;         HTTP::respond 200 content &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;$static::block_page [HTTP::host][HTTP::uri] $static::after_url $block_reason $static::after_block_reason &quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum28&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  28:&lt;/span&gt;     }   &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum29&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  29:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum30&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  30:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum31&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  31:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum32&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  32:&lt;/span&gt; when RULE_INIT {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum33&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  33:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# load the logo that was stored as an iFile&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum34&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  34:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::corp_logo [ifile get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;/Common/f5ball&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum35&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  35:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum36&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  36:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Beginning of the block page&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum37&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  37:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::block_page &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum38&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  38:&lt;/span&gt;         &amp;lt;html lang=\&quot;en_US\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum39&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  39:&lt;/span&gt;         &amp;lt;head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum40&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  40:&lt;/span&gt;         &amp;lt;title&amp;gt;Web Access Denied - Enterprise Network Operations Center&amp;lt;/title&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum41&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  41:&lt;/span&gt;         &amp;lt;meta http-equiv=\&quot;Content-Type\&quot; content=\&quot;text/html; charset=us-ascii\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum42&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  42:&lt;/span&gt;         &amp;lt;meta http-equiv=\&quot;CACHE-CONTROL\&quot; content=\&quot;NO-CACHE\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum43&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  43:&lt;/span&gt;         &amp;lt;meta http-equiv=\&quot;PRAGMA\&quot; content=\&quot;NO-CACHE\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum44&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  44:&lt;/span&gt;         &amp;lt;meta http-equiv=\&quot;EXPIRES\&quot; content=\&quot;Mon, 22 Jul 2002 11:12:01 GMT\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum45&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  45:&lt;/span&gt;         &amp;lt;style&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum46&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  46:&lt;/span&gt;         &amp;lt;!--&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum47&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  47:&lt;/span&gt;         .mainbody {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum48&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  48:&lt;/span&gt;             background-color: #C0C0C0;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum49&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  49:&lt;/span&gt;             color: #000000;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum50&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  50:&lt;/span&gt;             font-family: Verdana, Geneva, sans-serif;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum51&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  51:&lt;/span&gt;             font-size: 12px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum52&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  52:&lt;/span&gt;             margin: 0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum53&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  53:&lt;/span&gt;             padding: 20px 0px 20px 0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum54&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  54:&lt;/span&gt;             position: relative;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum55&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  55:&lt;/span&gt;             text-align: center;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum56&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  56:&lt;/span&gt;             width: 100%;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum57&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  57:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum58&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  58:&lt;/span&gt;         .bdywrpr {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum59&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  59:&lt;/span&gt;             width:996px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum60&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  60:&lt;/span&gt;             height:auto;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum61&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  61:&lt;/span&gt;             text-align:left;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum62&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  62:&lt;/span&gt;             margin:0 auto; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum63&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  63:&lt;/span&gt;             z-index:1;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum64&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  64:&lt;/span&gt;             position: relative;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum65&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  65:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum66&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  66:&lt;/span&gt;         #banner-wrapper {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum67&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  67:&lt;/span&gt;             width: 950px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum68&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  68:&lt;/span&gt;             padding: 0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum69&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  69:&lt;/span&gt;             margin: 0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum70&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  70:&lt;/span&gt;             overflow:hidden;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum71&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  71:&lt;/span&gt;             background-color: #FFFFFF;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum72&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  72:&lt;/span&gt;             background-repeat: no-repeat;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum73&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  73:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum74&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  74:&lt;/span&gt;         #banner-image {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum75&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  75:&lt;/span&gt;             float: left;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum76&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  76:&lt;/span&gt;             margin-left: auto;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum77&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  77:&lt;/span&gt;             margin-right: auto;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum78&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  78:&lt;/span&gt;             padding: 3px 0px 2px 7px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum79&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  79:&lt;/span&gt;             width: 950px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum80&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  80:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum81&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  81:&lt;/span&gt;         #textbody {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum82&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  82:&lt;/span&gt;             background-color: #FFFFFF;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum83&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  83:&lt;/span&gt;             color: #000000;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum84&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  84:&lt;/span&gt;             font-family: Verdana, Geneva, sans-serif;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum85&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  85:&lt;/span&gt;             font-size: 13px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum86&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  86:&lt;/span&gt;             width: 950px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum87&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  87:&lt;/span&gt;             padding:0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum88&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  88:&lt;/span&gt;             text-align:justify;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum89&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  89:&lt;/span&gt;             margin: 0px;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum90&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  90:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum91&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  91:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum92&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  92:&lt;/span&gt;         --&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum93&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  93:&lt;/span&gt;         &amp;lt;/style&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum94&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  94:&lt;/span&gt;         &amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum95&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  95:&lt;/span&gt;         &amp;lt;body class=\&quot;mainbody\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum96&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  96:&lt;/span&gt;         &amp;lt;div class=\&quot;bdywrpr\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum97&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  97:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum98&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  98:&lt;/span&gt;                    &amp;lt;div id=\&quot;banner-wrapper\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum99&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  99:&lt;/span&gt;                         &amp;lt;!-- BANNER --&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum100&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 100:&lt;/span&gt;                         &amp;lt;div id=\&quot;banner-image\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum101&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 101:&lt;/span&gt;                              &amp;lt;center&amp;gt;&amp;lt;img src=\&quot;/_maintenance-page/corp-logo.png\&quot; alt=\&quot;Enterprise Network Operations Center\&quot;&amp;gt;&amp;lt;/center&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum102&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 102:&lt;/span&gt;                         &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum103&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 103:&lt;/span&gt;                     &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum104&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 104:&lt;/span&gt;                     &amp;lt;div id=\&quot;textbody\&quot;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum105&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 105:&lt;/span&gt;                     &amp;lt;table border=\&quot;0\&quot; cellpadding=\&quot;40\&quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum106&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 106:&lt;/span&gt;                         &amp;lt;center&amp;gt;&amp;lt;p style=\&quot;font-size:18px\&quot;&amp;gt;&amp;lt;b&amp;gt;Access has been denied.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; URL: &quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum107&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 107:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum108&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 108:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::after_url &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;/p&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;br&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum109&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 109:&lt;/span&gt;                     Your request was denied because it is blacklisted in DNS. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum110&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 110:&lt;/span&gt;                     Blacklist category: &quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum111&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 111:&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum112&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 112:&lt;/span&gt;     &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; static::after_block_reason &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum113&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 113:&lt;/span&gt;                     &amp;lt;p&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum114&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 114:&lt;/span&gt;                     The Internet Gateways are for official use only. Misuse violates policy.&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum115&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 115:&lt;/span&gt;                     If you believe that this site is categorized incorrectly, and that you have a valid business&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum116&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 116:&lt;/span&gt;                     reason for access to this site please contact your manager for approval&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum117&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 117:&lt;/span&gt;                     and the Enterprise Network Operations Center via&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum118&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 118:&lt;/span&gt;                     &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum119&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 119:&lt;/span&gt;                     E-mail: &amp;lt;a href=\&quot;mailto:enoc@example.com\&quot;&amp;gt;enoc@example.com&amp;lt;/a&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum120&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 120:&lt;/span&gt;                     Please use the Web Access Request Form and include a business justification.&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum121&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 121:&lt;/span&gt;                     &amp;amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum122&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 122:&lt;/span&gt;                     Only e-mail that originates from valid internal e-mail addresses will be processed. &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum123&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 123:&lt;/span&gt;                     If you do not have a valid e-mail address, your manager will need to submit a request on your behalf.&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum124&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 124:&lt;/span&gt;                     &amp;lt;/center&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum125&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 125:&lt;/span&gt;                     &amp;lt;p&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum126&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 126:&lt;/span&gt;                     &amp;lt;font size=-1&amp;gt;&amp;lt;i&amp;gt;Generated by bigip1.f5.com.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum127&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 127:&lt;/span&gt;                 &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum128&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 128:&lt;/span&gt;                 &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum129&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 129:&lt;/span&gt;             &amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum130&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 130:&lt;/span&gt;             &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum131&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 131:&lt;/span&gt;         &quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum132&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 132:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that the remediation page references an iFile for a logo. For details on configuring iFiles, please &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086514/v111ndashExternal-File-Access-from-iRules-via-iFiles.aspx&quot; target=&quot;_blank&quot;&gt;reference my article on iFiles&lt;/a&gt;. Also note that in addition to the client getting a heads-up notification of malfeasance, the visit is logged so other processes, individuals can act on the information.&lt;/p&gt;
&lt;h3&gt;The Results&lt;/h3&gt;
&lt;p&gt;First, our DNS query and response. Rather than test out a real well-known bad site, I added espn.com to my blacklist so if I forgot a step and leaked through to the real site I wouldn’t compromise anything. The response from my DNS virtual server is shown in Figure 2 below.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:070e4303-e43d-40d2-9ada-9c314082daf7&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_4-8x6.png&quot; title=&quot;Figure 2. DNS Response&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;c30503fb&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;309&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_4_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can see that the address matches the address set in the iRule as our blackhole IPv4 address. Also, the log information from that DNS query:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dec 28 15:35:08 tmm info tmm[6883]: Blackhole: 10.10.20.251#57714 requested espn.com query type: A class IN A-response: 10.10.20.50 BH type: sports&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next, the resulting remediation page in my browser (Figure 3):&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:27197dcb-3312-4429-acf0-3d200fca3bc6&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_3-8x6.png&quot; title=&quot;Figure 3. Remediation Page&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;c30503fb&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;530&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-46a8d1cc6880_92A9-dnsblackhole_3_2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;And finally, the log entry from the HTTP request:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Dec 28 15:35:08 tmm info tmm[6883]: Blackhole: From 10.10.20.251:32447 to 10.10.20.50:80, 1, GET,/,1.1, espn.com, , Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7, Host Connection User-Agent Accept Accept-Encoding Accept-Language Accept-Charset,, BH category: Denied Per Policy - Other Sites,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This is a wicked application of iRules with new DNS and file handling features delivered in v11.1. If you wanted to take it even further, you could use &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086484/v11-iRules-Intro-to-Sideband-Connections.aspx&quot; target=&quot;_blank&quot;&gt;sideband connections&lt;/a&gt; and reference an external list instead of a datagroup that will need constant refreshing. The GTM version of this solution is documented in the wiki: &lt;a href=&quot;/wiki/iRules.DNS_Blackhole.ashx&quot;&gt;http://devcentral.f5.com/wiki/iRules.DNS_Blackhole.ashx&lt;/a&gt;. If you’re curious about the DNS commands used in the iRule above, I’ll be discussing them in my next tech tip, so check back soon!&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/7DvQuLoyefE&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2112183&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 28 Dec 2011 09:06:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2112183</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2112183#feedback</comments>
</item>
<item>
 <title>v11.1&amp;ndash;Add Signatures or Checksums to iRules via an iApp</title>
 <link>http://jasonrahm.ulitzer.com/node/2106314</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;iApps, introduced in v11, have a primary function in controlling the object creation and management for an application delivered by BIG-IP. As discussed previously, however, anything that can be accomplished in TMSH can be done in an iApp, so what better way to quickly generate checksums on iRules than via an iApp. New in v11.1, you can add either a checksum or a digital signature to an iRule (but not both). For iRules that have been signed or had a checksum applied, there will be a line immediately following the final line of code (the last closing curly brace):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;#Checksum&lt;/p&gt;
&lt;p&gt;definition-checksum &amp;lt;checksum&amp;gt;&lt;/p&gt;
&lt;p&gt;#Signature&lt;/p&gt;
&lt;p&gt;definition-signature &amp;lt;signature&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The GUI iRules listing will show the verification status of each iRule (see below in Figure 1):&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:840baaca-1973-461a-8675-839e88040c60&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 1. iRules Verification Status&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_verification_status-8x6.png&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;365&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_verification_status_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Note that the iRules that are F5 Verified are signed in-house by F5 with the f5-irule certificate. The private key is not distributed with your BIG-IP installation. To sign your own iRules, create a certificate (self signed or otherwise) or just use one on your system. I’d recommend creating one specific for signing iRules so you can distribute amongst all the pairs that will receive iRules that need verification. For this exercise, I created a 10-yr self signed cert called iRulesSignature with throwaway common name and other details. To sign an iRule in the GUI, check the checkbox to the left of the iRule in the iRules listing and then click the Add Signature button at the bottom of the screen as shown in Figure 2.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e313d6f5-676c-44ca-9e62-7cbde94b3f06&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 2. Select iRule for Signing&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_sign_1-8x6.png&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;142&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_sign_1_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Select the appropriate key and then click the Add Signature button at the button of the screen as show in Figure 3.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:71085182-56dc-4cdf-8da0-d4365c72d46e&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 3. Apply Signature&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_sign_2-8x6.png&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;548&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_sign_2_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The process is the same as in Figure 2 for the checksum, though the Add Checksum button should be selected instead. There is a pop-up window (see Figure 4 below) confirming the checksum, but no additional configuration parameters are presented before the checksum is applied.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:8a230571-bb23-4a12-8324-710773b4a7f2&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 4. Add a Checksum&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_checksum_1-8x6.png&quot;&gt;&lt;img width=&quot;420&quot; height=&quot;219&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_checksum_1_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A few quick notes before moving on.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;There is no remove signature or checksum button. To do this, just enter the iRule and remove the definition-&amp;lt;checksum|signature&amp;gt; line at the bottom of the iRule.&lt;/li&gt;
    &lt;li&gt;You can replace/overwrite checksums with checksums and signatures with signatures, but you can’t cross the streams. Attempting to apply a signature to an iRule with a checksum will fail (and vice versa). If you want to sign an iRule with a checksum, remove the checkum first.&lt;/li&gt;
    &lt;li&gt;You can add a checksum to multiple iRules concurrently, but signing multiple iRules in one pass is not currently supported.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Building the iApp&lt;/h2&gt;
&lt;p&gt;Now that the basics of iRules signatures and checksums have been addressed, I can build an iApp that will prompt a user to select checksum or signature, prompt for the key if signing, and then prompt for the iRules. The presentation layer (APL) code for this is below, followed by the result of this code in Figure 5 (checksum) and Figure 6 (signature).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;section genInfo {      &lt;br /&gt;
&amp;#160; choice sig_or_csum default &quot;Checksum&quot; { &quot;Checksum&quot;, &quot;Signature&quot; }       &lt;br /&gt;
&amp;#160; optional (sig_or_csum == &quot;Signature&quot;) {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; choice sigKey tcl {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set objs [tmsh::get_config /sys crypto key]       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach obj $objs {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; append results [tmsh::get_name $obj]       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; append results &quot;\n&quot;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return $results       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160; }       &lt;br /&gt;
&amp;#160; multichoice iRulesList tcl {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; set objs [tmsh::get_config /ltm rule]       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; foreach obj $objs {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; append results [tmsh::get_name $obj]       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; append results &quot;\n&quot;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; return $results       &lt;br /&gt;
&amp;#160; }       &lt;br /&gt;
}       &lt;br /&gt;
text {       &lt;br /&gt;
&amp;#160; genInfo &quot;Add Signature or Checksum to iRules&quot;       &lt;br /&gt;
&amp;#160; genInfo.sig_or_csum &quot;Please select Signature or Checksum.&quot;       &lt;br /&gt;
&amp;#160; genInfo.sigKey &quot;Please select the key for iRule signature.&quot;       &lt;br /&gt;
&amp;#160; genInfo.iRulesList &quot;Please select one or more iRules.&quot;       &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:78cd258f-dbeb-496e-809e-017f8a69fe89&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 5. APL Checksum Selection&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_apl_1-8x6.png&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;517&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_apl_1_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:98063394-16bc-4ea8-9217-fbab63075abf&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b31f573c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 6. APL Signature Selection&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_apl_2-8x6.png&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;565&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-Generate-iRule-Checksums-with_9775-irules_apl_2_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Now that the presentation layer is complete, all that remains is the tmsh scripting to take the information from the GUI and apply it to the system. The tmsh command to create the signature or checksum is&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh generate /ltm checksum|signature &amp;lt;rule&amp;gt;&amp;#160; [signing-key &amp;lt;key&amp;gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is easy in the shell, but in the scripting language there is not currently a tmsh::generate command, so I’ll need to use exec to call back into the shell as a workaround. With the exec command, every object separated by whitespace must be wrapped in quotes, as shown below in the implementation section of the iApp:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;if { $::genInfo__sig_or_csum == &quot;Checksum&quot; } {     &lt;br /&gt;
&amp;#160; foreach obj $::genInfo__iRulesList {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; #puts &quot;Checksum for $obj&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; exec &quot;tmsh&quot; &quot;generate&quot; &quot;ltm&quot; &quot;rule&quot; &quot;checksum&quot; $obj      &lt;br /&gt;
&amp;#160; }      &lt;br /&gt;
} elseif { $::genInfo__sig_or_csum == &quot;Signature&quot; } {      &lt;br /&gt;
&amp;#160; foreach obj $::genInfo__iRulesList {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; #puts &quot;Signature for $obj with key $::genInfo__sigKey&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; exec &quot;tmsh&quot; &quot;generate&quot; &quot;ltm&quot; &quot;rule&quot; &quot;signature&quot; $obj &quot;signing-key&quot; $::genInfo__sigKey      &lt;br /&gt;
&amp;#160; }      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I always start with puts instead of the actual execution of tmsh commands so I know what the presentation layer is actually passing to the implementation scripts. The output of puts is /var/tmp/scriptd.out. To make this iApp more complete, you could load the contents of each iRule and strip any previous signature or checksum before applying a new one. I’ll send the latest DevCentral t-shirt to the first submission with this enhancement. Until then, happy coding!&lt;/p&gt;
&lt;p&gt;This template is available in the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iApp.HomePage.ashx&quot;&gt;iApp wiki&lt;/a&gt;: &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iApp.Add-a-Signature-or-Checksum-to-Multiple-iRules.ashx&quot;&gt;Add a Signature or Checksum to Multiple iRules&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/JSZLAoqzkpA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2106314&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 19 Dec 2011 10:06:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2106314</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2106314#feedback</comments>
</item>
<item>
 <title>DNS Services Architecture</title>
 <link>http://jasonrahm.ulitzer.com/node/2104479</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;F5 has been in the DNS business for quite some time, beginning with the 3-DNS GSLB product introduced in 1998. While steadily growing the GSLB market through product advances, the platform is incredibly feature rich now, offering far more than GSLB services. Some of the other services added over the years (articles written on services in parentheses):&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Standard name services via BIND, as a fallback or as primary domain auth&lt;/li&gt;
    &lt;li&gt;Local SLB for DNS&lt;/li&gt;
    &lt;li&gt;DNSSEC (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2355/v101--Configuring-GTMs-DNS-Security-Extensions.aspx&quot; target=&quot;_blank&quot;&gt;Configuring GTM’s DNS Security Extensions&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;Quova geolocation data (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1082330/New-Geolocation-Capabilities-in-v101.aspx&quot; target=&quot;_blank&quot;&gt;New Geolocation Capabilities&lt;/a&gt;, &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086384/Heatmaps-iRules-Style-Part-4-Meaningful-numbers.aspx&quot; target=&quot;_blank&quot;&gt;Heatmaps&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;DNS Express (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086498/v11-DNS-Express-ndash-Part-1.aspx&quot; target=&quot;_blank&quot;&gt;DNS Express Part 1&lt;/a&gt;, &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086503/v11-DNS-Express-ndash-Part-2.aspx&quot; target=&quot;_blank&quot;&gt;DNS Express Part 2&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;IP Anycast&lt;/li&gt;
    &lt;li&gt;DNS 64&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the service offering has grown, the underlying architecture supporting DNS has changed as well to improve performance and scale. Through versions 10.2.x, GTM services were handled outside of TMM in Linux. That means that GTM prior to version 11 had no access to the multi-processor benefits of TMM. Screening mode was introduced in GTM version 10.2, which allowed GTM to load balance DNS services with limited LTM functions. Reference Figure 1 below.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c696045b-c06a-4159-a994-2ca4ead3c408&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_10_2-8x6.png&quot; title=&quot;Figure 1. BIG-IP 10.2 DNS Delivery Architecture&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;41d6d348&#039;})&quot;&gt;&lt;img width=&quot;680&quot; height=&quot;335&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_10_2_8.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;BIG-IP version 11 (see Figure 2 below) introduced a true DNS proxy running natively in TMM. Not only does this deliver a major performance improvement, TMM also understands the DNS traffic if the virtual has a DNS profile attached, it’s no longer just a packet. This means the queries/responses&amp;#160; must meet some minimum protocol sanity checks. The DNS proxy also enables (depending on profile configuration) the DNS iRules commands, DNS 64, DNS Express, etc.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:cbd7c030-6e4b-4d41-9c31-23ab1143a0f7&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_11_0-8x6.png&quot; title=&quot;Figure 2. BIG-IP 11.0 DNS Delivery Architecture&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;41d6d348&#039;})&quot;&gt;&lt;img width=&quot;680&quot; height=&quot;335&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_11_0_6.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The DNS profile options can be seen below in Figure 3. Notice you can enable the services that a particular virtual server will handle, and disable the remaining ones.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:30d2ac59-e9bc-4671-8180-0d99806c9fc9&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_profile-8x6.png&quot; title=&quot;Figure 3. DNS Profile&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;41d6d348&#039;})&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;425&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_profile_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Finally, in the most recent v11.1 release, the only change to the architecture was to move the server-side ingress iRules handling (the DNS_RESPONSE event) to the client side of the proxy. This was moved so that responses generated by GTM or DNS Express can be captured/acted upon.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c892c21d-79e3-4408-83c7-19d615e860ed&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_11_1-8x6.png&quot; title=&quot;Figure 4. BIG-IP 11.1 DNS Delivery Architecture&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;41d6d348&#039;})&quot;&gt;&lt;img width=&quot;660&quot; height=&quot;313&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-v11.1-DNS-Services-Architecture_9BA9-dns_11_1_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In my next article, I’ll delve into the DNS request/response handling workflows in version 11.1 and cover the new DNS iRules extensions.&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/OSC_Kl2aoYw&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2104479&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 16 Dec 2011 00:59:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2104479</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2104479#feedback</comments>
</item>
<item>
 <title>v11.1&amp;ndash;External File Access from iRules via iFiles</title>
 <link>http://jasonrahm.ulitzer.com/node/2095569</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;New in BIG-IP version 11.1 are iFiles, a feature that allows users to load files through tmsh or the GUI onto the BIG-IP which can be referenced from iRules. This has an immediate use case of supplanting several of our codeshare entries for sorry and/or maintenance pages delivered directly from the BIG-IP instead of redirecting to a server to handle those requests. In this tech tip, I’ll cover the command options, the GUI configuration, and finally offer up a maintenance page iRule referencing iFiles.&lt;/p&gt;
&lt;h3&gt;Planning the Maintenance Page&lt;/h3&gt;
&lt;p&gt;When serving up html pages from an iRule in a variable or a data-group, several things, such as encoding images and escaping special characters to prevent Tcl errors or unfortunate interpretations, must be considered. With iFiles, however, much (and potentially all) of that trouble is eliminated. For this maintenance page, I want to return an HTML5 canvas bouncing F5 ball (original script source can be found &lt;a target=&quot;_blank&quot; href=&quot;http://www.vectorlight.net/html5/tutorials/simple_animation.aspx&quot;&gt;here at vectorlight.net&lt;/a&gt;) to distract users during maintenance. So I’ll need two files, one image file for the F5 bouncing ball, and one text file for the html elements. The html text I’m using is below:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;html&amp;gt;&amp;lt;script&amp;gt;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var surface;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var happy;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var x = 50;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var y = 0;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var dirX = 1;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var dirY = 1;&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function drawCanvas() {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Get our Canvas element       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; surface = document.getElementById(&quot;myCanvas&quot;);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (surface.getContext) {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // If Canvas is supported, load the image       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; happy = new Image();       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; happy.onload = loadingComplete;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; happy.src = &quot;f5b_mini.png&quot;;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function loadingComplete(e) {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // When the image has loaded begin the loop       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setInterval(loop, 15);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function loop() {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Each loop we move the image by altering its x/y position       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Grab the context       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var surfaceContext = surface.getContext(&#039;2d&#039;);       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Draw the image       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; surfaceContext.drawImage(happy, x, y);&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x += dirX;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y += dirY;&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (x &amp;lt;= 0 || x &amp;gt; 500 - 18) {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dirX = -dirX;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (y &amp;lt;= 0 || y &amp;gt; 250 - 28) {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dirY = -dirY;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;body onload=&quot;drawCanvas();&quot;&amp;gt;      &lt;br /&gt;
&amp;#160; &amp;lt;center&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;h1&amp;gt;Hey there...&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;h2&amp;gt;Relax and be mesmerized by the F5 ball as we make some changes&amp;lt;/h2&amp;gt;&amp;lt;br&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;canvas id=&quot;myCanvas&quot; width=&quot;500&quot; height=&quot;250&quot;&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;Your browser doesn&#039;t support canvas.&amp;lt;/p&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/canvas&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;h2&amp;gt;We&#039;ll be back online shortly...the DevCentral team&amp;lt;/h2&amp;gt;       &lt;br /&gt;
&amp;#160; &amp;lt;/center&amp;gt;       &lt;br /&gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Creating the iFiles&lt;/h3&gt;
&lt;p&gt;Now that my page is ready, I can upload the files. This is done in System-&amp;gt;File Management-&amp;gt;iFile List-&amp;gt;Import:&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;59bf2d67&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_2_2.png&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;214&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_2_thumb.png&quot; title=&quot;iFile_import_2&quot; alt=&quot;iFile_import_2&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;59bf2d67&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_3_2.png&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;203&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_3_thumb.png&quot; title=&quot;iFile_import_3&quot; alt=&quot;iFile_import_3&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A couple quick notes on importing files. First, iFiles maximum size is 4M. Second, it’s probably a good idea to adopt a naming standard early in use of iFiles. I’m using &amp;lt;app_function|name_type&amp;gt;, but whatever works, right? Now that the files are on the system (default location: /config/filestore/files_d/Common_d/ifile_d), I need to create a reference for each of them under Local Traffic-&amp;gt;iRules-&amp;gt;iFile List. I’m just repeating the name I used for the iFile itself:&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;59bf2d67&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_4_2.png&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;161&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_4_thumb.png&quot; title=&quot;iFile_import_4&quot; alt=&quot;iFile_import_4&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;59bf2d67&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_5_2.png&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;164&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_5_thumb.png&quot; title=&quot;iFile_import_5&quot; alt=&quot;iFile_import_5&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The iFile Command Syntax&lt;/h3&gt;
&lt;p&gt;The complete syntax for the iFile command is below. For details on each command, please visit the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iRules.iFile.ashx&quot;&gt;iFile wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ifile get &amp;lt;iFile Name&amp;gt;     &lt;br /&gt;
ifile listall      &lt;br /&gt;
ifile attributes &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
ifile size &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
ifile last_updated_by &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
ifile last_update_time &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
ifile revision &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
ifile checksum &amp;lt;iFile Name&amp;gt;      &lt;br /&gt;
array set &amp;lt;variable&amp;gt; [ifile attributes &amp;lt;iFile Name&amp;gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Creating the iRule&lt;/h3&gt;
&lt;p&gt;Obviously the logic to serve up the maintenance page would need to be adjusted for a production environment, but for this example I’m just doing an HTTP::respond if the URL is “/”, and then I need a condition for the image as well. So what used to be a lot more work with encoding images and massaging javascript, with iFiles, I can just return the contents with no concerns utilizing the &lt;strong&gt;[ifile get &amp;lt;iFile Name&amp;gt;]&lt;/strong&gt; command. It really is that simple.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;when HTTP_REQUEST {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if { [HTTP::uri] eq &quot;/&quot; } {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HTTP::respond 200 content [ifile get testapp_index_txt]      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } elseif { [HTTP::uri] eq &quot;/f5b_mini.png&quot; } {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HTTP::respond 200 content [ifile get testapp_f5ball_img]      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } else { discard }      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Browsing to the virtual results in this page:&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;59bf2d67&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_7_2.png&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;406&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Dec/Windows-Live-Writer-8adccc80f267_C4B1-iFile_import_7_thumb.png&quot; title=&quot;iFile_import_7&quot; alt=&quot;iFile_import_7&quot; style=&quot;margin: 10px; display: inline;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I highlighted the maintenance page use case, but data served from external files will be useful for a large number of scenarios. Happy coding with the new iFiles feature delivered in BIG-IP v11.1.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/vYkm4BZf_Yo&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2095569&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 09 Dec 2011 07:46:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2095569</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2095569#feedback</comments>
</item>
<item>
 <title>BIG-IP Configuration Object Naming Conventions</title>
 <link>http://jasonrahm.ulitzer.com/node/2079349</link>
 <description>&lt;p&gt;George posted &lt;a href=&quot;http://devcentral.f5.com/weblogs/watkins/archive/2010/07/12/thoughts-on-hostname-nomenclature.aspx&quot; target=&quot;_blank&quot;&gt;an excellent blog on hostname nomenclature&lt;/a&gt; a while back, but something we haven’t discussed much in this space is a naming convention for the BIG-IP configuration objects. Last week, &lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/52/aft/2158823/showtab/groupforums/Default.aspx&quot; target=&quot;_blank&quot;&gt;DevCentral community user Deon posted a question&lt;/a&gt; on exactly that. Sometimes there are standards just for the sake of having one, but in most cases, and particularly in this case, having standards is a very good thing. Señor Forum, hoolio, and MVP hamish weighed in with some good advice.&lt;/p&gt;  &lt;p&gt;[app name]_[protocol]_[object type]&lt;/p&gt;  &lt;p&gt;Examples:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;http://www.example.com_http_vs&quot; title=&quot;www.example.com_http_vs&quot;&gt;www.example.com_http_vs&lt;/a&gt;      &lt;br /&gt;www.example.com_http_pool       &lt;br /&gt;www.example.com_http_monitor &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As hoolio pointed out in the forum, each object now has a description field, so the metadata capability is there to establish identifying information (knowledge base IDs, troubleshooting info, application owners), but having an object name that is quickly searchable and identifiable to operational staff is key. Hamish had a slight alternative format for virtuals:&lt;/p&gt;  &lt;p&gt;[fqdn]_[port]&lt;/p&gt;  &lt;p&gt;For network virtuals, I’ve always made the network part of the name, as hamish also recommends in his guidance:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;network VS&#039;s tend to be named net-net.num.dot.ed-masklen. e.g. net-0.0.0.0-0 is the default address. Where they conflict (e.g. two defaults depending on src clan, it gets an extra descriptor between net- and the ip address. e.g. net-wireless-0.0.0.0-0 (Default network VS for a wireless VLAN). I don&#039;t currently have any network VS&#039;s for specific ports. But they&#039;d be something like net-0.0.0.0-0-port &lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Your Turn&lt;/h2&gt;  &lt;p&gt;What standards do you use? Share in the comments section below, or post to the forum thread.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4b0d3988-d263-4723-b2df-5bff530cae3e&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Standards&quot; rel=&quot;tag&quot;&gt;Standards&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Nomenclature&quot; rel=&quot;tag&quot;&gt;Nomenclature&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP&quot; rel=&quot;tag&quot;&gt;BIG-IP&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/George+Watkins&quot; rel=&quot;tag&quot;&gt;George Watkins&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/hoolio&quot; rel=&quot;tag&quot;&gt;hoolio&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/hamish&quot; rel=&quot;tag&quot;&gt;hamish&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1102424.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/iLefO9P3x8o&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2079349&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 28 Nov 2011 10:19:02 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2079349</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2079349#feedback</comments>
</item>
<item>
 <title>Stop that F5 Key From Refreshing the Page</title>
 <link>http://jasonrahm.ulitzer.com/node/2068620</link>
 <description>&lt;p&gt;No, not “us” F5, the F5 key on the keyboard. You know, the one you hit relentlessly to refresh the page (well, the one I hit relentlessly during NFL games to update my fantasy football stats). Anyway, I was perusing the forums today, trying to catch up from a week attending our very excellent annual sales conference, and I noticed a thread that had to be shared.&lt;/p&gt;  &lt;h3&gt;The Question&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Is there a way of preventing users from using the F5 button to refresh a web page? – &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; user &lt;strong&gt;ringoseagull&lt;/strong&gt; (nice handle, btw!)&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;The Solution&lt;/h3&gt;  &lt;p&gt;F5er and very active forum patrolman &lt;strong&gt;nitass &lt;/strong&gt;posted back within 30 minutes with a solution, featuring iRules of course! We’ve seen javascript insert iRules before, but this is a pretty handy use case, so I thought I’d share.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;when HTTP_REQUEST {     &lt;br /&gt;  STREAM::disable      &lt;br /&gt;  if {[HTTP::version] eq &quot;1.1&quot;} {      &lt;br /&gt;    if { [HTTP::header is_keepalive] } {      &lt;br /&gt;      HTTP::header replace &quot;Connection&quot; &quot;Keep-Alive&quot;      &lt;br /&gt;    }      &lt;br /&gt;    HTTP::version 1.0      &lt;br /&gt;  }      &lt;br /&gt;}      &lt;br /&gt;when HTTP_RESPONSE {      &lt;br /&gt;  if {[HTTP::header Content-Type] starts_with &quot;text/&quot;} {      &lt;br /&gt;    STREAM::expression &quot;@&amp;lt;/\[Hh]\[Ee]\[Aa]\[Dd]&amp;gt;@&amp;lt;script language=javascript&amp;gt;function document.onkeydown() { if (event.keyCode==116) { event.keyCode=0; event.cancelBubble=true; return false; } }&amp;lt;/script&amp;gt;&amp;lt;/head&amp;gt;@&quot;      &lt;br /&gt;    STREAM::enable      &lt;br /&gt;  }      &lt;br /&gt;}      &lt;br /&gt;when STREAM_MATCHED {      &lt;br /&gt;  STREAM::disable      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This iRule uses the stream profile to find the head tag and insert the javascript necessary to control the F5 keycode behavior. Curl testing shows the javascript successfully delivered:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[root@ve1023:Active] config # curl -i &lt;a href=&quot;http://172.28.65.152&quot;&gt;http://172.28.65.152&lt;/a&gt;      &lt;br /&gt;HTTP/1.1 200 OK      &lt;br /&gt;Dat e: Fri, 11 Nov 2011 15:24:33 GMT      &lt;br /&gt;Server: Apache/2.2.3 (CentOS)      &lt;br /&gt;Last-Modified: Fri, 11 Nov 2011 14:48:14 GMT      &lt;br /&gt;ETag: &quot;4183e4-3e-9c564780&quot;      &lt;br /&gt;Accept-Ranges: bytes      &lt;br /&gt;Connection: close      &lt;br /&gt;Content-Type: text/html; charset=UTF-8&lt;/p&gt;    &lt;p&gt;&amp;lt;html&amp;gt;     &lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt;script language=javascript&amp;gt;function document.onkeydown() { if (event.keyCode==116) { event.keyCode=0; event.cancelBubble=true; return false; } }&amp;lt;/script&amp;gt;&amp;lt;/head&amp;gt;      &lt;br /&gt;&amp;lt;body&amp;gt;      &lt;br /&gt;This is 101 host.      &lt;br /&gt;&amp;lt;/body&amp;gt;      &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;    &lt;p&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Nice work, &lt;strong&gt;nitass&lt;/strong&gt;!&lt;/p&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/iRules.HomePage.ashx&quot;&gt;iRules Wiki Home - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/iRules.iRulesReference.ashx&quot;&gt;iRules Reference - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/iRules.STREAM__expression.ashx&quot;&gt;STREAM::expression - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/50/Default.aspx&quot;&gt;DevCentral Groups - iRules&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/122/iRules-101--01--Introduction-to-iRules.aspx&quot;&gt;iRules 101 - #01 - Introduction to iRules &amp;gt; DevCentral &amp;gt; Tech Tips ...&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0222a55c-caeb-408a-8651-1b5a1a7344de&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1100430.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/oaTbzwtsvfA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2068620&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 16 Nov 2011 09:08:23 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2068620</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2068620#feedback</comments>
</item>
<item>
 <title>v11: iRules Data Group Updates</title>
 <link>http://jasonrahm.ulitzer.com/node/2066474</link>
 <description>&lt;p&gt;Several months ago I wrote up the v10 formatting for internal and external datagroups: &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086448/iRules-Data-Group-Formatting-Rules.aspx&quot;&gt;iRules Data Group Formatting Rules&lt;/a&gt;. In v11, however, there is a change to the format of the internal data group and the data group reference to external class files (the formatting in the external class file itself is unchanged). The formatting rules in v11 for data groups more closely resembles the tmsh commands necessary to build the class at the CLI (these command attributes are masked if you are using the GUI). I’ll follow the same format as the original write-up in showing the various data group types. The format is the same among internal data group types. If there is no value associated with the key, there is a curly bracket pair trailing the key on the same line. If there is an associated value with a key, the curly bracket opens the value, followed by a newline with the keyword &lt;strong&gt;data&lt;/strong&gt; and the value, then another newline with the closing curly bracket. After the records are listed, the type is specified. For external data groups, the file name and the type are specified. If the filename is in /var/class, the path is omitted from the filename reference.&lt;/p&gt;
&lt;h3&gt;Address Data Groups&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;# Internal Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group internal addr_testclass {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; records {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 192.168.1.1/32 { }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 192.168.1.2/32 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;host 2&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 192.168.2.0/24 { }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 192.168.3.0/24 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;network 2&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type ip      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# External Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group external addr_testclass_ext {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; external-file-name addr_testclass.class      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type ip      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Integer Data Groups&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;# Internal Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group internal int_testclass {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; records {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;test 1&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;test 2&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type integer      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# External Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group external int_testclass_ext {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; external-file-name int_testclass      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type integer      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;String Data Groups&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;# Internal Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group internal str_testclass {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; records {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str1 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;value 1&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; str2 {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data &quot;value 2&quot;      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type string      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;# External Data Group&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ltm data-group external str_testclass_ext {     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; external-file-name str_testclass.class      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; type string      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/itcEfk9qmeI&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2066474&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 15 Nov 2011 07:32:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2066474</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2066474#feedback</comments>
</item>
<item>
 <title>iRule::ology&amp;ndash;SMTP Start TLS</title>
 <link>http://jasonrahm.ulitzer.com/node/2038192</link>
 <description>&lt;p&gt;F5er and DevCentral member natty76 wrote a few iRules a while back on interactive TLS session starting on the SMTP, IMAP, and POP3 protocols. A lot of the iRules can be understood from a flow perspective by reading the iRule top to bottom. This is not the case for these iRules. In this article, I’ll break down the SMTP communication context for the BIG-IP as middleman between client and server. I’ve saved the iRule as an image below so I reference line numbers as I go. The &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iRules.SMTP_Start_TLS.ashx&quot;&gt;SMTP iRule&lt;/a&gt; as well as the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iRules.POP3_IMAP_Start_TLS.ashx&quot;&gt;IMAP and POP3 iRules&lt;/a&gt; are available in the &lt;a target=&quot;_blank&quot; href=&quot;/wiki/iRules.CodeShare.ashx&quot;&gt;iRules Codeshare&lt;/a&gt;.&amp;#160;&amp;#160; Before digging into the iRule, the usage example in section six of &lt;a target=&quot;_blank&quot; href=&quot;http://tools.ietf.org/html/rfc2487&quot;&gt;RFC 2487&lt;/a&gt; is illustrated in the drawing below with the steps from our description to follow highlighted on each leg of the protocol exchange.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;f90093d4&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-iRuleologyTCPcollect-and-SMTP_87EF-starttls_flow_2.png&quot;&gt;&lt;img width=&quot;538&quot; height=&quot;768&quot; title=&quot;starttls_flow&quot; alt=&quot;starttls_flow&quot; style=&quot;display: inline;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-iRuleologyTCPcollect-and-SMTP_87EF-starttls_flow_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;The iRule&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;f90093d4&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-iRuleologyTCPcollect-and-SMTP_87EF-starttls_001_2.png&quot;&gt;&lt;img width=&quot;600&quot; height=&quot;432&quot; title=&quot;starttls_001&quot; alt=&quot;starttls_001&quot; style=&quot;margin: 10px; display: inline;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-iRuleologyTCPcollect-and-SMTP_87EF-starttls_001_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;The process starts with the standard TCP 3-way handshake, which results in the CLIENT_ACCEPTED event firing (line 2). At this point I don’t know if the client is requiring TLS yet, so ehlo is set to 0 and SSL is disabled (set by default in the virtual server profile.)&lt;/li&gt;
    &lt;li&gt;With the SMTP protocol, the client initiates the connection but it’s the server that sends data first. This means that after the client connection occurs, we need to collect data on the server side of the connection, which is performed here when the SERVER_CONNECTED event fires (lines 6-7).&lt;/li&gt;
    &lt;li&gt;SERVER_DATA fires when the server sends (and has been collected by the collect in line 7). The &lt;strong&gt;if&lt;/strong&gt; will not match yet as the ehlo variable is still zero with no client data to match. The data is also released here (line 29)&lt;/li&gt;
    &lt;li&gt;I do however, want to catch when the client sends data, so I do a clientside collect. (line 30)&lt;/li&gt;
    &lt;li&gt;When the client does send data, the CLIENT_DATA event fires (line 9). The payload is de-cased and stored in the variable lcpayload (line 10) and then is checked for the existence of the ehlo command (line 11).&lt;/li&gt;
    &lt;li&gt;If the ehlo was present, I collect on the serverside&amp;#160; again (looking for TLS support messages) and make sure I set ehlo to true (lines 12-13).&lt;/li&gt;
    &lt;li&gt;I release client data to continue flow, then collect again to look for the starttls command from the client.&lt;/li&gt;
    &lt;li&gt;Now on the server side, if ehlo is set and the starttls is not in the message, replace the payload with a starttls message. (line 27)&lt;/li&gt;
    &lt;li&gt;And again release the data (line 29)&lt;/li&gt;
    &lt;li&gt;Now when client data arrives with starttls, LTM responds directly informing the client to start TLS communication (lines 16-17) and then swallows the payload (line 18).&lt;/li&gt;
    &lt;li&gt;After responding to the client, I need to enable SSL to the virtual is ready&amp;#160; for the client hello from the client (line 20).&lt;/li&gt;
    &lt;li&gt;Finally, if there is no ehlo or starttls from the client, I’ll just release the payload. This is to allow clients not supporting starttls through. (line 22)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is a modified version of this iRule as well contributed by user asharicz in &lt;a target=&quot;_blank&quot; href=&quot;/Community/GroupDetails/tabid/1082223/asg/50/aft/1178713/showtab/groupforums/Default.aspx&quot;&gt;this forum thread&lt;/a&gt; that changes a few of the condition statements but doesn’t touch the collect/release logic.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/iRules.TCP__collect.ashx&quot;&gt;TCP::collect - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/dctv/archive/2011/05/06/post-of-the-week-smtp-tls-encryption.aspx&quot;&gt;Post of the Week - SMTP TLS Encryption&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/31/aft/790851/Default.aspx&quot;&gt;SMTP Load Balancing and Routing - DevCentral - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/iRules.SMTPProxy.ashx&quot;&gt;SMTP Proxy - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/32/afv/topic/aft/1176902/Default.aspx&quot;&gt;Custom monitor for SMTP servers - DevCentral - DevCentral Groups ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/31/aft/31435/Default.aspx&quot;&gt;Basic SMTP Virtual Server - DevCentral - DevCentral Groups ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/56696/Default.aspx&quot;&gt;iRule for TLS SMTP encryption (Colin&#039;s code) - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/iRules.dummy_SMTP_server.ashx&quot;&gt;dummy SMTP server - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aft/29339/Default.aspx&quot;&gt;tcp::collect question - DevCentral - F5 DevCentral &amp;gt; Forums - Social ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;height: 11px; clear: both;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/6J3V4eejFSQ&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2038192&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 26 Oct 2011 09:49:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2038192</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2038192#feedback</comments>
</item>
<item>
 <title>BSidesMO Wrap-up</title>
 <link>http://jasonrahm.ulitzer.com/node/2036033</link>
 <description>&lt;p&gt;Last Friday I attended my first &lt;a href=&quot;http://www.securitybsides.com/w/page/12194156/FrontPage&quot; target=&quot;_blank&quot;&gt;BSides&lt;/a&gt; event in Missouri’s capitol (literally in the capitol building!) Jefferson City. The BSides community exists to bring fellow security practitioners together &lt;img style=&quot;margin: 10px; display: inline; float: right&quot; align=&quot;right&quot; src=&quot;http://mymissourian.com/wp-content/uploads/2009/02/3239576282_ef614516aa.jpg&quot; /&gt;to present and participate in a small-scale environment that encourages collaboration. I’m not the outgoing sort and I generally like to fade into the background and just learn, but this environment really lends itself well to establishing relationships with others. There were quite a few St Louis based individuals and the chatter is already taking off for setting up a BSides event closer to home in the Spring. Two tracks were offered at &lt;a href=&quot;http://www.securitybsides.com/w/page/35094907/BSidesMo&quot; target=&quot;_blank&quot;&gt;BSidesMO&lt;/a&gt;; I chose track 2. A brief review of a few of my favorite talks follows below. Many thanks to Jerry Gamblin (@jgamblin), Randy Raw (@randyraw), &amp;amp; Beth Young (@bethayoung) for putting on a great show.&lt;/p&gt;  &lt;h3&gt;The Evolution of Malware – Chris Quinn&lt;/h3&gt;  &lt;p&gt;I don’t spend any time studying malware, but I spend quite a bit of time cleaning it up. This talk was pretty eye opening on several levels. The increase of viruses (250k in 2007  –&amp;gt; 286M in 2010) is a shocking display of slope. The growth is primarily attributed to the mutating nature of most of the new viruses, targeting only a few dozen before mutating again. That narrowing of focus in targeting victims kind of reminds me of the scene in Jurassic Park where one of the raptors lays as bait while the other hides in the bushes ready to pounce: &lt;a id=&quot;abf00fe0-8bf1-4338-8549-ea3813a04419&quot; href=&quot;http://www.youtube.com/watch?v=TO5wryDdEI0&quot; alt=&quot;youtube&quot;&gt;Clever Girl&lt;/a&gt;! The real payoff of the talk, however, was the discussion on Stuxnet. Some high level details on design:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Used seven distinct mechanisms to spread, six of which leveraged 0-day vulnerabilities)&lt;/li&gt;    &lt;li&gt;Comprised of 15 modules&lt;/li&gt;    &lt;li&gt;Five mechanisms to conceal itself&lt;/li&gt;    &lt;li&gt;reprograms industrial PLCs w/ 10k lines of code (10k!)&lt;/li&gt;    &lt;li&gt;rootkits for windows PC and the PLC&lt;/li&gt;    &lt;li&gt;used two stolen certificates to sign its files making them look legitimate&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For systems infected without the appropriate configuration, the virus did nothing. Otherwise, it would collect telemetry data for days and then replay to monitoring systems while then controlling the PLCs at will. Amazing stuff. Bruce Schneier has &lt;a href=&quot;http://www.schneier.com/blog/archives/2010/10/stuxnet.html&quot; target=&quot;_blank&quot;&gt;a nice summary&lt;/a&gt; of the knowns/unknowns (at time of writing), and you can read &lt;a href=&quot;http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_stuxnet_dossier.pdf&quot; target=&quot;_blank&quot;&gt;Symantec’s comprehensive dossier&lt;/a&gt; on the subject as well.&lt;/p&gt;  &lt;h3&gt;Make the World Go Away – Beth Young&lt;/h3&gt;  &lt;p&gt;Beth’s talk focuses on reducing your threat landscape. She discussed inbound reduction techniques like blocking ip ranges from areas of the world that would have no business accessing a particular resource. This was interesting as the legwork required to build this yourself and implement on the firewalls is fairly cumbersome, but worthwhile. F5 customers can tap the built-in Quova geo-location services in BIG-IP LTM to stop requests at the door using the iRules whereis command, performing the same function in minutes what probably took Beth and her team a considerably longer time to achieve. The most interesting part of the talk concerned protecting internal users and in turn the organization by poisoning the DNS for known bad domains. This is done either by routing said requests to a bit bucket (IP based) or redirecting the requests to an alternative web-server for stats collection and remediation (name based). Both are intriguing, and I expect I’ll write this solution up utilizing F5 gear in the next few weeks.&lt;/p&gt;  &lt;h3&gt;Web Exploitation Trends – Larry Battle&lt;/h3&gt;  &lt;p&gt;Larry had some great information, a lot of which was similar to Chris Quinn’s, so I won’t rehash that. The social engineering discussion was engaging, however. I don’t recall the place (Surprise Valley, Sunrise Valley?) but Larry described a place in Idaho that had an entire real-estate website for people wanting to relocate there, only the place didn’t even exist. The entire site was a scam, and when you clicked on the videos, a flash “upgrade” would be presented, at which time it appeared flash was updating (with real-looking flash screens) but actually malware was being downloaded instead. The craftiness of these criminals is amazing. The other uncool but fascinating part was the “You have a virus, pay $25 and we’ll clean it” scam. I always go straight to task manager and kill the processes as soon as these pop-up, but I wasn’t aware that they aren’t malware in the sense that they do damage to your system. It’s really just a scare tactic to get you to spend $25. The whole thing is a ruse, and does nothing to infect or clean your system. Fascinating stuff.&lt;/p&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2011/03/02/where-do-you-wear-your-malware.aspx&quot;&gt;Where Do You Wear Your Malware?&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2011/04/08/3-billion-malware-attacks-and-counting.aspx&quot;&gt;3 Billion Malware Attacks and Counting&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/smaierhofer/Tags/Malware/default.aspx&quot;&gt;Stefan Maierhofer - Malware&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2010/12/17/e-card-malware.aspx&quot;&gt;e-card Malware&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/category/2339.aspx&quot;&gt;Pete Silva - malware&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/18/aft/16471/Default.aspx&quot;&gt;generic malware/spyware/loggers - DevCentral - DevCentral Groups ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2010/12/15/2010-year-end-security-wrap.aspx&quot;&gt;2010 Year End Security Wrap&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/Joe/Tags/Trojan/default.aspx&quot;&gt;Joe Pruitt - Trojan&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2011/06/14/custom-code-for-targeted-attacks.aspx&quot;&gt;Custom Code for Targeted Attacks&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/Joe/archive/2008/12/16/ie7-offers-another-reason-to-use-firefox.aspx&quot;&gt;IE7 Offers Another Reason To Use FireFox&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f1c62141-4d46-4f92-b2b1-dcd67af0c554&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+Devcentral&quot; rel=&quot;tag&quot;&gt;F5 Devcentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BSides&quot; rel=&quot;tag&quot;&gt;BSides&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BSidesMO&quot; rel=&quot;tag&quot;&gt;BSidesMO&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Chris+Quinn&quot; rel=&quot;tag&quot;&gt;Chris Quinn&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Beth+Young&quot; rel=&quot;tag&quot;&gt;Beth Young&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Larry+Battle&quot; rel=&quot;tag&quot;&gt;Larry Battle&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jerry+Gamblin&quot; rel=&quot;tag&quot;&gt;Jerry Gamblin&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Randy+Raw&quot; rel=&quot;tag&quot;&gt;Randy Raw&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/malware&quot; rel=&quot;tag&quot;&gt;malware&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/security&quot; rel=&quot;tag&quot;&gt;security&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1098453.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/hGyHmjk4NVs&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2036033&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 25 Oct 2011 03:41:46 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2036033</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2036033#feedback</comments>
</item>
<item>
 <title>v11: RDP Access via BIG-IP APM&amp;ndash;Part 3</title>
 <link>http://jasonrahm.ulitzer.com/node/2007809</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;&lt;p&gt;In &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086492/v11-RDP-Access-via-BIG-IP-APMPart-1.aspx&quot; target=&quot;_blank&quot;&gt;Part 1&lt;/a&gt;, I configured a full Webtop in APM with a static RDP host. In &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086493/v11-RDP-Access-via-BIG-IP-APMndashPart-2.aspx&quot; target=&quot;_blank&quot;&gt;Part 2&lt;/a&gt; ,I modified that configuration to allow users to specify their RDP destination. In this article, I’ll make a couple changes to the final configuration in Part 2 to have the last hostname “remembered” across sessions.&lt;/p&gt;  &lt;h3&gt;Add an iRule Event&lt;/h3&gt;  &lt;p&gt;Yes! Finally an iRule in this series. In order for an iRule to be triggered, however, I need to add an iRule event to the policy. Why do I need an iRule? Well, in order to recall the previous session’s hostname, I need to store it somewhere. In this case, I’ll be using the BIG-IP session table, accessing it with the &lt;a href=&quot;/wiki/iRules.table.ashx&quot; target=&quot;_blank&quot;&gt;table&lt;/a&gt; command. I’ll add the iRule event immediately before the RDP Hostname page so the previous hostname can be displayed there if applicable. I gave the event an ID of 1.&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:843a897c-00ed-4a1e-9d98-e3fcf331bcd2&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_1-8x6.png&quot; title=&quot;Figure 1. iRule Event Addition&quot; rel=&quot;thumbnail&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;95eb3fab&#039;})&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_1_4.png&quot; width=&quot;580&quot; height=&quot;440&quot; /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;The iRule itself is pretty simple.&amp;#160; Set the user to a variable, which becomes the table key for the user’s rdp host destination. If it’s there, it’ll be pre-populated, otherwise, it won’t. In the completed event, it’s much the same except the hostname is stored instead of being looked up.&lt;/p&gt;  &lt;pre class=&quot;brush: irules&quot;&gt;when ACCESS_POLICY_AGENT_EVENT {
  # This event runs immediately before the RDP Hostname logon page
  # Grab username entered on the logon page
  set user [ACCESS::session data get session.logon.last.username]
  # Look up in session table to see if a hostname is already saved for a user
  set hostname [table lookup $user]
  # Pre-fill the hostname session variable (to be shown on the RDP hostname entry page)
  ACCESS::session data set session.logon.last.hostname $hostname
}
when ACCESS_POLICY_COMPLETED {
  # This event runs after the RDP hostname entry page
  # Grab username entered on the logon page
  set user [ACCESS::session data get session.logon.last.username]
  # Grab hostname entered on the RDP hostname entry page
  set hostname [ACCESS::session data get session.logon.last.hostname]
  # Save this in the session table (does not time out)
  table set $user $hostname &amp;quot;indefinite&amp;quot;
}&lt;/pre&gt;

&lt;p&gt;Once the iRule is saved to the system, it should be applied to the rdp virtual as shown in Figure 2.&lt;/p&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:b623f1c4-b237-4c33-9241-c85cea464209&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_3-8x6.png&quot; title=&quot;Figure 2. Apply iRule to VIP&quot; rel=&quot;thumbnail&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;95eb3fab&#039;})&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_3_4.png&quot; width=&quot;580&quot; height=&quot;402&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h3&gt;Customize RDP Hostname&lt;/h3&gt;

&lt;p&gt;Before the auto-population will work, I need to comment out a few lines in the logon.inc file for the RDP Hostname logon page to make sure the field is always auto-populated (even with an empty string). To get to the file, I click the Access Policy tab in the menu and then Customization and then expand out Customization Settings-&amp;gt;/Common/rdptest-&amp;gt;Access Policy-&amp;gt;RDP Hostname. Click on Views at the top and select Advanced. Click logon.inc under RDP Hostname and then comment out the lines selected in Figure 3.&lt;/p&gt;



&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c518244b-4a4b-4f8b-8f3d-ab001821d842&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_2_001-8x6.png&quot; title=&quot;Figure 3. Advanced Customizations&quot; rel=&quot;thumbnail&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;95eb3fab&#039;})&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_2_001_2.png&quot; width=&quot;580&quot; height=&quot;382&quot; /&gt;&lt;/a&gt;&lt;/div&gt;



&lt;p&gt;After clicking Save Draft then Save, I navigate to Access Policy-&amp;gt;Access Profiles and click Apply Access Policy to update the changes.&lt;/p&gt;

&lt;h3&gt;Testing the Changes&lt;/h3&gt;

&lt;p&gt;Now that the policy is applied, I can login and see that the field on first attempt is empty.&lt;/p&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:79d84784-c06a-413b-910b-825d96568638&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_4-8x6.png&quot; title=&quot;Figure 4. RDP Hostname Page - 1st Attempt&quot; rel=&quot;thumbnail&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;95eb3fab&#039;})&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_4_6.png&quot; width=&quot;580&quot; height=&quot;405&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;On the second time through, I see that the hostname I selected is pre-populated as expected.&lt;/p&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:74394dbc-ae63-43e4-801b-82b3c53715f3&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_5-8x6.png&quot; title=&quot;Figure 5. RDP Hostname Page - 2nd Attempt&quot; rel=&quot;thumbnail&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;95eb3fab&#039;})&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Oct/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-3_8849-apm_rdp3_5_2.png&quot; width=&quot;580&quot; height=&quot;405&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;I added a log statement to each of the iRule events to track the table key/value pair. For first time through, notice the&amp;#160; host is empty on the ACCESS_POLICY_AGENT_EVENT, but is populated by the time the policy completes:&lt;/p&gt;

&lt;p&gt;Oct&amp;#160; 4 11:18:03 tmm info tmm[19079]: Rule /Common/rdptest_autopopulate &amp;lt;ACCESS_POLICY_AGENT_EVENT&amp;gt;: User=dc.user, Host= 
  &lt;br /&gt;Oct&amp;#160; 4 11:18:12 tmm info tmm[19079]: Rule /Common/rdptest_autopopulate &amp;lt;ACCESS_POLICY_COMPLETED&amp;gt;: User=dc.user, Host=ad01.devcentral.test.local 

  &lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;All three parts of this series explored the Webtop functionality and different ways to customize the approach for user access to Windows resources secured by BIG-IP Access Policy Manager.&amp;#160; Many thanks to James Goodwin and the APM team for great source material and continued development of excellent access solutions.&lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;/wiki/APM.HomePage.ashx&quot;&gt;BIG-IP Access Policy Manager (APM) Wiki Home - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086493/v11-RDP-Access-via-BIG-IP-APMndashPart-2.aspx&quot;&gt;v11: RDP Access via BIG-IP APM–Part 2 &amp;gt; DevCentral &amp;gt; Tech Tips ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086492/v11-RDP-Access-via-BIG-IP-APMPart-1.aspx&quot;&gt;v11: RDP Access via BIG-IP APM–Part 1 &amp;gt; DevCentral &amp;gt; Tech Tips ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086453/Web-Application-Login-Integration-with-APM.aspx&quot;&gt;Web Application Login Integration with APM &amp;gt; DevCentral &amp;gt; Tech ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086485/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-4.aspx&quot;&gt;Preventing Brute Force Password Guessing Attacks with APM–Part ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086455/Auto-launch-Remote-Desktop-Sessions-with-APM.aspx&quot;&gt;Auto-launch Remote Desktop Sessions with APM &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1177220/asg/62/Default.aspx&quot;&gt;NTLM/ Outlook Anywhere/ Big-IP APM - DevCentral - DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/wiki/APM.APMDomainUserCheckSSOAndCookieInsert.ashx&quot;&gt;APM Domain User Check SSO And Cookie Insert - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;d_itc_f&quot; style=&quot;clear:both;height:11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/W3r1Rqfn7dU&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/2007809&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 04 Oct 2011 05:24:41 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/2007809</guid>
 <comments>http://jasonrahm.ulitzer.com/node/2007809#feedback</comments>
</item>
<item>
 <title>v11: RDP Access via BIG-IP APM&amp;ndash;Part 2</title>
 <link>http://jasonrahm.ulitzer.com/node/1984223</link>
 <description>&lt;p&gt;In the &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086492/v11-RDP-Access-via-BIG-IP-APMPart-1.aspx&quot;&gt;first article in this series&lt;/a&gt;, I configured a full Webtop in APM with a static RDP host.&amp;#160; In this article, I’ll make some changes to the original configuration to allow users to specify an RDP host destination.&lt;/p&gt;
&lt;h3&gt;Modify the Access Policy&lt;/h3&gt;
&lt;p&gt;Immediately after the active directory authentication on the successful branch, click the “+” and add a logon page.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:30910013-c938-4a80-8630-3f8be7e64a2d&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 1. Adding a Logon Page&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_1-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;529&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_1_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;In the logon page configuration, change the name (optional) to RDP Hostname, set the field 1 post variable and session variable names to hostname, change the type for field two to none, then add some explanatory text to the Form Header Text field and specify Hostname in the text box for field 1. I also changed the Logon Button text to Continue instead of Logon since the logon has already occurred.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7948fd98-a570-4fa4-a208-d31356e5a960&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 2. RDP Hostname Configuration&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_2-8x6.png&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;609&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_2_6.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Click save.&amp;#160; Now the policy should look like the image in Figure 3.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d7cb7094-9453-496a-b0e1-336d1254aad3&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 3. New Policy Configuration&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_3-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;207&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_3_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;Modify the RDP Resource&lt;/h3&gt;
&lt;p&gt;After closing the policy editor, I open the Remote Desktop (Access Policy-&amp;gt;Application Access-&amp;gt;Remote Desktops-&amp;gt;Remote Desktops) and change the destination from the static resource I assigned in part 1 to the variable I created in the policy: %{session.logon.last.hostname}&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:b9982e47-0604-4994-a513-67c94a0809e2&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 4. Remote Desktop Configuration&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_4-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;562&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_4_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Optional Customization&lt;/h3&gt;
&lt;p&gt;To provide a description on the button that includes the user configured RDP host name, go to Access Policy-&amp;gt;Customization and select the configured Remote Desktop, select the Localization tab in the menu and configure the Caption and Detailed Descriptions.&amp;#160; Use the same session variable from above in the description field.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e45f4c3a-1978-4eb7-ada6-c145fc7a3c1d&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 5. Button Customization&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_5a-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;211&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_5a_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Make sure the caption is configured for each of the languages you support. I only changed the English one in this example.&amp;#160; Next, apply the policy.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:3f2dc434-fe2b-4c18-a754-0972a49414aa&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 6. Policy Application&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_6-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;261&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_6_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Testing the Changes&lt;/h3&gt;
&lt;p&gt;Now that my changes are complete, I can test them. Same initial login screen as part 1:&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:6f1aed1b-c41d-4edf-a8a8-9542288c442a&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 7. Initial Login Screen&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_7-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;461&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_7_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Now I’m presented with the second logon page, this time asking for the host I&#039;d like to connect to:&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:61c5b7d0-4a53-455e-b35b-b07490dbd0d7&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 8. RDP Hostname Form&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_8-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;393&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_8_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Note the continue I modified in the policy instead of it being labeled Logon.&amp;#160; Now, My Webtop shows the Caption (RDP Connection) and the Description (ad01.devcen…) that I defined in the customizations in the policy.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:91a0dd59-46b7-4f95-8328-20946dbf1877&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 9. Webtop Display&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_9-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;395&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_9_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Finally, clicking on the button takes me to my desired resource:&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:9c4844bb-4582-4288-88e9-11672fa1455f&quot; style=&quot;margin: 0px; padding: 0px; float: none; display: inline;&quot;&gt;&lt;a title=&quot;Figure 10. Successful RDP Connection&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d51bfaf2&#039;})&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_10-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;354&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-RDP-Access-via-BIG-IP-APMPart-2_81E5-apm_rdp2_10_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This solution extended the functionality in part 1 to allow for dynamic configuration of the RDP host destination for user access.&amp;#160; In part 3, I’ll explore an iRules option for providing session history as part of the solution.&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;height: 11px; clear: both;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/7xyj-Oade3A&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1984223&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 15 Sep 2011 06:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1984223</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1984223#feedback</comments>
</item>
<item>
 <title>v11: RDP Access via BIG-IP APM–Part 1</title>
 <link>http://jasonrahm.ulitzer.com/node/1978373</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;I wrote an article several months back on &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086455/Auto-launch-Remote-Desktop-Sessions-with-APM.aspx&quot;&gt;auto-launching Remote Desktop sessions with APM&lt;/a&gt;.&amp;#160; With the introduction of BIG-IP APM v11, there is a new built-in capability to support a full webtop.&amp;#160; This means that server, desktop, or other resources can be placed on the webtop for users to select once logging in.&amp;#160; In this first example, I’ll set up a static internal resource for users to connect to after logging in.&lt;/p&gt;
&lt;h3&gt;Create the Webtop&lt;/h3&gt;
&lt;p&gt;After logging in to the BIG-IP, open up the Access Policy tab and select &lt;strong&gt;Webtops&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Webtop List&lt;/strong&gt; and then click Create (or you can hit the “+” circled to the right of the Webtop List.) Give the Webtop a meaningful name and the type needs to be Full as show in Figure 1.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:0cee0dc4-d320-4919-b962-ef6c772ff2d1&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 1. Full Webtop&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_3-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;358&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_3_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;Create the RDP Resource&lt;/h3&gt;
&lt;p&gt;Still in the Access Policy tab, click &lt;strong&gt;Application Access&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Remote Desktops&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Remote Desktops&lt;/strong&gt; and then click Create. There are a number of fields here, but for this example the only ones that need to be set are the &lt;strong&gt;Type&lt;/strong&gt; (RDP), the &lt;strong&gt;Destination&lt;/strong&gt; (Server or Desktop hostname or IP), and &lt;strong&gt;Auto Logon&lt;/strong&gt; (Enable). When Auto Logon is selected, the username, password, and domain source variable fields are shown.&amp;#160; I accepted the defaults.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:48d682f2-91f5-41f1-a658-e67ae4f27954&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 2. RDP Resource&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_2-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;390&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_2_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;Create the Access Policy&lt;/h3&gt;
&lt;p&gt;Now that the two custom objects for the RDP Webtop are created, I’ll create the access policy (and virtuals) with the &lt;strong&gt;Network Access Setup Wizard for Remote Access&lt;/strong&gt; under the Wizards tab. I create all my access policies this way, the wizard is very thorough and eliminates my tendency to overlook an object or misconfigure one, not to mention the time savings. In the first screen, I disabled AV checks (though in production I wouldn’t recommend this) as shown in Figure 3 below.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7725d386-cbd5-4b7a-99a8-085e8f347615&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 3. Access Policy Wizard Step 1&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_4-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;428&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_4_7.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Next I create a new authentication resource (you can select existing if this is not a new installation), utilizing my test active directory server.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:0dc845b2-c7c0-4391-8777-84e5548451f3&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 4. Authentication Resource&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_5-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;433&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_5_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e1660838-8ad5-44bb-90a7-33662f039035&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 5. AD Configuration Details&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_6-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;393&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_6_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Next I configure the lease pool.&amp;#160; It’s just me in my test lab, so I only create a single client address, but you’ll likely need to choose the IP address range.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f3effd19-e092-4555-8822-8aa97f9c2fa5&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 6. Lease Pool Configuration&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_7-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;511&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_7_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The next step is for network access configuration.&amp;#160; Corporate policies will dictate whether all traffic is forced through the tunnel or if split-tunneling is appropriate. For this example, I stuck with forcing all traffic through the tunnel to minimize the necessary configuration to show the features.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:597aa133-b617-46a2-9f5d-5e015983b41c&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 7. Network Access Configuration&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_8-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;475&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_8_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I only have one name server, my ad01 directory server, so I enter that and leave the rest blank.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:935d8102-1e5a-45ff-9711-b6325c082512&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 8. Client DNS Configuration&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_9-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;600&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_9_6.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Next I’ll enter the VIP address and leave the http-&amp;gt;https redirect virtual enabled.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:5fa518ae-798b-465b-b7e2-6f4399d227b2&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 9. VIP Configuration&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_10-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;401&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_10_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;At this point, I review the configuration and click &lt;strong&gt;next&lt;/strong&gt;.&amp;#160; If there are any errors, you can return to previous steps in the wizard and make corrections. Before clicking &lt;strong&gt;Finished&lt;/strong&gt; in the next screen, I need to edit the access policy.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:efab365e-53ff-4742-8e34-2fce94f2e3fd&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 10. Edit Access Policy&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_11-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;339&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_11_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Once in the policy editor, click on the &lt;strong&gt;Logon Page&lt;/strong&gt; object and set Field 3 from &lt;strong&gt;none&lt;/strong&gt; to &lt;strong&gt;text&lt;/strong&gt; and use &lt;strong&gt;domain&lt;/strong&gt; as the post and session variable name.&amp;#160; Then below in the &lt;strong&gt;Logon Page Input Field #3&lt;/strong&gt; text box, enter &lt;strong&gt;Domain&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:59f449a7-0431-4726-a385-27beff507745&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 11. Logon Page Settings&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_12-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;484&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_12_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Next, click on the &lt;strong&gt;Resource Assign&lt;/strong&gt; object and then click &lt;strong&gt;Add/Delete&lt;/strong&gt; in the expression. I need to replace the webtop the network access wizard created and I need to select the RDP Resource I created.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:3391b08f-d238-4c41-a7c8-a507f5f8cd8f&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 12. Resource Assign&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_13-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;312&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_13_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:46619637-496b-490d-9698-5071aaf99fc7&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 13. Replace Webtop&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_15-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;305&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_15_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:74f1deaf-7e88-4b94-a077-e05f75cbf6cf&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 14. Assign RDP Resource &quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_14-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;279&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_14_7.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Close out the policy and then click &lt;strong&gt;Finished&lt;/strong&gt; in the &lt;strong&gt;Setup Summary&lt;/strong&gt; screen. For my configuration I need to snat the traffic, so I enabled snat-automap on the virtual created by the wizard. Because I made changes to the policy, I need to re-apply it, so in the Access Policy tab I clicked on &lt;strong&gt;Access Profiles&lt;/strong&gt; and then selected my profile and clicked &lt;strong&gt;Apply Access Policy&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7bee4600-824f-4360-91aa-4b5225f876f9&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 15. Apply Access Policy&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_16-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;327&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_16_2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;That completes the configuration steps. Now it’s time to test.&lt;/p&gt;
&lt;h3&gt;Testing the Configuration&lt;/h3&gt;
&lt;p&gt;First I open a browser and navigate to my vip, &lt;a href=&quot;https://10.10.20.30&quot;&gt;https://10.10.20.30&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:60cac915-dcef-48af-8940-36bfbee37e7d&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 16. Logon Screen&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_19-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;412&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_19_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After login, my RDP resource is shown on my Webtop, along with my network access.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ee938cee-0d64-45aa-9979-cf059655cbd2&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 17. v11 Webtop&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_20-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;352&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_20_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After clicking the rdptest icon, I am logged in automatically to my server.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c5ecadc5-6892-4fa3-bb75-fd8562d9c770&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;7c944a3e&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 18. RDP Session&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_22-8x6.png&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;510&quot; border=&quot;0&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Sep/Windows-Live-Writer-v11-Access-Policy-Manager-Remote-Desktop_BCC1-apm_rdp1_22_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;It seems like a lot of steps, but I configured this in less than five minutes, which is far more efficient and far less error-prone than the previous solution. The video below shares the same steps covered here in screen captures.&lt;/p&gt;
&lt;div class=&quot;techTipPlayer&quot;&gt;&lt;a alt=&quot;youtube&quot; href=&quot;http://www.youtube.com/watch?v=XBr4rl_GnKc&quot; id=&quot;ba5d7e4a-85d3-44d8-ad23-b17e21260ea3&quot;&gt;BIG-IP APM RDP Webtop&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This solution introduces a full Webtop environment for BIG-IP APM in version 11, which I took advantage of for statically configuring RDP resources for clients.&amp;#160; In part 2, I’ll introduce a dynamic option for the RDP resource.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/wgX2VdqYeYc&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1978373&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 12 Sep 2011 15:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1978373</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1978373#feedback</comments>
</item>
<item>
 <title>Create a User Lockout Policy with Access Policy Manager</title>
 <link>http://jasonrahm.ulitzer.com/node/1959417</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;This article will cover a simple access policy that when completed will lock out a user using BIG-IP Access Policy Manager.&amp;#160; Start by making an access policy with the Device Wizard. Since I just want to make a quick and easy example, I’ll be using the fourth radio option, &lt;b&gt;Web Application Access Management for Local Traffic Virtual Servers&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul1_2.png&quot;&gt;&lt;img height=&quot;156&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul1_thumb.png&quot; title=&quot;apm_ul1&quot; alt=&quot;apm_ul1&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Create a virtual server via the wizard or use an existing virtual server if you already have a HTTPS virtual server. I called my Policy “Lockout” and I disabled the Antivirus Check just because I don’t want to crowd my access policy.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul2_2.png&quot;&gt;&lt;img height=&quot;267&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul2_thumb.png&quot; title=&quot;apm_ul2&quot; alt=&quot;apm_ul2&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;I chose &lt;b style=&quot;&quot;&gt;Active Directory&lt;/b&gt; as my authentication factor but feel free to use what you like. Next, create a virtual server if you don’t already have one. I have one already but if didn’t, I would do the following.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul3_2.png&quot;&gt;&lt;img height=&quot;300&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul3_thumb.png&quot; title=&quot;apm_ul3&quot; alt=&quot;apm_ul3&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Review the configuration and before finishing the wizard, click on &lt;b&gt;Edit Access Policy in Visual Policy Editor&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul4_2.png&quot;&gt;&lt;img height=&quot;369&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul4_thumb.png&quot; title=&quot;apm_ul4&quot; alt=&quot;apm_ul4&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your access policy should look like the following. First change the &lt;b&gt;Max Logon Attempts Allowed &lt;/b&gt;to one.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul5_2.png&quot;&gt;&lt;img height=&quot;158&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul5_thumb.png&quot; title=&quot;apm_ul5&quot; alt=&quot;apm_ul5&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next, I just added a Lockout macro (I need to be more creative with the naming scheme). Our macro will only consist of one block but for the sake of encapsulation, I made it into a macro in case in the future we want to add something else to it.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul6_2.png&quot;&gt;&lt;img height=&quot;267&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul6_thumb.png&quot; title=&quot;apm_ul6&quot; alt=&quot;apm_ul6&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the macro, create a new iRule Event with ID “lookup user” and with the following branch rules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;550&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;125&quot;&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;425&quot;&gt;&lt;strong&gt;Expression&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;125&quot;&gt;Lockout user&lt;/td&gt;
            &lt;td width=&quot;425&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;gt;= [mcget {session.custom.lockout}] }&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;125&quot;&gt;Can allow through&lt;/td&gt;
            &lt;td width=&quot;425&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;lt; [mcget {session.custom.lockout}] }&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now add some more appropriate terminals to our macro since the default “Out” is not very descriptive.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul7_2.png&quot;&gt;&lt;img height=&quot;302&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul7_thumb.png&quot; title=&quot;apm_ul7&quot; alt=&quot;apm_ul7&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Great, now just add the macro between the &lt;b&gt;Logon Page&lt;/b&gt; and the &lt;b&gt;AD Auth&lt;/b&gt;. The &lt;b&gt;AD Auth&lt;/b&gt; is most likely on the Lockout branch but we can easily move it to the correct, Allow Through, branch by clicking on the little down arrow on the &lt;b&gt;AD Auth&lt;/b&gt; block.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul8_2.png&quot;&gt;&lt;img height=&quot;267&quot; border=&quot;0&quot; width=&quot;400&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul8_thumb.png&quot; title=&quot;apm_ul8&quot; alt=&quot;apm_ul8&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;Now that everything is in place, we should edit the endings of the access policy so that it would make more sense. Right now we only have &lt;b style=&quot;&quot;&gt;Allow &lt;/b&gt;and &lt;b style=&quot;&quot;&gt;Deny&lt;/b&gt; but we should add something like a Lockout with more information for the user. Don’t forget to attach the lockout ending to the lockout branch (use a different name if you want).&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul9_2.png&quot;&gt;&lt;img height=&quot;710&quot; border=&quot;0&quot; width=&quot;500&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul9_thumb.png&quot; title=&quot;apm_ul9&quot; alt=&quot;apm_ul9&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;550&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;275&quot;&gt;&lt;strong&gt;Error Title&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;275&quot;&gt;&lt;strong&gt;Error Message&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width=&quot;275&quot; valign=&quot;top&quot;&gt;You’ve been locked out, %{session.logon.last.username}&lt;/td&gt;
            &lt;td width=&quot;275&quot; valign=&quot;top&quot;&gt;Please try again in %{session.custom.timeout} minutes.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the &lt;b&gt;Error title&lt;/b&gt;, I added a session variable that personalizes the lockout. Also, I added a custom session variable I added in iRules that lets the users know how much more they have to wait to try again. Apply the access policy and finish the device wizard. The final step is to attach the iRule below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;lookup user&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# The lockout and timeout variables are customizable here. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# The lockout variable determines how many times a user may try&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# before getting locked out. The timeout variable determines how&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# long a user has to wait until they can come out of their lockout.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; lockout 5&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; timeout 900&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# We do not want to touch (reset the timer) the user unless we know&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# for sure that this user’s bad password count has not exceeded the&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# lockout number.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup -notouch $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$badpwd == {}} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; add $user 0 $timeout&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;elseif&lt;/span&gt; {$badpwd &amp;lt; $lockout} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount $badpwd&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.lockout $lockout&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.timeout [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;expr&lt;/span&gt; {]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; timeout -remaining $user[ / 60}]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# When the policy completed we want to check the authentication results.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# If the user failed, we want to increment their bad password count. If &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# they have succeeded logon, we want to remove them from the session table. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_COMPLETED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; result [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.ad.last.authresult]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# If we never went to authentication, the auth result would be null &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# and we don’t want to do anything in that case.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$result == &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;elseif&lt;/span&gt; {$result} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; delete $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;incr&lt;/span&gt; $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;A failed login should result in this screen:&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ba79097e&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul10_2.png&quot;&gt;&lt;img height=&quot;430&quot; border=&quot;0&quot; width=&quot;400&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5c744ada64d8_79D9-apm_ul10_thumb.png&quot; title=&quot;apm_ul10&quot; alt=&quot;apm_ul10&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks again to ystephie for another great solution!&lt;/p&gt;
&lt;h3&gt;About the Author&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_6.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot;&gt;&lt;img height=&quot;165&quot; border=&quot;0&quot; align=&quot;left&quot; width=&quot;165&quot; style=&quot;background-image: none; border: 0px none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px;&quot; alt=&quot;image&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_thumb_2.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p style=&quot;margin: 0in 0in 0pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;font size=&quot;3&quot;&gt;Stephanie is a summer intern at F5, heading back to school soon to continue her EECS degree at UC Berkeley, and has been having a blast   creating interesting solutions for BIG-IP. Stephanie’s passion for engineering, and smile, is contagious.&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/APM.HomePage.ashx&quot;&gt;BIG-IP Access Policy Manager (APM) Wiki Home - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/dctv/archive/2011/08/01/f5-agility-2011-andy-oehler-on-f5rsquos-apm-and.aspx&quot;&gt;F5 Agility 2011 - Andy Oehler on F5&#039;s APM and Edge products&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086453/Web-Application-Login-Integration-with-APM.aspx&quot;&gt;Web Application Login Integration with APM &amp;gt; DevCentral &amp;gt; Tech ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/APM.APMDomainUserCheckSSOAndCookieInsert.ashx&quot;&gt;APM Domain User Check SSO And Cookie Insert - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086477/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-2.aspx&quot;&gt;Preventing Brute Force Password Guessing Attacks with APM–Part ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1177220/asg/62/Default.aspx&quot;&gt;NTLM/ Outlook Anywhere/ Big-IP APM - DevCentral - DevCental ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086455/Auto-launch-Remote-Desktop-Sessions-with-APM.aspx&quot;&gt;Auto-launch Remote Desktop Sessions with APM &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM–Customized Logon Page &amp;gt; DevCentral &amp;gt; Tech Tips on ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/tyPqT2d3Ex8&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1959417&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 26 Aug 2011 03:08:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1959417</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1959417#feedback</comments>
</item>
<item>
 <title>Preventing Brute Force Password Guessing Attacks with APM–Part 4</title>
 <link>http://jasonrahm.ulitzer.com/node/1951660</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;F5er and DevCentral community member ystephie is back with another great solution (check out her first solution here: &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM Customized Logon Page&lt;/a&gt;), this time tackling brute force attacks utilizing customizations with the BIG-IP Access Policy Manager.&amp;#160; This solution requires BIG-IP 10.2.2 Hotfix 1 or later.&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Exposing applications or services to the Internet opens inherent security risks. BIG-IP Access Policy Manager (APM) provides edge authentication and access control services for applications, BIG-IP Edge Gateway provides secure SSL VPN services, and BIG-IP Application Security Manager (ASM) provides protection against a variety of attacks. In this series of APM deployment examples, we cover a couple techniques for protecting against brute force password-guessing attacks.&lt;/p&gt;
&lt;p&gt;In our first example (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086474/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-1.aspx&quot;&gt;Part 1&lt;/a&gt;), we walked through the process of including a CAPTCHA on the APM logon page via a web service (Google reCAPTCHA project), to provide some protection against script based or other automated attacks.&lt;/p&gt;
&lt;p&gt;In our second example (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086477/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-2.aspx&quot;&gt;Part 2&lt;/a&gt;), we modified our configuration to only display the CAPTCHA challenge if a user has previously failed authentication (by checking the user’s badPwdCount attribute from Active Directory).&lt;/p&gt;
&lt;p&gt;In our third example (&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086479/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-3.aspx&quot; target=&quot;_blank&quot;&gt;Part 3&lt;/a&gt;), we kept track of authentication failures ourselves on box (through use of an iRules Session Table). This removed the dependency on Active Directory and solved the issue around tracking failures for invalid users (providing the same external behavior, whether a user is valid or invalid).&lt;/p&gt;
&lt;p&gt;In this final example, we’ll modify our policy to also temporarily lock out users from attempting login to APM after failing authentication too many times. This can further protect against both automated and manual credentials guessing attacks, and also prevent intentional or unintentional internal account lockout (for example, an Active Directory domain lockout from too many failures).&lt;/p&gt;
&lt;h3&gt;Locking Out Users After Failed Logon Attempts&lt;/h3&gt;
&lt;p&gt;Our previous example allowed the user to try authentication combined with the CAPTCHA challenge as many times as they liked, but that opens the possibility of an attacker locking a legitimate user’s account within an internal domain authentication server (e.g. Active Directory). Also allows for the possibility of a manual password guessing attack (by those really good at entering CAPTCHA challenges!). To prevent these possibilities, we can set a lockout variable in our example iRules and set the reset timer to the time we’d like to temporarily lock out a user (after a defined number of authentication failures). As with Part 3, we use iRules to create a Session Table that keeps track of all the usernames and number of failed authentication attempts for each user. Before we begin, please start with the access policy we created in &lt;i style=&quot;&quot;&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086479/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-3.aspx&quot; target=&quot;_blank&quot;&gt;Part 3&lt;/a&gt;&lt;/i&gt;.&lt;/p&gt;
&lt;h3&gt;Policy Additions&lt;/h3&gt;
&lt;p&gt;To incorporate lockout functionality, we simply need to add some branch rules and edit a bit of the iRule. The changes are described in each section below. The overall access policy isn’t changing much. The only modifications I’ve made are in the branch rules and some of the endings.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img1_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;244&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img1&quot; title=&quot;apm_p4img1&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img1_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The places we need to change are where a user’s information is first accessed or updated. This happens in more than five places. But, luckily with our use of macros, we only need to add branch rules in three places.&lt;/p&gt;
&lt;h4&gt;Macro: AD Auth &amp;amp; iRule&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img2_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;98&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img2&quot; title=&quot;apm_p4img2&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img2_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0in 0in 0pt;&quot; class=&quot;MsoNormal&quot;&gt;Since the &lt;b style=&quot;&quot;&gt;Empty&lt;/b&gt; block (&lt;i style=&quot;&quot;&gt;compares badpwdcount with maxtries&lt;/i&gt;) in the AD Auth and iRule macro checks the updated badpwdcount of the user against our CAPTCHA challenge variable (maxtries), this is a place we also want to check the badpwdcount against the lockout variable. Please see the modified iRule below (updates in red). &lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;&quot;&gt;We will add a new rule branch that compares the bad password count with a preset variable, lockout. Lockout is defined in the iRule and it is very easy to customize how many authentication failures should be allowed before temporarily locking them out.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0in 0in 0pt;&quot; class=&quot;MsoNormal&quot;&gt;&amp;#160;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Maxtries is a variable that sets how many times you want the regular logon page to show before showing the captcha. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Timeout is a variable that sets how long a user entry will persist in the session table. &lt;font color=&quot;#ff0000&quot;&gt;Lockout is a variable that sets how&lt;/font&gt; &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# &lt;font color=&quot;#ff0000&quot;&gt;many tries a user gets before getting locked out&lt;/font&gt;. This is the only place you need to change these variables.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; maxtries 2&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; timeout 900&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;font color=&quot;#ff0000&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; lockout 5&lt;/font&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.maxtries $maxtries&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;font color=&quot;#ff0000&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.lockout $lockout&lt;/font&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;set session vars&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup -notouch $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session lookups&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$badpwd == {}} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
            &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; add $user 0 $timeout]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount $badpwd&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;$user has this number of incorrect logons(lookups): $badpwd&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;badpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;incr&lt;/span&gt; $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;goodpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; delete $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img3_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;196&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img3&quot; title=&quot;apm_p4img3&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img3_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Branch Rule #1:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;500&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot; valign=&quot;top&quot;&gt;Name:&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;363&quot; valign=&quot;top&quot;&gt;Expression:&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot;&gt;Lockout&lt;/td&gt;
            &lt;td width=&quot;363&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;gt;= [mcget {session.custom.lockout}]}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Add an additional Terminal called “Lockout.” Change the ending of the branch we created to “Lockout.” This way, we can differentiate this from all the other endings.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img4_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;500&quot; border=&quot;0&quot; width=&quot;400&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img4&quot; title=&quot;apm_p4img4&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img4_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Macro: Captcha Auth with AD Auth&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img5_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;154&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img5&quot; title=&quot;apm_p4img5&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img5_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After the &lt;b&gt;Captcha Logon Page&lt;/b&gt;, add a new &lt;b&gt;iRule Event&lt;/b&gt; with ID “set session vars” with Branch Rule # 1 and Branch Rule # 2. Repeat the above process to add the lockout ending.&lt;/p&gt;
&lt;p&gt;Branch Rule #1:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;500&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot; valign=&quot;top&quot;&gt;Name:&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;363&quot; valign=&quot;top&quot;&gt;Expression:&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot;&gt;Lockout&lt;/td&gt;
            &lt;td width=&quot;363&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;gt;= [mcget {session.custom.lockout}]}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Branch Rule #2:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;500&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot; valign=&quot;top&quot;&gt;Name:&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;363&quot; valign=&quot;top&quot;&gt;Expression:&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot;&gt;Allow user to continue&lt;/td&gt;
            &lt;td width=&quot;363&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;lt; [mcget {session.custom.lockout}]}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;The reason we’re not using &lt;i&gt;session lookups&lt;/i&gt; as the event ID is because that in &lt;i&gt;session lookups&lt;/i&gt;, we want to “touch” the user - reset the timeout back to the max value defined as &lt;i&gt;timeout&lt;/i&gt;. With our new &lt;i&gt;set session vars&lt;/i&gt; event ID, we will add an optional flag (-notouch) that tells the table not to reset the user’s timer. Without the -notouch flag for this event, even if our user is patiently waiting for the 15 minute (in our example) lockout timeout to expire, but tries to connect again before the timer expires, the timer gets reset and the user would have to wait for ANOTHER 15 minutes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Maxtries is a variable that sets how many times you want the regular logon page&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# to show before showing the captcha. Timeout is a variable that sets how long a &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# user entry will persist in the session table. Lockout is a variable that sets &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# how many tries a user gets before getting locked out. This is the only place&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# you need to change these variables.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; maxtries 2&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;font color=&quot;#ff0000&quot;&gt;timeout 900&lt;/font&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; lockout 5&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.maxtries $maxtries&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.lockout $lockout&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;set session vars&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;font color=&quot;#ff0000&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup -notouch $user]&lt;/font&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    …&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Macro: Verify with Captcha Page&lt;/h4&gt;
&lt;p&gt;Add the lockout ending and attach it to the Lockout branch of &lt;i&gt;AD Auth and iRule&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img6_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;129&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img6&quot; title=&quot;apm_p4img6&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img6_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Macro: iRule Lookups and Auth&lt;/h4&gt;
&lt;p&gt;Add an iRule Event with ID, &lt;i&gt;set session vars&lt;/i&gt;, right after “In” with Branch Rule # 1 and Branch Rule # 2, &lt;i&gt;Lockout&lt;/i&gt; and &lt;i&gt;Allow user to continue&lt;/i&gt;. Don’t forget to update the endings to lockout.&lt;/p&gt;
&lt;p&gt;Branch Rule #1:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;500&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot; valign=&quot;top&quot;&gt;Name:&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;363&quot; valign=&quot;top&quot;&gt;Expression:&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot;&gt;Lockout&lt;/td&gt;
            &lt;td width=&quot;363&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;gt;= [mcget {session.custom.lockout}]}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Branch Rule #2:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;500&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot; valign=&quot;top&quot;&gt;Name:&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;363&quot; valign=&quot;top&quot;&gt;Expression:&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;137&quot;&gt;Allow user to continue&lt;/td&gt;
            &lt;td width=&quot;363&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;lt; [mcget {session.custom.lockout}]}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img7_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;219&quot; border=&quot;0&quot; width=&quot;500&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img7&quot; title=&quot;apm_p4img7&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img7_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Access Policy: CaptchaProj_4&lt;/h4&gt;
&lt;p&gt;The last thing you need to do is edit/customize the default &lt;i&gt;Deny&lt;/i&gt; ending (or add your own) to let the users know that they’ve been locked out and attach the ending to the branches labeled lockout.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img8_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;735&quot; border=&quot;0&quot; width=&quot;450&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img8&quot; title=&quot;apm_p4img8&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img8_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An example of this page:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img9_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e44a0fb0&#039;})&quot;&gt;&lt;img height=&quot;370&quot; border=&quot;0&quot; width=&quot;425&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;apm_p4img9&quot; title=&quot;apm_p4img9&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-Guessing_99A6-apm_p4img9_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;The Final iRule&lt;/h4&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Maxtries is a variable that sets how many times you want &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# the regular logon page to show before showing the captcha. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Timeout is a variable that sets how long a user entry will &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# persist in the session table. Lockout is a variable that sets &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# how many tries a user gets before getting locked out. This is &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# the only place you need to change these variables.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; maxtries 2&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; timeout 900&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; lockout 5&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.maxtries $maxtries&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.lockout $lockout&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;set session vars&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup -notouch $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session lookups&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$badpwd == {}} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
            &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; add $user 0 $timeout]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount $badpwd&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;$user has this number of incorrect logons(lookups): $badpwd&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;badpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;incr&lt;/span&gt; $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;goodpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; delete $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;This solution builds on everything we learned in Parts 1-3. Exposing applications or services to the Internet opens inherent security risks. APM can help by providing advanced authentication, authorization, and endpoint security checks. With a bit of customization, iRules, and creative access policies, you can provide additional security layers beyond those built as standard features in APM. This was our final solution in this series. I hope you’ve enjoyed playing with BIG-IP Access Policy Manager and now feel comfortable creating your own new and innovative solutions. Best of luck!&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;About the Author&lt;/h3&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_6.png&quot;&gt;&lt;img height=&quot;165&quot; border=&quot;0&quot; align=&quot;left&quot; width=&quot;165&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_thumb_2.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;&lt;font size=&quot;3&quot;&gt;Stephanie is a summer intern at F5, heading back to school soon to continue her EECS degree at UC Berkeley, and has been having a blast   creating interesting solutions for BIG-IP. Stephanie’s passion for engineering, and smile, is contagious.&lt;/font&gt;&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/6i1SktKpxI8&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1951660&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 19 Aug 2011 05:36:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1951660</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1951660#feedback</comments>
</item>
<item>
 <title>Scheduling BIG-IP Configuration Backups via the GUI with an iApp</title>
 <link>http://jasonrahm.ulitzer.com/node/1948095</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;&lt;p&gt;Beginning with BIG-IP version 11, the idea of templates has not only changed in amazing and powerful ways, it has been extended to be far more than just templates.&amp;#160; The replacement for templates is called iApp&lt;sup&gt;TM&lt;/sup&gt;.&amp;#160; But to call the iApp&lt;sup&gt;TM&lt;/sup&gt; just a template would be woefully inaccurate and narrow.&amp;#160; It does templates well, and takes the concept further by allowing you to re-enter a templated application and make changes.&amp;#160; Previously, deploying an application via a template was sort of like the Ron Popeil rotisserie: “Set it, and forget it!”&amp;#160; Once it was executed, the template process was over, it was up to you to track and potentially clean up all those objects.&amp;#160; Now, the application service you create based on an iApp&lt;sup&gt;TM&lt;/sup&gt; template effectively “owns” all the objects it created, so any change to the deployment adds/changes/deletes objects as necessary.&amp;#160; The other exciting change from the template perspective is the idea of strictness.&amp;#160; Once an application service is configured, any object created that is owned by that service cannot be changed outside of the service itself.&amp;#160; This means that if you want to add a pool member, it must be done within the application service, not within the pool.&amp;#160; You can turn this off, but what a powerful protection of your services!&lt;/p&gt;  &lt;h3&gt;The Problem&lt;/h3&gt;  &lt;p&gt;I received a request from one of our MVPs that he’d really like to be able to allow his users to schedule configuration backups without dropping to the command line.&amp;#160; Knowing that the iApp&lt;sup&gt;TM&lt;/sup&gt; feature was releasing soon with version 11, I started to see how I might be able to coax a command line configuration from the GUI.&amp;#160; In training, I was told that “anything you can do in tmsh, you can do with an iApp&lt;sup&gt;TM&lt;/sup&gt;.”&amp;#160; This is excellent, and the basis for why I think they are going to be incredibly popular for not only controlling and managing applications, but also for extending CLI functions to the GUI.&amp;#160; Anyway, so in order to schedule a configuration backup, I need:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A backup script&lt;/li&gt;    &lt;li&gt;A cron job to call said script&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That’s really all there is to it.&lt;/p&gt;  &lt;h3&gt;The Solution&lt;/h3&gt;  &lt;p&gt;Thankfully, the background work is already done courtesy of a &lt;a href=&quot;/wiki/AdvDesignConfig.BIG-IP-10-2-backup-script-with-SCP-transfer.ashx&quot; target=&quot;_blank&quot;&gt;config backup codeshare entry&lt;/a&gt; by community user Colin Stubbs in the &lt;a href=&quot;/wiki/AdvDesignConfig.HomePage.ashx&quot; target=&quot;_blank&quot;&gt;Advanced Design &amp;amp; Config Wiki&lt;/a&gt;.&amp;#160; I did have to update the following bigpipe lines from the script:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;bigpipe export oneline “${SCF_FILE}”&lt;/font&gt;&lt;/strong&gt; to &lt;strong&gt;tmsh save /sys config one-line file “${SCF_FILE}”&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;bigpipe export “${SCF_FILE}”&lt;/font&gt;&lt;/strong&gt; to &lt;strong&gt;tmsh save /sys config file &amp;quot;${SCF_FILE}&amp;quot;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;bigpipe config save “${UCS_FILE}”&lt;/font&gt; &lt;font color=&quot;#ff0000&quot;&gt;passphrase “${UCS_PASSPHRASE}”&lt;/font&gt;&lt;/strong&gt; to &lt;strong&gt;tmsh save /sys ucs &amp;quot;${UCS_FILE}&amp;quot; passphrase &amp;quot;${UCS_PASSPHRASE}&amp;quot;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;bigpipe config save “${UCS_FILE}”&lt;/font&gt;&lt;/strong&gt; to &lt;strong&gt;tmsh save /sys ucs &amp;quot;${UCS_FILE}&amp;quot;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also, I created (according the script comments from the codeshare entry) a /var/local/bin directory to place the script and a /var/local/backups directory for the script to dump the backup files in.&amp;#160; These are optional and can be changed as necessary in your deployment, you’ll just need to update the script to reflect your file system preferences.&amp;#160; Now that I have everything I need to support a backup, I can move on to the iApp&lt;sup&gt;TM&lt;/sup&gt; template configuration.&lt;/p&gt;  &lt;h3&gt;iApp&lt;sup&gt;TM&lt;/sup&gt; Components&lt;/h3&gt;  &lt;p&gt;A template consists of three parts: implementation, presentation, and help.&amp;#160; You can create an empty template, or just start with presentation or help if you like.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The implementation is tmsh script language, based on the Tcl language so loved by all of us iRulers.&amp;#160; Please reference the &lt;a href=&quot;/wiki/TMSH.HomePage.ashx&quot; target=&quot;_blank&quot;&gt;tmsh wiki&lt;/a&gt; for the available tmsh extensions to the Tcl language.&lt;/li&gt;    &lt;li&gt;The presentation is written with the Application Presentation Language, or APL, which is new and custom-built for templates.&amp;#160; It is defined on the &lt;a href=&quot;/wiki/iApp.APL.ashx&quot; target=&quot;_blank&quot;&gt;APL page&lt;/a&gt; in the &lt;a href=&quot;/wiki/iApp.HomePage.ashx&quot; target=&quot;_blank&quot;&gt;iApp&lt;sup&gt;TM&lt;/sup&gt; wiki&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;The help is written in HTML, and is used to guide users in the use of the template.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I’ll focus on the presentation first, and then the implementation.&amp;#160; I’ll forego the help section in this article.&lt;/p&gt;  &lt;h3&gt;Presentation&lt;/h3&gt;  &lt;p&gt;The reason I’m starting with the presentation section of the template is that the implementation section’s Tcl variables reflect the presentation methods naming conventions.&amp;#160; I want to accomplish a few things in the template presentation:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Ask users for the frequency of backups (daily, weekly, monthly)&lt;/li&gt;    &lt;li&gt;If weekly, ask for the day of the week&lt;/li&gt;    &lt;li&gt;If monthly, ask for the day of the month and provide a warning about days 29-31&lt;/li&gt;    &lt;li&gt;For all frequencies, ask for the hour and minute the backup should occur&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The APL code for this looks like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;section time_select {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  choice day_select display &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;large&amp;quot;&lt;/span&gt; { &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Daily&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Weekly&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Monthly&amp;quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  optional ( day_select == &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Weekly&amp;quot;&lt;/span&gt; ) {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    choice dow_select display &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; { &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Sunday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Monday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Tuesday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Wednesday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Thursday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Friday&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Saturday&amp;quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  optional ( day_select == &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Monthly&amp;quot;&lt;/span&gt; ) {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    message dom_warning &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;The day of the month should be the 1st-28th.  Selecting the 29th-31st will result in missed backups on some months.&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    choice dom_select display &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; tcl {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; { set x 1 } { $x &amp;lt; 32 } { incr x } {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;        append dom &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;$x\n&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;      }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; $dom&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  }    &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  choice hr_select display &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; tcl {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; { set x 0 } { $x &amp;lt; 24 } { incr x} {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;      append hrs &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;$x\n&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; $hrs&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  choice min_select display &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;medium&amp;quot;&lt;/span&gt; tcl {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; { set x 0 } { $x &amp;lt; 60 } { incr x } {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;      append mins &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;$x\n&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; $mins&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;text {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Backup Schedule&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.day_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Choose the frequency the backup should occur:&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.dow_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Choose the day of the week the backup should occur:&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.dom_warning &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;WARNING: &amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.dom_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Choose the day of the month the backup should occur:&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.hr_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Choose the hour the backup should occur:&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;  time_select.min_select &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Choose the minute the backup should occur:&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 10pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 10pt; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few things to point out.&amp;#160; First, the &lt;a href=&quot;/wiki/iApp.section.ashx&quot; target=&quot;_blank&quot;&gt;sections&lt;/a&gt; (which can’t be nested) provide a way to set apart functional differences in your form.&amp;#160; I only needed one here, but it’s very useful if I were to build on and add options for selecting a UCS or SCF format, or specifying a mail address for the backups to be mailed to.&amp;#160; Second, order matters.&amp;#160; The objects will be displayed in the template as you define them.&amp;#160; Third, the &lt;a href=&quot;/wiki/iApp.optional.ashx&quot; target=&quot;_blank&quot;&gt;optional&lt;/a&gt; command allows me to hide questions that wouldn’t make sense given previous answers.&amp;#160; If you dig into some of the canned templates shipping with v11, you’ll also see another use case for the optional command.&amp;#160; Fourth, you can use Tcl commands to populate fields for you.&amp;#160; This can be generated data like I did above, or you can loop through configuration objects to present in the template as well.&amp;#160; Finally, the text section is where you define the language you want to appear with each of your objects.&amp;#160; The nomenclature here is section.variable.&amp;#160; To give you an idea what this looks like, here is a screenshot of a monthly backup configuration:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5b2150edf5c1_CD28-iapp_config_archive_3_2.png&quot;  class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;962d10d7&#039;})&quot; &gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;iapp_config_archive_3&quot; border=&quot;0&quot; alt=&quot;iapp_config_archive_3&quot; title=&quot;iapp_config_archive_3&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-5b2150edf5c1_CD28-iapp_config_archive_3_thumb.png&quot; width=&quot;504&quot; height=&quot;250&quot; /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Once my template (f5.archiving) is saved, I can configure it in the Application Services section by selecting the template.&amp;#160; At this point, I have a functioning presentation, but with no implementation, it’s effectively useless.&lt;/p&gt;

&lt;h3&gt;Implementation&lt;/h3&gt;

&lt;p&gt;Now that the presentation is complete, I can move on to an implementation.&amp;#160; I need to do a couple things in the implementation:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Grab the data entered into the application service&lt;/li&gt;

  &lt;li&gt;Convert the day of week information from long name to the appropriate 0-6 (or 1-7) number for cron&lt;/li&gt;

  &lt;li&gt;Use that data to build a cron file (statically assigned at this point to /etc/cron.d/f5backups)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the implementation section:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;array set dow_map {
    &lt;br /&gt;&amp;#160; Sunday 0

    &lt;br /&gt;&amp;#160; Monday 1

    &lt;br /&gt;&amp;#160; Tuesday 2

    &lt;br /&gt;&amp;#160; Wednesday 3

    &lt;br /&gt;&amp;#160; Thursday 4

    &lt;br /&gt;&amp;#160; Friday 5

    &lt;br /&gt;&amp;#160; Saturday 6

    &lt;br /&gt;}&lt;/p&gt;

  &lt;p&gt;set hr $::time_select__hr_select
    &lt;br /&gt;set min $::time_select__min_select&lt;/p&gt;

  &lt;p&gt;set infile [open &amp;quot;/etc/cron.d/f5backups&amp;quot; &amp;quot;w&amp;quot; &amp;quot;0755&amp;quot;]&lt;/p&gt;

  &lt;p&gt;puts $infile &amp;quot;SHELL=\/bin\/bash&amp;quot;
    &lt;br /&gt;puts $infile &amp;quot;PATH=\/sbin:\/bin:\/usr\/sbin:\/usr\/bin&amp;quot;

    &lt;br /&gt;puts $infile &amp;quot;#MAILTO=user@somewhere&amp;quot;

    &lt;br /&gt;puts $infile &amp;quot;HOME=\/var\/tmp\/&amp;quot;

    &lt;br /&gt;if { $::time_select__day_select == &amp;quot;Daily&amp;quot; } {

    &lt;br /&gt;&amp;#160; puts $infile &amp;quot;$min $hr * * * root \/bin\/bash \/var\/local\/bin\/f5backup.sh 1&amp;gt;\/var\/tmp\/f5backup.log 2&amp;gt;\&amp;amp;1&amp;quot;

    &lt;br /&gt;} elseif { $::time_select__day_select == &amp;quot;Weekly&amp;quot; } {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; puts $infile &amp;quot;$min $hr * * $dow_map($::time_select__dow_select) root \/bin\/bash \/var\/local\/bin\/f5backup.sh 1&amp;gt;\/var\/tmp\/f5backup.log 2&amp;gt;\&amp;amp;1&amp;quot;

    &lt;br /&gt;} elseif { $::time_select__day_select == &amp;quot;Monthly&amp;quot; } {

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; puts $infile &amp;quot;$min $hr $::time_select__dom_select * * root \/bin\/bash \/var\/local\/bin\/f5backup.sh 1&amp;gt;\/var\/tmp\/f5backup.log 2&amp;gt;\&amp;amp;1&amp;quot;

    &lt;br /&gt;}&lt;/p&gt;

  &lt;p&gt;close $infile&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few notes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The dow_map array is to convert the selected day (ie, Saturday) to a number for cron (6).&lt;/li&gt;

  &lt;li&gt;The variables in the implementation section reference the data supplied from the presentation like so:&lt;/li&gt;

  &lt;ol&gt;
    &lt;li&gt;$::&amp;lt;section&amp;gt;__&amp;lt;presentation variable name&amp;gt; (Note the double underscore between them.&amp;#160; As such, &lt;strong&gt;DO NOT&lt;/strong&gt; use double underscores in your presentation variables)&lt;/li&gt;
  &lt;/ol&gt;

  &lt;li&gt;tmsh special characters need to be escaped if you’re using them for strings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A succesful configuration of the application service results in this file configuration for /etc/cron.d/f5backups:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;SHELL=/bin/bash
    &lt;br /&gt;PATH=/sbin:/bin:/usr/sbin:/usr/bin

    &lt;br /&gt;#MAILTO=user@somewhere

    &lt;br /&gt;HOME=/var/tmp/

    &lt;br /&gt;54 15 * * * root /bin/bash /var/local/bin/f5backup.sh 1&amp;gt;/var/tmp/f5backup.log 2&amp;gt;&amp;amp;1

    &lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So this backup is scheduled to run daily at 15:54.&amp;#160; This is confirmed with this directory listing on my BIG-IP:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[root@golgotha:Active] bin # ls -las /var/local/backups
    &lt;br /&gt;total 2168

    &lt;br /&gt;&amp;#160;&amp;#160; 8 drwx------ 2 root root&amp;#160;&amp;#160;&amp;#160; 4096 Aug 16 15:54 .

    &lt;br /&gt;&amp;#160;&amp;#160; 8 drwxr-xr-x 9 root root&amp;#160;&amp;#160;&amp;#160; 4096 Aug&amp;#160; 3 14:44 ..

    &lt;br /&gt;1076 -rw-r--r-- 1 root root 1091639 Aug 15 15:54 f5backup-golgotha.test.local-20110815155401.tar.bz2

    &lt;br /&gt;1076 -rw-r--r-- 1 root root 1092259 Aug 16 15:54 f5backup-golgotha.test.local-20110816155401.tar.bz2

    &lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;This is just scratching the surface of what can be done with the new iApp&lt;sup&gt;TM&lt;/sup&gt; feature in v11.&amp;#160; I didn’t even cover the ability to use presentation and implementation libraries, but that will be covered in due time.&amp;#160; If you’re impatient, there are already several examples (including this one here) in the &lt;a href=&quot;/wiki/iApp.CodeShare.ashx&quot; target=&quot;_blank&quot;&gt;codeshare&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;/iapp&quot;&gt;F5 DevCentral &amp;gt; Community &amp;gt; Group Details - iApp&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/wiki/iApp.HomePage.ashx&quot;&gt;iApp Wiki Home - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/weblogs/dctv/archive/2011/08/01/f5-agility-2011-james-hendergart-on-iapp.aspx&quot;&gt;F5 Agility 2011 - James Hendergart on iApp&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/wiki/iApp.Codeshare.ashx&quot;&gt;iApp Codeshare - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/wiki/iApp.iApp_lab4.ashx&quot;&gt;iApp Lab 5 - Priority Group Activation - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/wiki/iApp.iApp-Template-Development-Tips-and-Techniques.ashx&quot;&gt;iApp Template Development Tips and Techniques - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;/weblogs/macvittie/category/1088510.aspx&quot;&gt;Lori MacVittie - iApp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;d_itc_f&quot; style=&quot;clear:both;height:11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/ztasTrCyQPQ&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1948095&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 16 Aug 2011 10:45:43 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1948095</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1948095#feedback</comments>
</item>
<item>
 <title>Preventing Brute Force Password Guessing Attacks with APM–Part 3</title>
 <link>http://jasonrahm.ulitzer.com/node/1943194</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;F5er and DevCentral community member ystephie is back with another great solution (check out her first solution here: &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-
IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM Customized Logon Page&lt;/a&gt;), this time tackling brute force attacks utilizing customizations with the BIG-IP Access Policy Manager.&amp;#160; This solution requires   BIG-IP 10.2.2 Hotfix 1 or later.&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Exposing applications or services to the Internet opens inherent security risks. BIG-IP Access Policy Manager (APM) provides edge authentication and access control services for applications, BIG-IP Edge   Gateway provides secure SSL VPN services, and BIG-IP Application Security Manager (ASM) provides protection against a variety of attacks. In this series of APM deployment examples, we cover a couple   techniques for protecting against brute force password-guessing attacks.&lt;/p&gt;
&lt;p&gt;In our first example (&lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086474/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-1.aspx&quot;&gt;Part 1&lt;/a&gt;), we   walked through the process of including a CAPTCHA on the APM logon page via a web service (Google reCAPTCHA project), to provide some protection against script based or other automated attacks.&lt;/p&gt;
&lt;p&gt;In our second example (&lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086477/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-2.aspx&quot;&gt;Part 2&lt;/a&gt;), we   modified our configuration to only display the CAPTCHA challenge if a user has previously failed authentication (by checking the user’s badPwdCount attribute from Active Directory).&lt;/p&gt;
&lt;p&gt;In this third example, we’ll build on the previous example but keep track of authentication failures ourselves on box (through use of an iRules Session Table). This will remove the dependency on Active   Directory and solves the issue around tracking failures for invalid users (providing the same external behavior, whether a user is valid or invalid).&lt;/p&gt;
&lt;h3&gt;Replacing the AD Query with an iRules Session Table&lt;/h3&gt;
&lt;p&gt;As we explained in the previous example, we’d rather not inconvenience users by forcing a CAPTCHA challenge on them unless we start seeing authentication failures. Using iRules, we can create a Session   Table that keeps track of all the usernames and number of failed authentication attempts for each user. Since we’re tracking all authentication failures (for both valid and invalid users), we can increase   the number of failures before showing the CAPTCHA challenge without giving a hacker any hint about who might be a valid user (opening for a username guessing attack). With the Active Directory badPwdCount   technique, we could only track failures for valid AD users. With the Session Table iRules approach, you can set policies around how long before resetting a user’s bad authentication count, as well as how   many authentication failures to allow before forcing a CAPTCHA challenge. Here’s a bit more on the iRules Table command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2375/v101--The-table-Command--The-Basics.aspx&quot;&gt;Table Command Article Series&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;/wiki/iRules.table.ashx&quot;&gt;Table Command Wiki Entry&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some pretty powerful stuff here, and a good place to track other bits of information across APM user sessions. For example, this example could be extended to track and compare geo IP location data across   user sessions to detect suspicious activity. (See &lt;a target=&quot;_blank&quot; href=&quot;/wiki/APM.AccessPolicyGeolocation.ashx&quot;&gt;APM Access Policy Geolocation&lt;/a&gt;&amp;#160; for an example where we look up a user’s geolocation   information via iRules.) In this example, we’ll be using a combined logon page with both username/password and CAPTCHA challenge as in Part 1. Before we begin, please create a new access policy, set up an   HTTP Auth Agent as described in Part 1, as well as an authentication server (e.g. Active Directory, RADIUS, LDAP).&lt;/p&gt;
&lt;h3&gt;Access Policy Overview&lt;/h3&gt;
&lt;p&gt;The following behavior is what we want to accomplish with our access policy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. A user wants to logon for the first time. He’ll see the standard APM logon page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img1.png&quot;&gt;&lt;img height=&quot;538&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img1.png&quot; title=&quot;apm_p3img1&quot; alt=&quot;apm_p3img1&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If the user passes our Active Directory authentication (or your choice of auth factor), the user will be allowed access to the SSL VPN.&lt;/li&gt;
    &lt;li&gt;If the user fails authentication, we want to first add him to our Session Table and check to see if the user has maxed out his authentication tries (set in the iRule). Please see logic in red   below.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;when ACCESS_POLICY_AGENT_EVENT {      &lt;br /&gt;
&amp;#160; # Maxtries is a variable that sets how many times you want the regular       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; # logon page to show before showing the CAPTCHA. Timeout is a variable       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; # that sets how long a user entry will persist in the session table.       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; # This is the only place you need to change these variables.       &lt;br /&gt;
&amp;#160; set maxtries 2       &lt;br /&gt;
&amp;#160; set timeout 900       &lt;br /&gt;
&amp;#160; set user [ACCESS::session data get session.logon.last.username]       &lt;br /&gt;
&amp;#160; ACCESS::session data set session.custom.maxtries $maxtries       &lt;br /&gt;
&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt; if {[ACCESS::policy agent_id] eq &quot;session lookups&quot;} {        &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; set badpwd [table lookup $user]         &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if {$badpwd == {}} {         &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set badpwd [table add $user 0 $timeout]         &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ACCESS::session data set session.custom.badpwdcount $badpwd         &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; # log local0. &quot;$user has this number of incorrect logons: $badpwd&quot;         &lt;br /&gt;
&amp;#160; }         &lt;br /&gt;
&lt;/font&gt;&amp;#160; if {[ACCESS::policy agent_id] eq &quot;badpwd&quot;} {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; table incr $user       &lt;br /&gt;
&amp;#160; }       &lt;br /&gt;
&amp;#160; if {[ACCESS::policy agent_id] eq &quot;goodpwd&quot;} {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; table delete $user       &lt;br /&gt;
&amp;#160; }       &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;If we detect that the user maxed out his authentication tries, the next logon page should be one with a CAPTCHA challenge included.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img2.png&quot;&gt;&lt;img height=&quot;568&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img2.png&quot; title=&quot;apm_p3img2&quot; alt=&quot;apm_p3img2&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If we detect that the user hasn’t maxed out his authentication tries, the next logon page should be the APM logon page with some helpful text that tells the user that his credentials were incorrect   and to try again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img3.png&quot;&gt;&lt;img height=&quot;632&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img3.png&quot; title=&quot;apm_p3img3&quot; alt=&quot;apm_p3img3&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: The user will continue to return to this logon page with the error message until they exceed the max tries threshold. Once the user exceeds the threshold, we need to take them to the logon   page with the CAPTCHA challenge.&lt;/p&gt;
&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;p&gt;2. A user comes back to the logon page after closing the previous (failed) session. Since this user is already in our Session Table, we can check immediately how many times this user has failed   authentication.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If this user hasn’t reached the max authentication tries threshold, we can send him to the error message logon page as usual.&lt;/li&gt;
    &lt;li&gt;If this user has already reached the max tries threshold, we run into a problem. Should we send them directly to the CAPTCHA challenge page and ignore the credentials they just entered? Or can we   just ask them to enter a CAPTCHA challenge without reentering their credentials? In our example, we’re doing the latter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img4.png&quot;&gt;&lt;img height=&quot;702&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img4.png&quot; title=&quot;apm_p3img4&quot; alt=&quot;apm_p3img4&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;How can we make it so that the various types of logon pages come one after another seamlessly without creating a very long access policy? A neat trick we can use is APM’s redirect ending. The redirect   ending can be used to send a user to any URL. But in our case, we want to direct the access policy to return to the very beginning of the access policy (the “Start” block), without asking the user to click   on a link such as in a deny ending.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/apm_p3img5.png&quot;&gt;&lt;img height=&quot;634&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img5.png&quot; title=&quot;apm_p3img5&quot; alt=&quot;apm_p3img5&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After clicking &lt;b&gt;Edit Endings&lt;/b&gt; in the VPE, add two redirect endings the way I have it above. The URL field should be the virtual server with “/captcha” or “/error” appended to it. Those paths allow us   to pass some context about the results of the previous run through the access policy. With each new access policy run, all information about the previous run is forgotten (a new session is created). But,   what if I needed to know if the user had already maxed out their authentication failures and needed the CAPTCHA challenge? That’s how these redirects come into play. We can just attach a path to the end of   the redirect URL.&lt;/p&gt;
&lt;p&gt;Now that we know how to redirect users back to the start of access policy, how do we tell “/captcha” apart from “/error”? Well, with a block called &lt;b&gt;Landing URI&lt;/b&gt;, we can change the behavior of a new   run through the access policy depending on the results from the previous run. In the branch rules of the &lt;b&gt;Landing URI&lt;/b&gt; block have the following expressions under advanced. The Landing URI block looks   for the landing uri which is the path we appended in the redirect ending.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img6.png&quot;&gt;&lt;img height=&quot;702&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img6.png&quot; title=&quot;apm_p3img6&quot; alt=&quot;apm_p3img6&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;600&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;246&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;354&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;246&quot;&gt;Direct to Captcha&lt;/td&gt;
            &lt;td width=&quot;354&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.server.landinguri}] == “/captcha” || [mcget {session.server.landinguri}] == “/captcha/” }&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;246&quot;&gt;Direct to logon page with err msg&lt;/td&gt;
            &lt;td width=&quot;354&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.server.landinguri}] == “/error” || [mcget {session.server.landinguri}] == “/error/” }&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;With this, we can take a different path depending on the information passed from the redirect ending (captcha or error). The following is the access policy where you can see both the initial Landing URI   block and final Redirect endings.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img7.png&quot;&gt;&lt;img height=&quot;228&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img7.png&quot; title=&quot;apm_p3img7&quot; alt=&quot;apm_p3img7&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let’s now step through the paths a user may follow, and review the logic in the access policy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. The user follows the “fallback” normal path (no previous redirect), enters their credentials, and goes through the iRule lookups and Auth macro. This macro will help us determine if they’re allowed   access to the SSL VPN service or web app, sent to the &lt;i&gt;Error Logon Page&lt;/i&gt; (via the Redirect to Error ending), or &lt;i&gt;Captcha Logon Page&lt;/i&gt; (via the Redirect to Captcha ending).&lt;/p&gt;
&lt;p&gt;2. The user fails authentication somewhere in the access policy but not enough times to reach &lt;i&gt;maxtries&lt;/i&gt;. In this case, the user gets sent to the &lt;i&gt;Error Logon Page &lt;/i&gt;via the Redirect to Error   redirect ending. The &lt;i&gt;Error Logon Page&lt;/i&gt; block is the regular logon page with a message that informs the user that they have entered incorrect credentials.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;To add the error message to the standard logon page, add the following html code to &lt;b&gt;Form Header Text&lt;/b&gt; in the VPE:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img8.png&quot;&gt;&lt;img height=&quot;706&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img8.png&quot; title=&quot;apm_p3img8&quot; alt=&quot;apm_p3img8&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3. The user either failed authentication somewhere in the access policy and reached &lt;i&gt;maxtries,&lt;/i&gt; or failed the CAPTCHA challenge inside the &lt;i&gt;Captcha Auth w AD Auth&lt;/i&gt; macro above. In either of   these cases, the user gets redirected to &lt;i&gt;CAPTCHA Auth w AD Auth&lt;/i&gt; (again with the Redirect to Captcha redirect ending) which has a CAPTCHA challenge page with username/password fields. We will continue   to redirect to this page until the user enters correct credentials and CAPTCHA challenge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img9.png&quot;&gt;&lt;img height=&quot;382&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img9.png&quot; title=&quot;apm_p3img9&quot; alt=&quot;apm_p3img9&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Visual Policy Editor Macros&lt;/h3&gt;
&lt;p&gt;Macros are an important addition in the VPE because it allows us to manage one configuration block and use it in several places within an access policy. This way, we avoid having to change or add blocks   that have the same behavior in more than one place within the VPE. Macros are also a great way to maintain a simple to understand top level policy (readability).&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img10.png&quot;&gt;&lt;img height=&quot;228&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img10.png&quot; title=&quot;apm_p3img10&quot; alt=&quot;apm_p3img10&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are four macros total in the access policy. You can see &lt;i&gt;Captcha Auth w AD Auth&lt;/i&gt; and &lt;i&gt;iRule Lookups and Auth&lt;/i&gt; in this top-level access policy. There are two additional macros (&lt;i&gt;AD Auth   and iRule &lt;/i&gt;and &lt;i&gt;Verify with Captcha&lt;/i&gt;) that are used within the first two macros (nested macros). The purpose of the macro &lt;i&gt;AD Auth and iRule&lt;/i&gt; is used for authentication and to trigger an iRule   for updating our Session Table (for tracking users and authentication failures). On authentication failure, it also compares the bad authentication count with maxtries to determine where to send the user   next.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img11.png&quot;&gt;&lt;img height=&quot;115&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img11.png&quot; title=&quot;apm_p3img11&quot; alt=&quot;apm_p3img11&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This macro first authenticates the user (please remember to change the &lt;i&gt;Max Logon Attempts Allowed&lt;/i&gt; in the &lt;b&gt;AD Auth&lt;/b&gt; to 1).&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img12.png&quot;&gt;&lt;img height=&quot;190&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img12.png&quot; title=&quot;apm_p3img12&quot; alt=&quot;apm_p3img12&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If the user passes authentication, the &lt;b&gt;iRule Event goodpwd&lt;/b&gt; (with ID “goodpwd”) triggers an iRule event that removes the user from the Session Table.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  ...&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;goodpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# delete the user, they passed authentication,&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# so we don&#039;t need to remember their badpwdcount anymore&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; delete $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The user is then assigned resources and allowed access (to the SSL VPN service or web application). If the user fails authentication, the &lt;b&gt;iRule Event badpwd&lt;/b&gt; (with ID “badpwd”) triggers an iRule   event that increments the user’s bad password count by one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  …&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;badpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Increment the badpwdcount,&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# This user just failed authentication.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;incr&lt;/span&gt; $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  …&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;b&gt;Variable Assign&lt;/b&gt; block with the following configuration, increments the bad password count within the active executing policy.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img13.png&quot;&gt;&lt;img height=&quot;372&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img13.png&quot; title=&quot;apm_p3img13&quot; alt=&quot;apm_p3img13&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;600&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;232&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Custom Variable:&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;368&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Custom Expression:&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width=&quot;232&quot; valign=&quot;top&quot;&gt;session.custom.badpwdcount&lt;/td&gt;
            &lt;td width=&quot;368&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}]+1}&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;After the user fails authentication once, we must be sure to compare the &lt;i&gt;badpwdcount&lt;/i&gt; (custom session variable name for bad password count) against &lt;i&gt;maxtries&lt;/i&gt; (custom session variable name for   max tries) so that we can determine whether or not to send them to a logon page with CAPTCHA challenge next or to a regular logon page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please note that session.custom.maxtries is a custom APM session variable initialized as part of the iRule. The session.custom.badpwdcount APM session variable is also set as part of the iRule shown later   (count pulled from the iRule table).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We accomplish this comparison using an &lt;b&gt;Empty&lt;/b&gt; block with the following branch rule.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img14.png&quot;&gt;&lt;img height=&quot;208&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img14.png&quot; title=&quot;apm_p3img14&quot; alt=&quot;apm_p3img14&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;600&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;190&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;410&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width=&quot;190&quot; valign=&quot;top&quot;&gt;User may try again&lt;/td&gt;
            &lt;td width=&quot;410&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;lt; [mcget {session.custom.maxtries}] }&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You may have noticed that the endings shown (Successful, Redirect to Error, and Redirect to Captcha) are different from the default endings. To edit endings, click on &lt;b&gt;Edit Terminals&lt;/b&gt; and add/edit   the terminals to match the figure below. You can also edit the colors.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img15.png&quot;&gt;&lt;img height=&quot;750&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_p3img15.png&quot; title=&quot;apm_p3img15&quot; alt=&quot;apm_p3img15&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The macro, &lt;i&gt;Captcha Auth w AD Auth&lt;/i&gt; is there to display the logon page with CAPTCHA challenge and authenticate the CAPTCHA via the &lt;b&gt;HTTP Auth&lt;/b&gt; agent. If the user passes the CAPTCHA, we will   authenticate them with our regular Active Directory auth agent.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img16_2.png&quot;&gt;&lt;img height=&quot;415&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img16_thumb.png&quot; title=&quot;apm_p3img16&quot; alt=&quot;apm_p3img16&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the access policy, the Landing URI will direct to this macro (&lt;i&gt;Captcha Auth w AD Auth&lt;/i&gt;) if it sees that the landing uri contains the string “/captcha”.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img17_2.png&quot;&gt;&lt;img height=&quot;242&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img17_thumb.png&quot; title=&quot;apm_p3img17&quot; alt=&quot;apm_p3img17&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img18_2.png&quot;&gt;&lt;img height=&quot;150&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img18_thumb.png&quot; title=&quot;apm_p3img18&quot; alt=&quot;apm_p3img18&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note that the &lt;i&gt;Captcha Auth w AD Auth&lt;/i&gt; macro above is almost the same as the policy you created in Part 1 of this series, but includes the &lt;i&gt;AD Auth and iRule&lt;/i&gt; macro covered earlier.&lt;/p&gt;
&lt;p&gt;The next macro is a slight variation of the macro above. In fact the only difference is that &lt;i&gt;Captcha Logon Page&lt;/i&gt; block above has username/password inputs plus the CAPTCHA challenge while &lt;i&gt;Verify   Logon Page&lt;/i&gt; block below only has the CAPTCHA challenge like we created in Part 2 of this series.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img19_2.png&quot;&gt;&lt;img height=&quot;713&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img19_thumb.png&quot; title=&quot;apm_p3img19&quot; alt=&quot;apm_p3img19&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The reason we have the macro below is to avoid asking a user to re-enter their credentials again (if we determine they need to pass the CAPTCHA challenge only after already collecting their username and   password).&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img20_2.png&quot;&gt;&lt;img height=&quot;150&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img20_thumb.png&quot; title=&quot;apm_p3img20&quot; alt=&quot;apm_p3img20&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The last and final macro below helps us decide if we should authenticate the user or send the user to a CAPTCHA challenge.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img21_2.png&quot;&gt;&lt;img height=&quot;255&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img21_thumb.png&quot; title=&quot;apm_p3img21&quot; alt=&quot;apm_p3img21&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We start with the &lt;b&gt;iRule Event session lookups&lt;/b&gt; block (with ID “session lookups”).&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Maxtries is a variable that sets how many times you want the regular&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# logon page to show before showing the CAPTCHA. Timeout is a variable&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# that sets how long a user entry will persist in the session table.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# This is the only place you need to change these variables.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# we set how many tries we want to give a user here&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; maxtries 2&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# we set how long we want to keep a user in the Session Table here&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; timeout 900&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# we retrieve the username information from the session var&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# set the session variable maxtries so we can compare it to our badpwdcount&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.maxtries $maxtries &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session lookups&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# look up the user, if the user isn’t already in the Session Table, add it.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
            &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$badpwd == {}} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; add $user 0 $timeout]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
            &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# set the session variable badpwdcount so we can compare it to our maxtries&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
      &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount $badpwd&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;$user has this number of incorrect logons: $badpwd&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  …&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;We will trigger an iRule that checks our iRule session table and determines how many &lt;i&gt;badpwdcounts&lt;/i&gt; a particular user has. If a user has not been entered into our database, this event adds the user   to the table with &lt;i&gt;badpwdcount&lt;/i&gt; equal to zero. The iRule block also has several branch rules shown below.&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; width=&quot;600&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;center&quot; width=&quot;232&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;
            &lt;td align=&quot;center&quot; width=&quot;368&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width=&quot;232&quot; valign=&quot;top&quot;&gt;Send users to the CAPTCHA&lt;/td&gt;
            &lt;td width=&quot;368&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;gt;= [mcget {session.custom.maxtries}] }&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width=&quot;232&quot; valign=&quot;top&quot;&gt;The user may authenticate&lt;/td&gt;
            &lt;td width=&quot;368&quot; valign=&quot;top&quot;&gt;expr { [mcget {session.custom.badpwdcount}] &amp;lt; [mcget {session.custom.maxtries}] }&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Let’s review the behavior here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. The user has failed authentication too many times, we will go down the &lt;i&gt;Send users to the Captcha&lt;/i&gt; branch. When we reach the &lt;i&gt;Verify with Captcha Page&lt;/i&gt; macro, the user is prompted with a   plain CAPTCHA challenge. By only showing the plain CAPTCHA challenge, the user doesn’t have to reenter their credentials. If they pass the CAPTCHA, they are allowed to authenticate against AD. If they fail   either the CAPTCHA challenge or &lt;b&gt;AD Auth&lt;/b&gt;, they’ll be redirected to the beginning of the access policy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img23_2.png&quot;&gt;&lt;img height=&quot;368&quot; border=&quot;0&quot; width=&quot;304&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img23_thumb.png&quot; title=&quot;apm_p3img23&quot; alt=&quot;apm_p3img23&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2. If the user hasn’t failed authentication too many times, we will authenticate them right away using the &lt;i&gt;AD Auth and iRule&lt;/i&gt; macro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Access Policy – Putting it all Together&lt;/h3&gt;
&lt;p&gt;Now we’re ready to revisit our complete access policy. Please see below.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-apm_p3img22_2.png&quot;&gt;&lt;img height=&quot;228&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-Password-
Guessing_B9FE-apm_p3img22_thumb.png&quot; title=&quot;apm_p3img22&quot; alt=&quot;apm_p3img22&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We were able to accomplish the desired behavior with our access policy with the help of iRule Session Tables, redirect endings, macros and Landing URI functionality. With the combined help of the Landing   URI and redirect ending, we make switching between different logon pages seamless. Using Session Tables we were able to track authentication failures for all users, valid or not. The point of tracking all   users (whether they exist in Active Directory or not), is to ensure that a hacker can’t see any difference in behavior and guess valid user names. Finally, macros help us simplify our access policy (more   readable). The last step is to attach the following iRule to the access policy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Maxtries is a variable that sets how many times you want the regular&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# logon page to show before showing the CAPTCHA. Timeout is a variable&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# that sets how long a user entry will persist in the session table. &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# This is the only place you need to change these variables.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; maxtries 2 &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; timeout 900&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; user [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.maxtries $maxtries&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session lookups&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; lookup $user]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$badpwd == {}} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
          &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; badpwd [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; add $user 0 $timeout]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.custom.badpwdcount $badpwd&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;$user has this number of incorrect logons: $badpwd&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;badpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;incr&lt;/span&gt; $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::policy&lt;/span&gt; agent_id] eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;goodpwd&quot;&lt;/span&gt;} {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;table&lt;/span&gt; delete $user&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Final Notes&lt;/h3&gt;
&lt;p&gt;This solution is a more complex example where we created an advanced access policy with macros, along with APM iRules events, redirect endings, and iRules plus session table, to track authentication   failures across user sessions. In part 4, we’ll make some minor modifications to this policy to also support a temporary lockout of users after failing authentication too many times. This provides a more   complete solution for blocking credentials guessing attacks, and can help protect against DOS attacks towards internal AD servers (where it might be possible to lock a user out of the internal corporate   Active Directory server via too many authentication failures).&lt;/p&gt;
&lt;h3&gt;About the Author&lt;/h3&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;d2ac41ca&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_6.png&quot;&gt;&lt;img height=&quot;165&quot; border=&quot;0&quot; align=&quot;left&quot; width=&quot;165&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-Preventing-Brute-Force-
Password-Guessing_B9FE-image_thumb_2.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;&lt;font size=&quot;3&quot;&gt;Stephanie is a summer intern at F5, heading back to school soon to continue her EECS degree at UC Berkeley, and has been having a blast   creating interesting solutions for BIG-IP. Stephanie’s passion for engineering, and smile, is contagious.&lt;/font&gt;&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/wWmyGk8yE3k&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1943194&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 11 Aug 2011 00:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1943194</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1943194#feedback</comments>
</item>
<item>
 <title>iRules 101–#18–Revisiting the TCL Scan Command</title>
 <link>http://jasonrahm.ulitzer.com/node/1939885</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;I covered the &lt;a target=&quot;_blank&quot; href=&quot;http://tmml.sourceforge.net/doc/tcl/scan.html&quot;&gt;Tcl scan command&lt;/a&gt; back in the &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2346/iRules-101--16--Parsing-Strings-with-the-TCL-Scan-Command.aspx&quot;&gt;iRules 101 – #16 – Parsing Strings with the TCL Scan Command&lt;/a&gt;, but this example (by Hoolio, who else?) was too good not to share with the community. The request involved parsing a log entry as efficiently as possible.&amp;#160; The log entry is as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aug 05 08:01:13 ethos-re0 (FPC Slot 1, PIC Slot 1) TEST-{ss-nat-2}[FWNAT]: ASP_SFW_CREATE_ACCEPT_FLOW: proto 1 (ICMP ECHO REQUEST) application: icmp, xe- 0/0/0.21:10.1.1.1:33639 -&amp;gt; 192.168.22.254, creating forward or watch flow ; source address and identifier translate to 172.16.4.32:1135&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The goal is to pull out the origin IP address (10.1.1.1) and the translation IP and port (172.16.4.32, 1135, respectively).&amp;#160; This &lt;em&gt;could&lt;/em&gt; be done with a lot of lindex/split combinations, but this requirement is what the&lt;strong&gt; scan&lt;/strong&gt; command is made for.&amp;#160; Before moving on to the formatting, let’s break this string into chunks that we can match on. We want to parse as few fields as possible, so we can match all the way to the first “/”, then the first “:” to get to the IP address.&amp;#160; Then we move along to the first “;”, and further to the next digits, and finally to the last “:”.&amp;#160; The strings we’ll build are formatting around are thus:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Aug 05 08:01:13 ethos-re0 (FPC Slot 1, PIC Slot 1) TEST-{ss-nat-2}[FWNAT]: ASP_SFW_CREATE_ACCEPT_FLOW: proto 1 (ICMP ECHO REQUEST) application: icmp, xe- 0/&lt;/li&gt;
    &lt;li&gt;0/0.21:&lt;/li&gt;
    &lt;li&gt;10.1.1.1:&lt;/li&gt;
    &lt;li&gt;33639 -&amp;gt; 192.168.22.254, creating forward or watch flow ;&lt;/li&gt;
    &lt;li&gt;source address and identifier translate to&lt;/li&gt;
    &lt;li&gt;172.16.4.32:&lt;/li&gt;
    &lt;li&gt;1135&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only fields we really care about here are 3, 6, &amp;amp; 7.&amp;#160; There are options with formatting around fields you don’t want, I’ll show both below.&lt;/p&gt;
&lt;h3&gt;Option 1 – Set Unnecessary Fields to 0&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;scan $str {%[^/]%[^:]:%[^:]:%[^;];%[^0-9]%[0-9.]:%[0-9]} 0 0 ip1 0 0 ip2 port&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let’s list these out individually to understand what’s occuring:   &lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;%[^/] – store all data in the string to the first occurrence of “/” to &amp;lt;null&amp;gt;&lt;/li&gt;
    &lt;li&gt;%[^:] – store the remaining data in the string to the first occurence of “:” to &amp;lt;null&amp;gt;&lt;/li&gt;
    &lt;li&gt;:%[^:] –skip the colon and store the remaining data in the string to the next occurrence of “:” to ip1&lt;/li&gt;
    &lt;li&gt;:%[^;] – skip the colon and store the remaining data in the string to the next occurrence of “;” to &amp;lt;null&amp;gt;&lt;/li&gt;
    &lt;li&gt;;%[^0-9] –skip the semi-colon and store the remaining data in the string to the next occurrence of a number to &amp;lt;null&amp;gt;&lt;/li&gt;
    &lt;li&gt;%[0-9.] –store the remaining data until a non “.” or number to ip2&lt;/li&gt;
    &lt;li&gt;:%[0-9] – skip the colon and store the remaining numbers in port&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In practice, I’ll set those &amp;lt;null&amp;gt; fields to garbage variables so you can see them matches:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;% set a &quot;Aug 05 08:01:13 ethos-re0 (FPC Slot 1, PIC Slot 1) TEST-{ss-nat-2}\[FWNAT\]: ASP_SFW_CREATE_ACCEPT_FLOW: proto 1 (ICMP ECHO REQUEST) application: icmp, xe- 0/0/0.21:10.1.1.1:33639 -&amp;gt; 192.168.22.254, creating forward or watch flow ; source address and identifier translate to 172.16.4.32:1135&quot;     &lt;br /&gt;
Aug 05 08:01:13 ethos-re0 (FPC Slot 1, PIC Slot 1) TEST-{ss-nat-2}[FWNAT]: ASP_SFW_CREATE_ACCEPT_FLOW: proto 1 (ICMP ECHO REQUEST) application: icmp, xe- 0/0/0.21:10.1.1.1:33639 -&amp;gt; 192.168.22.254, creating forward or watch flow ; source address and identifier translate to 172.16.4.32:1135      &lt;br /&gt;
% scan $a {%[^/]%[^:]:%[^:]:%[^;];%[^0-9]%[0-9.]:%[0-9]} g1 g2 ip1 g3 g4 ip2 port      &lt;br /&gt;
7      &lt;br /&gt;
% puts $g1      &lt;br /&gt;
Aug 05 08:01:13 ethos-re0 (FPC Slot 1, PIC Slot 1) TEST-{ss-nat-2}[FWNAT]: ASP_SFW_CREATE_ACCEPT_FLOW: proto 1 (ICMP ECHO REQUEST) application: icmp, xe- 0      &lt;br /&gt;
% puts $g2      &lt;br /&gt;
/0/0.21      &lt;br /&gt;
% puts $ip1      &lt;br /&gt;
10.1.1.1      &lt;br /&gt;
% puts $g3      &lt;br /&gt;
33639 -&amp;gt; 192.168.22.254, creating forward or watch flow      &lt;br /&gt;
% puts $g4      &lt;br /&gt;
source address and identifier translate to      &lt;br /&gt;
% puts $ip2      &lt;br /&gt;
172.16.4.32      &lt;br /&gt;
% puts $port      &lt;br /&gt;
1135&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Option 2 – Skip Over Unnecessary Fields in the Scan Formatting&lt;/h3&gt;
&lt;p&gt;The scan formatting allows you to use the &quot;*&quot; to skip data instead of forcing you to use a null variable for fields you don&#039;t need.&amp;#160; I’ll just re-list the fields, with a slight change in the formatting of the fields we don’t care about:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;%*[^/] – skip over all the data in the string to the first occurrence of “/”&lt;/li&gt;
    &lt;li&gt;%*[^:] – skip over the remaining data in the string to the first occurence of “:”&lt;/li&gt;
    &lt;li&gt;:%[^:] –skip the colon and store the remaining data in the string to the next occurrence of “:” to ip1&lt;/li&gt;
    &lt;li&gt;:%*[^;] – skip the colon and skip over the remaining data in the string to the next occurrence of “;”&lt;/li&gt;
    &lt;li&gt;;%*[^0-9] –skip the semi-colon and skip over the remaining data in the string to the next occurrence of a number&lt;/li&gt;
    &lt;li&gt;%[0-9.] –store the remaining data until a non “.” or number to ip2&lt;/li&gt;
    &lt;li&gt;:%[0-9] – skip the colon and store the remaining numbers in port&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So the command altogether looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;scan $a {%*[^/]%*[^:]:%[^:]:%*[^;];%*[^0-9]%[0-9.]:%[0-9]} ip1 ip2 port&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And in practice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;% scan $a {%*[^/]%*[^:]:%[^:]:%*[^;];%*[^0-9]%[0-9.]:%[0-9]} ip1 ip2 port     &lt;br /&gt;
3      &lt;br /&gt;
% puts $ip1      &lt;br /&gt;
10.1.1.1      &lt;br /&gt;
% puts $ip2      &lt;br /&gt;
172.16.4.32      &lt;br /&gt;
% puts $port      &lt;br /&gt;
1135      &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was curious if there is a performance difference between the two approaches, so I put each scan command in a proc and timed it over one million iterations:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;% proc test1 {arg} {     &lt;br /&gt;
&amp;#160; scan $arg {%[^/]%[^:]:%[^:]:%[^;];%[^0-9]%[0-9.]:%[0-9]} 0 0 ip1 0 0 ip2 port      &lt;br /&gt;
}      &lt;br /&gt;
% proc test2 {arg} {      &lt;br /&gt;
&amp;#160; scan $arg {%*[^/]%*[^:]:%[^:]:%*[^;];%*[^0-9]%[0-9.]:%[0-9]} ip1 ip2 port      &lt;br /&gt;
}      &lt;br /&gt;
% time {test1 $a} 1000000      &lt;br /&gt;
8.183545 microseconds per iteration      &lt;br /&gt;
% time {test2 $a} 1000000      &lt;br /&gt;
7.20703 microseconds per iteration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Both are pretty lean and mean, but skipping the data rather then “storing” to null is slightly more efficient.&lt;/p&gt;
&lt;h3&gt;Caveats&lt;/h3&gt;
&lt;p&gt;The scan command is amazing, but it is rigid in that if EVERY log entry isn’t formatted exactly the same, then this won’t work 100% of the time.&amp;#160; This is the case here:&lt;/p&gt;
&lt;ol&gt;&lt;!--EndFragment--&gt;&lt;/ol&gt;
    &lt;p&gt;&amp;#160;&lt;/p&gt;
    &lt;blockquote&gt;
    &lt;p&gt;Aug 05 08:02:25 ethos-re0 (FPC Slot 1, PIC Slot 1) {sset2}\[FWNAT\]: ASP_SFW_DELETE_FLOW: proto 6 (TCP) application: any, (null)(null)&lt;strong&gt;10.1.1.1&lt;/strong&gt;:8956 –&amp;gt; 192.168.22.254:80, deleting forward or watch flow ; source address and port translate to &lt;strong&gt;172.16.4.32&lt;/strong&gt;:&lt;strong&gt;1128&lt;/strong&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
    &lt;p&gt;Notice that our first match from the scan command above is nowhere to be found!&amp;#160; Not good.&amp;#160; There is hope, however.&amp;#160; If you know all the possible formats and can find a unique identifier among them, you could switch on the unique identifier and then have a custom scan format for each as necessary.&lt;/p&gt;
    &lt;h3&gt;The Challenge&lt;/h3&gt;
    &lt;p&gt;I have a DevCentral t-shirt (message in image below) for the first non-F5er to provide the scan syntax to pull out the highlighted fields in the string provided in the Caveats section.&amp;#160; Happy coding!&lt;/p&gt;
    &lt;p&gt;&amp;#160;&lt;/p&gt;
    &lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:44dcf9a1-78da-4bbb-bdde-a075dc6681c6&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;a3d2395f&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;The New DevCentral T-Shirt!&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-8998cec7019a_A687-dc_tshirt-8x6.png&quot;&gt;&lt;img height=&quot;149&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-8998cec7019a_A687-dc_tshirt_2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
    &lt;p&gt;&amp;#160;&lt;/p&gt;
    &lt;p&gt;&amp;#160;&lt;/p&gt;
    &lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
    &lt;ul class=&quot;ArrowList&quot;&gt;
        &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1084381/iRules-101--17-Mapping-Protocol-Fields-with-the-Binary-Scan-Command.aspx&quot;&gt;iRules 101 - #17 – Mapping Protocol Fields with the Binary Scan ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/197/Scan--Making-string-manipulation-efficient.aspx&quot;&gt;Scan - Making string manipulation efficient &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2346/iRules-101--16--Parsing-Strings-with-the-TCL-Scan-Command.aspx&quot;&gt;iRules 101 - #16 - Parsing Strings with the TCL Scan Command ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/1174089/Default.aspx&quot;&gt;about binary format/scan - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/wiki/iRules.Print.aspx?Page=iRules.NTLM_logger&quot;&gt;NTLM_logger - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/11642/Default.aspx&quot;&gt;Binary Scan - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aft/1178882/Default.aspx&quot;&gt;scan problem - DevCentral - F5 DevCentral &amp;gt; Forums - Social Forums ...&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;/wiki/iRules.RADIUSLoadBalancing.ashx&quot;&gt;RADIUS Load Balancing - DevCentral Wiki&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/1uxqllMra8s&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1939885&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 09 Aug 2011 00:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1939885</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1939885#feedback</comments>
</item>
<item>
 <title>Preventing Brute Force Password Guessing Attacks with APM–Part 2</title>
 <link>http://jasonrahm.ulitzer.com/node/1936195</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;F5er and DevCentral community member ystephie is back with another great solution (check out her first solution here: &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM Customized Logon Page&lt;/a&gt;), this time tackling brute force attacks utilizing customizations with the BIG-IP Access Policy Manager.&amp;#160; This solution requires BIG-IP 10.2.2 Hotfix 1 or later.&lt;/p&gt;
&lt;p&gt;Introduction&lt;/p&gt;
&lt;p&gt;Exposing applications or services to the Internet opens inherent security risks. BIG-IP Access Policy Manager (APM) provides edge authentication and access control services for applications, BIG-IP Edge Gateway provides secure SSL VPN services, and BIG-IP Application Security Manager (ASM) provides protection against a variety of attacks. In this series of APM deployment examples, we cover a couple techniques for protecting against brute force password-guessing attacks.&lt;/p&gt;
&lt;p&gt;In our first example (&lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086474/Preventing-Brute-Force-Password-Guessing-Attacks-with-APMPart-1.aspx&quot;&gt;Part 1&lt;/a&gt;), we walked through the process of including a CAPTCHA on the APM logon page via a web service (Google reCAPTCHA project), to provide some protection against script based or other automated attacks. In this second example (Part 2), we’ll be a bit more selective around when to display the CAPTCHA challenge (no point inconveniencing valid users) by displaying a CAPTCHA only after the user has failed full authentication.&amp;#160; This is done using an &lt;strong&gt;AD Query&lt;/strong&gt; for the user’s bad password count attribute. The selective CAPTCHA challenge provides the same benefits as with Part 1 (always on CAPTCHA) by blocking automated password-guessing attacks as well as DOS attacks against Active Directory. In this case a user’s internal corporate AD account may be locked after a number of sequential failed authentication failures in an external DOS attack – a serious inconvenience to the user affected as well as his IT department! In this example we’ll be using a two page configuration. If a user fails authentication, the next time they sign on, they’ll be prompted for a CAPTCHA challenge after entering their login credentials (via a separate page).&lt;/p&gt;
&lt;h3&gt;Visual Policy Editor – Macros&lt;/h3&gt;
&lt;p&gt;Start with a new access policy (you can use a wizard to do this – See Part 1 of this series). Create a Macro; I called mine &lt;i&gt;Plain Captcha&lt;/i&gt;. This will just be a page with a CAPTCHA. We’re using a macro because we’ll be using this &lt;i&gt;Plain Captcha&lt;/i&gt; many times in this policy so it’s easier than creating a new logon page each time we need it. See Figure 1.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_2.png&quot;&gt;&lt;img height=&quot;178&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_thumb.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Configure the &lt;b&gt;Logon Page&lt;/b&gt; as in Part 1 with the extra post variables. Then go into Advanced Customization as discussed in Part 1. Remove the same PHP code and add the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&amp;lt;tr&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;script type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
     src=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;https://www.google.com/recaptcha/api/challenge?k=&lt;font color=&quot;#ff0000&quot;&gt;replace_with_your_public_key&lt;/font&gt;&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;noscript&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
     &amp;lt;iframe src=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;https://www.google.com/recaptcha/api/noscript?k=&lt;font color=&quot;#ff0000&quot;&gt;replace_with_your_public_key&lt;/font&gt;&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
         height=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;300&quot;&lt;/span&gt; width=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;500&quot;&lt;/span&gt; frameborder=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;0&quot;&lt;/span&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;br&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
     &amp;lt;textarea name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;recaptcha_challenge_field&quot;&lt;/span&gt; rows=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;3&quot;&lt;/span&gt; cols=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;40&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
     &amp;lt;/textarea&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
     &amp;lt;input type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;hidden&quot;&lt;/span&gt; name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;recaptcha_response_field&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
         value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;manual_challenge&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;/noscript&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
  &amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 10pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 10pt; overflow: visible;&quot;&gt;
&amp;lt;/tr&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_4.png&quot;&gt;&lt;img height=&quot;398&quot; border=&quot;0&quot; width=&quot;300&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_thumb_1.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;Don’t forget to do all the necessary steps for advanced customization. See Part 1 - &lt;i style=&quot;&quot;&gt;Advanced Customization Checklist&lt;/i&gt; for directions.&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;Next, let’s add another macro that does the authentication and resource assignment. We don’t need to build this macro ourselves; we can simply select the macro template &lt;i style=&quot;&quot;&gt;AD auth and resources &lt;/i&gt;(you may use your choice of auth factors but my examples will be using AD auth). Remove the &lt;b style=&quot;&quot;&gt;Logon Page&lt;/b&gt; from the macro after saving. Configure the &lt;b style=&quot;&quot;&gt;AD Auth&lt;/b&gt; with your AD server and change &lt;b style=&quot;&quot;&gt;Max Logon Attempts Allowed&lt;/b&gt; to one.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_6.png&quot;&gt;&lt;img height=&quot;235&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_thumb_2.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0in 0in 0pt;&quot;&gt;Once you add a Webtop to &lt;b style=&quot;&quot;&gt;Resource Assign&lt;/b&gt;, your macro should look like Figure 2.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_8.png&quot;&gt;&lt;img height=&quot;178&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_thumb_3.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now that we have finished building the macros, we can start with our access policy. The general flow of the policy should be that we only directly authenticate a user if we know they exist in Active Directory (a valid username) and they have not previously failed authentication. We can determine this through use an &lt;b&gt;AD Query&lt;/b&gt;. If the user is invalid, we stop them here. If the user is valid, but has previously failed authentication, we will give them a CAPTCHA challenge. The policy is quite simple. Create a &lt;b&gt;Logon Page&lt;/b&gt; followed by AD Query, and based on the following branch rules we can determine which leg to take.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_10.png&quot;&gt;&lt;img height=&quot;250&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-image_thumb_4.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_xltable1_4.png&quot;&gt;&lt;img height=&quot;142&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_xltable1_thumb_1.png&quot; title=&quot;apm_xltable1&quot; alt=&quot;apm_xltable1&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cases:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;If we have a valid user and they have not previously failed authentication (badPwdCount is zero), we can authenticate them directly with our &lt;i&gt;AD auth and resources&lt;/i&gt; macro. If the user passes, then he is allowed to access the VPN.&lt;/li&gt;
    &lt;li&gt;If we have a valid user and they have not previously failed authentication but the user fails the auth agent for the first time, we still need to show the CAPTCHA at the end just to ensure that the behavior follows all the other cases.&lt;/li&gt;
    &lt;li&gt;If we had a valid user and they previously failed authentication (badPwdCount is one or higher), we can display the CAPTCHA challenge and authenticate the response against Google’s reCAPTCHA web service using &lt;b&gt;HTTP Auth&lt;/b&gt;. If the user was able to enter the CAPTCHA correctly, the user is then allowed to authenticate.&lt;/li&gt;
    &lt;li&gt;If we find that this is an invalid user, we don’t have to authenticate them (as they are going to fail authentication anyway). However, since we don’t want to give a hacker any hints about who’s a valid user and who’s not (allow for a username guessing attack), we must present the same end user behavior as if someone had entered incorrect credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See Figure 3 for the complete VPE.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_img3.png&quot;&gt;&lt;img hspace=&quot;10&quot; height=&quot;172&quot; width=&quot;600&quot; vspace=&quot;10&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/apm_img3.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;b&gt;HTTP Auth&lt;/b&gt; should be set up exactly as described in Part 1. If you wanted to configure a new &lt;b&gt;HTTP Auth &lt;/b&gt;without having to go through the device wizard, you can go to &lt;b&gt;AAA Servers&lt;/b&gt; under &lt;b&gt;Access Policy&lt;/b&gt;. Now the user will encounter a CAPTCHA if they ever fail authentication. The &lt;b&gt;Deny&lt;/b&gt; provides gives a lot of information but we can edit it to make it more readable and helpful to our users. To accomplish this, click on &lt;b&gt;Edit Endings&lt;/b&gt; and under &lt;b&gt;Deny&lt;/b&gt;, and then the plus sign next to &lt;b&gt;Customization&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_img1_2.png&quot;&gt;&lt;img height=&quot;515&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_img1_thumb.png&quot; title=&quot;apm_img1&quot; alt=&quot;apm_img1&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;e1bbfc45&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_xltable2_2.png&quot;&gt;&lt;img height=&quot;75&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-44b650927154_CDCB-apm_xltable2_thumb.png&quot; title=&quot;apm_xltable2&quot; alt=&quot;apm_xltable2&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Final Notes&lt;/h3&gt;
&lt;p&gt;This solution is a great example where we used AD Query to selectively determine when to show our CAPTCHA challenge, in order to reduce the inconvenience of typing CAPTCHA challenges. But, this solution is not perfect. We’re limited to only allowing one bad authentication before showing the CAPTCHA. This is because AD Query only knows about users who exist in its database (valid users). If you’re trying to use the badPwdCount attribute to track more than one authentication failure, it is possible for a hacker to figure out if they have guessed a valid username (CAPTCHA challenge shown after a single failure for unknown usernames, but after two or more failures for legitimate usernames). In our next example (Part 3), we’ll build on this work and demonstrate a new technique for safely tracking multiple authentication failures. We’ll also remove the dependency on Active Directory for the authentication failure tracking.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/9zN8eS6YJhg&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1936195&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 05 Aug 2011 09:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1936195</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1936195#feedback</comments>
</item>
<item>
 <title>Preventing Brute Force Password Guessing Attacks with APM–Part 1</title>
 <link>http://jasonrahm.ulitzer.com/node/1935221</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;F5er and DevCentral community member ystephie is back with another great solution (check out her first solution here: &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM Customized Logon Page&lt;/a&gt;), this time tackling brute force attacks utilizing customizations with the BIG-IP Access Policy Manager.&amp;#160; This solution requires BIG-IP&amp;#160;10.2.2 Hotfix 1 or later.&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Exposing applications or services to the Internet opens inherent security risks. BIG-IP Access Policy Manager (APM) provides edge authentication and access control services for applications, BIG-IP Edge Gateway provides secure SSL VPN services, and BIG-IP Application Security Manager (ASM) provides protection against a variety of attacks. In this series of APM deployment examples, we will cover a couple of techniques for protecting against brute force password-guessing attacks. We’ll start with examples where a CAPTCHA challenge is used to block automated password guessing attacks, followed by an example providing temporary account lockout after a configured number of authentication failures.    &lt;br /&gt;
&amp;#160; &lt;br /&gt;
CAPTCHA stands for Completely Automated Public Turing Test to Tell Computers and Humans Apart (quite a mouthful), but basically consists of a challenge that a human can pass but a computer program cannot. It is used to protect against bots, and in the examples here can help protect against an automated password guessing attack.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_2.png&quot;&gt;&lt;img height=&quot;113&quot; border=&quot;0&quot; width=&quot;285&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We can take advantage of Google’s reCAPTCHA web service and APM’s flexible advanced customization to provide basic defense against automated password guessing attacks. In addition, we will play around with the general look of your logon page.&amp;#160; With reCAPTCHA available as a web service, we’ll be incorporating the CAPTCHA challenge within the APM logon page via advanced customization. The JavaScript added to the logon page will request a challenge (image with distorted text) from the reCAPTCHA web service and display it within the page. We’ll then create a custom APM Access Policy where we validate the user’s CAPTCHA challenge answer against the same reCAPTCHA web service (using the APM HTTP Auth agent). The links below describe the Google reCAPTCHA service in greater detail:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://code.google.com/apis/recaptcha/intro.html&quot;&gt;http://code.google.com/apis/recaptcha/intro.html&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://code.google.com/apis/recaptcha/docs/display.htm&quot;&gt;http://code.google.com/apis/recaptcha/docs/display.htm&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://code.google.com/apis/recaptcha/docs/verify.html&quot;&gt;http://code.google.com/apis/recaptcha/docs/verify.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Initial Setup – Create a Google Account for the reCAPTCHA Project&lt;/h3&gt;
&lt;p&gt;Sign up for Google’s reCAPTCHA project through &lt;a href=&quot;http://www.google.com/recaptcha/whyrecaptcha&quot;&gt;http://www.google.com/recaptcha/whyrecaptcha&lt;/a&gt;. Fill in a domain name and jot down the private and public keys for we’ll be using them later.&lt;/p&gt;
&lt;h3&gt;Device Wizard&lt;/h3&gt;
&lt;p&gt;For the purpose of this example, we’ll be using the &lt;strong&gt;Network Access Setup Wizard for Remote Access&lt;/strong&gt; option under &lt;strong&gt;Templates and Wizards -&amp;gt; Device Wizards&lt;/strong&gt; shown in Figure 1.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_4.png&quot;&gt;&lt;img height=&quot;211&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_1.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Select HTTP Authentication with the following setup. This is required to verify the CAPTCHA challenge answer from the user against the reCAPTCHA web service.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_6.png&quot;&gt;&lt;img height=&quot;122&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_2.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_8.png&quot;&gt;&lt;img height=&quot;420&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_3.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow the steps in the wizard (AAA Server, Lease Pool, Network Access, and etc.) to get to the summary page shown below in Figure 2. Before clicking finished, enter the Visual Policy Editor (VPE) to make a few changes.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_10.png&quot;&gt;&lt;img height=&quot;626&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_4.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on &lt;strong&gt;Logon Page&lt;/strong&gt; and modify field 3 and 4 under &lt;strong&gt;Logon Page Agent&lt;/strong&gt; with the following configuration and save.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_12.png&quot;&gt;&lt;img height=&quot;55&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_5.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_14.png&quot;&gt;&lt;img height=&quot;538&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_6.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: The logon page agent will only parse and store POST parameters it knows about (that are defined here). We’ll be hiding these two new fields on the logon page via advanced customization later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You should add an &lt;strong&gt;Ad Auth&lt;/strong&gt; after the success leg of &lt;strong&gt;HTTP Auth&lt;/strong&gt;. That way, you only need to check their credentials once we know for sure that this is a human user (passes the CAPTCHA challenge).&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_16.png&quot;&gt;&lt;img height=&quot;194&quot; border=&quot;0&quot; width=&quot;604&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_7.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update the access policy by clicking &lt;strong&gt;Apply Access Policy&lt;/strong&gt; and finish the &lt;strong&gt;Device Wizard&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Advanced Customization&lt;/h3&gt;
&lt;p&gt;Follow steps 1-3 under the section “Customize the Logon Page” in the &lt;a target=&quot;_blank&quot; href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086465/BIG-IP-APMCustomized-Logon-Page.aspx&quot;&gt;BIG-IP APM-Customized Logon Page article&lt;/a&gt;.&amp;#160; We’ll be replacing the auto-generated logon form with HTML that includes the username and password     &lt;br /&gt;
fields, along with some JavaScript that calls the reCAPTCHA service and includes the challenge within the page. Edit logon_en.inc file: remove this block of PHP code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot; style=&quot;border: 1px solid silver; text-align: left; padding: 4px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 20px 0px 10px; width: 97.5%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; max-height: 200px; font-size: 12pt; overflow: auto; cursor: text;&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;? &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//------------------------------------------------------------ &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;foreach&lt;/span&gt;( $fields_settings &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;as&lt;/span&gt; $field_settings ) &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
{ &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;type&quot;&lt;/span&gt;] != &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;none&quot;&lt;/span&gt; ) &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    { &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt;( $GLOBALS[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;label_position&quot;&lt;/span&gt;] == &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;above&quot;&lt;/span&gt; ){ &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
?&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;label &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;for&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt;&amp;gt;&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
$field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;caption&quot;&lt;/span&gt;] ); ?&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;type&quot;&lt;/span&gt;] ); ?&amp;gt; name=&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;name&quot;&lt;/span&gt;] ); ?&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt; &amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( ( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;rw&quot;&lt;/span&gt;] == 0 ? &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;disabled&quot;&lt;/span&gt; : &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; ) ); ?&amp;gt; value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
print( $field_settings[&quot;value&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;/tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;? &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        }&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt;{ &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
?&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        &amp;lt;td &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_label_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;caption&quot;&lt;/span&gt;] ); ?&amp;gt;&amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        &amp;lt;td &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_field_cell&quot;&lt;/span&gt;&amp;gt;&amp;lt;input type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt; name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;name&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
); ?&amp;gt;&quot; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt; &amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( ( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;rw&quot;&lt;/span&gt;] == 0 ? &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;disabled&quot;&lt;/span&gt; : &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; ) ); ?&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;value&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); ?&amp;gt;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;/tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;? &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        } &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    } &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
} &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//------------------------------------------------------------ &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
?&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;In its place, paste this second block of code. Make sure to replace the red text with your own information.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot; style=&quot;border: 1px solid silver; text-align: left; padding: 4px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 20px 0px 10px; width: 97.5%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; max-height: 200px; font-size: 12pt; overflow: auto; cursor: text;&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
       &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;label &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;for&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text&quot;&lt;/span&gt;&amp;gt;Username&amp;lt;/label&amp;gt;&amp;lt;input type=text name=username &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
lass=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_text&quot;&lt;/span&gt;  value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt; autocapitalize=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
   &amp;lt;/tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
   &amp;lt;tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
       &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;label &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;for&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;password&quot;&lt;/span&gt;&amp;gt;Password&amp;lt;/label&amp;gt;&amp;lt;input type=password &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
ame=password &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_password&quot;&lt;/span&gt;  value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt; autocapitalize=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
   &amp;lt;/tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt;&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;script type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    src=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;https://www.google.com/recaptcha/api/challenge?k=&lt;font color=&quot;#ff0000&quot;&gt;replace_with_your_public_key&lt;/font&gt;&quot;&lt;/span&gt;&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;/script&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;noscript&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;iframe src=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;https://www.google.com/recaptcha/api/noscript?k=&lt;font color=&quot;#ff0000&quot;&gt;replace_with_your_public_key&lt;/font&gt;&quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        height=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;300&quot;&lt;/span&gt; width=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;500&quot;&lt;/span&gt; frameborder=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;0&quot;&lt;/span&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;br&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;textarea name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;recaptcha_challenge_field&quot;&lt;/span&gt; rows=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;3&quot;&lt;/span&gt; cols=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;40&quot;&lt;/span&gt;&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;/textarea&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
    &amp;lt;input type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;hidden&quot;&lt;/span&gt; name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;recaptcha_response_field&quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
        value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;manual_challenge&quot;&lt;/span&gt;&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;/noscript&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
 &amp;lt;/td&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
/tr&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apply the customizations to the policy with the following commands:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;b customization group &amp;lt;your policy name&amp;gt;_act_logon_page_ag action update&lt;/li&gt;
    &lt;li&gt;b profile access &amp;lt;your policy name&amp;gt; generation action increment&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Extra Touches&lt;/h3&gt;
&lt;p&gt;Currently the page should like like Figure 3.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_18.png&quot;&gt;&lt;img height=&quot;717&quot; border=&quot;0&quot; width=&quot;660&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_8.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But we can easily customize this page. First, let us start by adding a helpful message before the CAPTCHA. Open the &lt;strong&gt;logon_en.inc&lt;/strong&gt; file again and add some HTML like below. Place it between the &amp;lt;td...&amp;gt; tag and &amp;lt;script…&amp;gt; tag we added earlier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt;&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;lt;label &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;for&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text&quot;&lt;/span&gt;&amp;gt;Security Check&amp;lt;p&amp;gt;Enter &amp;lt;b&amp;gt;both words&amp;lt;/b&amp;gt; below, &amp;lt;b&amp;gt;separated by a space&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/label&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;script type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Edit this message as fits your organization.&amp;#160; Don’t forget to update the access policy! The page now looks like Figure 4:&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_20.png&quot;&gt;&lt;img height=&quot;605&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_9.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The color scheme of the CAPTCHA may not work for every page so Google provides a few more templates shown in Figure 5. If you feel that you would like to do more customization, see the documentation found on this page -http://code.google.com/apis/recaptcha/docs/customization.html.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;script type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&amp;gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;var&lt;/span&gt; RecaptchaOptions = {  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
   theme : &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&#039;&lt;font color=&quot;#ff0000&quot;&gt;theme_name&lt;/font&gt;&#039;&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
};  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 12pt; overflow: visible;&quot;&gt;
&amp;lt;/script&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_22.png&quot;&gt;&lt;img height=&quot;288&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_10.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To display a standard theme, add the following script into logon_en.inc anywhere before the &amp;lt;form&amp;gt; element where we inserted our code. Replace ‘&lt;font color=&quot;#ff0000&quot;&gt;theme_name&lt;/font&gt;’ with one of the above theme names. In Figure 6, I’m using the ‘white’ theme. Remember to update!&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_24.png&quot;&gt;&lt;img height=&quot;621&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_11.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;More Extra Touches – Changing the Look of Your Page&lt;/h3&gt;
&lt;p&gt;To customize the look of your page, click on your access profile- &lt;strong&gt;Access Policy -&amp;gt; Access Profiles -&amp;gt; &amp;lt;your access policy&amp;gt; -&amp;gt; Customization (third tab from the left on the top) -&amp;gt; general UI -&amp;gt; Find Customization&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_26.png&quot;&gt;&lt;img height=&quot;658&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_12.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to make whatever changes you like, in Figure 7, I changed the color of the &lt;strong&gt;Header background color&lt;/strong&gt;, and &lt;strong&gt;Form background color&lt;/strong&gt; to #63919E and #94BBC2 respectively.&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;874f14f5&#039;})&quot; class=&quot;itcexpando&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_28.png&quot;&gt;&lt;img height=&quot;582&quot; border=&quot;0&quot; width=&quot;600&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Aug/Windows-Live-Writer-2aeb5987ca38_84F5-image_thumb_13.png&quot; alt=&quot;image&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Advanced Customization (Logon Page) Checklist&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;When you copy and paste to a template file, it has the following formatting: logon_&amp;lt;language&amp;gt;.inc&lt;/li&gt;
    &lt;li&gt;Set permissions using the following command
    &lt;ul&gt;
        &lt;li&gt;chmod a+r logon_&amp;lt;language&amp;gt;.inc&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;After editing, update with the following two commands
    &lt;ul&gt;
        &lt;li&gt;b customization group &amp;lt;your policy name&amp;gt;_act_logon_page_ag action update&lt;/li&gt;
        &lt;li&gt;b profile access &amp;lt;your policy name&amp;gt; generation action increment&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Final Notes&lt;/h3&gt;
&lt;p&gt;Exposing applications or services to the Internet opens inherent security risks. APM can help by providing advanced authentication, authorization, and endpoint security checks. With a bit of customization you can integrate with web services such as the Google reCAPTCHA project to provide additional security layers. In our next example, we’ll build on this work to display the CAPTCHA only after the user has failed full authentication, to reduce the inconvenience of typing CATPCHA challenges. We’ll be demonstrating how to do an AD Query and use the bad password count attribute to determine when to show the CAPTCHA challenge.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/ZbnCkCTrDWg&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1935221&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 04 Aug 2011 04:39:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1935221</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1935221#feedback</comments>
</item>
<item>
 <title>Back in the Saddle</title>
 <link>http://jasonrahm.ulitzer.com/node/1929512</link>
 <description>&lt;p&gt;July was a busy month.  I took the first three weeks off and drove much of what’s left of the “mother road” on &lt;a href=&quot;http://www.historic66.com/&quot; target=&quot;_blank&quot;&gt;Historic Route 66&lt;/a&gt;.with the family, our Ford Expedition, and way too many nights in our 31’ travel trailer.  Great memories and stories for a lifetime out of that trip.  I was home long enough to unpack, do laundry, and repack for a great week in Chicago with the &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; team.  On Monday, we had a great time diving in to F5 technology goodness with the MVPs (and hoolio and Chris Miller!) at the &lt;a href=&quot;http://thinkubators.com/&quot; target=&quot;_blank&quot;&gt;Thinkubator&lt;/a&gt;.  It was a great meeting place with a rooftop deck accessible only by a spiral staircase.  The view of downtown was amazing:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Back-in-the-Saddle_79FD/mvpsummit_pic1_2.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;mvpsummit_pic1&quot; border=&quot;0&quot; alt=&quot;mvpsummit_pic1&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Back-in-the-Saddle_79FD/mvpsummit_pic1_thumb.jpg&quot; width=&quot;504&quot; height=&quot;378&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s a good thing we all like each other ‘cause we spent the whole day together—three meals and some great content along the way. I particularly enjoyed the lightning talks from the MVPs, but the content from our product development/product management teams was great as well.  Tuesday, THE Colin Walker and I taught a “Short Course” (7 hours!) on iRules and had a great session.  The F5 Agility conference took place Wednesday and Thursday and the DevCentral booth was hopping with video interviews throughout.  Check out &lt;a href=&quot;http://devcentral.f5.com/weblogs/dctv/Default.aspx&quot; target=&quot;_blank&quot;&gt;DCTV&lt;/a&gt; for a great variety of partner/MVP interviews.&lt;/p&gt;  &lt;p&gt;Anyway, circling back to my title for this post: I’m back in the saddle, baby.  It’s a new week, a new month, and a new era for F5 with the &lt;a href=&quot;http://www.f5.com/news-press-events/press/2011/20110725a.html&quot; target=&quot;_blank&quot;&gt;announcement of BIG-IP v11&lt;/a&gt;. We here at DevCentral are getting the gears turning on all the content coming your way.  There will be plenty, as there is an astounding amount of innovation coming in this release.  I’m super excited, as are all the folks I’ve talked to that evaluated v11 during the beta windows.  Much to learn, much to do, so I’m signing off for now…&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:274d2ae2-f529-409e-9093-81d1e967bfa7&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/MVP&quot; rel=&quot;tag&quot;&gt;MVP&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Thinkubator&quot; rel=&quot;tag&quot;&gt;Thinkubator&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP&quot; rel=&quot;tag&quot;&gt;BIG-IP&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP+v11&quot; rel=&quot;tag&quot;&gt;BIG-IP v11&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1096316.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/DhWcZprfEh4&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1929512&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 01 Aug 2011 03:34:48 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1929512</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1929512#feedback</comments>
</item>
<item>
 <title>So Yeah, Regex is Bad</title>
 <link>http://jasonrahm.ulitzer.com/node/1886293</link>
 <description>&lt;p&gt;Don’t get me wrong, regex is awesome, and entirely useful—sometimes it’s the only option, it’s just not the &lt;em&gt;best&lt;/em&gt; tool of choice for wire speed applications.  Often the sys-admin and network type converts to BIG-IP will find the &lt;a href=&quot;http://tmml.sourceforge.net/doc/tcl/regexp.html&quot; target=&quot;_blank&quot;&gt;regexp&lt;/a&gt; tcl command and go that route because it’s familiar.  If that describes you, please let me introduce you to a couple more appropriate commands:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://tmml.sourceforge.net/doc/tcl/scan.html&quot; target=&quot;_blank&quot;&gt;scan&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://tmml.sourceforge.net/doc/tcl/&quot; target=&quot;_blank&quot;&gt;string&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These two commands will cover a great percentage of &lt;strong&gt;regexp&lt;/strong&gt;’s use cases, and will save significant resources on the system.  Don’t buy it?  Here’s an example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;% &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; ip &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.10.20.200&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;10.10.20.200&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;% time { &lt;span style=&quot;color: #0000ff&quot;&gt;scan&lt;/span&gt; $ip {%d.%d.%d.%d} a b c d} 10000&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;2.1713 microseconds per iteration&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;% time {&lt;span style=&quot;color: #0000ff&quot;&gt;regexp&lt;/span&gt; {([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})} $ip matched a b c d} 10000&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;34.2604 microseconds per iteration&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two approaches, same result.  The time to achieve that result?  The &lt;strong&gt;scan&lt;/strong&gt; command bests &lt;strong&gt;regexp&lt;/strong&gt; by far.  I’ll save you the calculation…that’s a 93.7% reduction in processing time.  &lt;strong&gt;93.7 percent! &lt;/strong&gt;Now, mind you, the difference between 2 and 34 microseconds will be negligible to an individual request’s response time, but in the context of a single system handling hundreds of thousands or even millions of request per second, the difference matters.  A lot.&lt;/p&gt;

&lt;p&gt;Thanks to (who else?) hoolio for the example.  For other optimization considerations, check out the &lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/108/iRules-Optimization-101--01--if-elseif-and-switch.aspx&quot; target=&quot;_blank&quot;&gt;iRules Optimization 101 series&lt;/a&gt;.&lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/339/iRules-101--14--TCL-String-Commands-Part-2.aspx&quot;&gt;iRules 101 - #14 - TCL String Commands Part 2 &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/338/iRules-101--13--TCL-String-Commands-Part-1.aspx&quot;&gt;iRules 101 - #13 - TCL String Commands Part 1 &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2346/iRules-101--16--Parsing-Strings-with-the-TCL-Scan-Command.aspx&quot;&gt;iRules 101 - #16 - Parsing Strings with the TCL Scan Command ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2007/08/01/2901.aspx&quot;&gt;s/regex/English/g&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/197/Scan--Making-string-manipulation-efficient.aspx&quot;&gt;Scan - Making string manipulation efficient &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1177132/asg/50/Default.aspx&quot;&gt;Regex - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group Details ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/1179075/Default.aspx&quot;&gt;REGEX Alternatives - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/1179188/afc/1250875/Default.aspx&quot;&gt;Regex in STREAM::expression - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/1174534/Default.aspx&quot;&gt;String map and redirect - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/1172818/Default.aspx&quot;&gt;string manipulation - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3bdf4fa0-0185-464d-bb00-4b5e3495259d&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/regex&quot; rel=&quot;tag&quot;&gt;regex&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/regexp&quot; rel=&quot;tag&quot;&gt;regexp&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/scan&quot; rel=&quot;tag&quot;&gt;scan&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/string&quot; rel=&quot;tag&quot;&gt;string&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/tcl&quot; rel=&quot;tag&quot;&gt;tcl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/performance&quot; rel=&quot;tag&quot;&gt;performance&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094497.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/rMxksLcD2v0&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1886293&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 22 Jun 2011 10:12:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1886293</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1886293#feedback</comments>
</item>
<item>
 <title>BIG-IP APM–Customized Logon Page</title>
 <link>http://jasonrahm.ulitzer.com/node/1882843</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;The default logon page for the Access Policy Manager module is pretty basic, particularly so if only the minimal username and password is configured.&amp;#160; However, APM is wildly flexible.&amp;#160; In this tech tip, I’ll cover customizing the logon page by adding a dropdown box of services to the standard username and password fields.&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;h3&gt;Background Information&lt;/h3&gt;
&lt;p&gt;The goal here is to provide access to multiple web applications behind APM through the use of an admin-defined dropdown menu and different LTM pools for each web application. We will be generating the list dynamically through the use of data groups so there will be no need to manually edit the iRule code each time an admin decides to add another option.&lt;/p&gt;
&lt;h3&gt;Solution Overview&lt;/h3&gt;
&lt;p&gt;Combining advanced customization, data groups, and iRules, we can dynamically generate html code for each key value pair in the data group. We simply add a session variable in the logon page through advanced customization and insert our html code, generated with iRules, through the session variable. The data group serves as a user friendly way of adding more applications as a layer of indirection.&lt;/p&gt;
&lt;h2&gt;Create the Access Policy&lt;/h2&gt;
&lt;p&gt;Before I can create the custom logon page, I need to have an access policy defined.&amp;#160; I’ll do this by utilizing the &lt;strong&gt;Device Wizards&lt;/strong&gt; option under the &lt;strong&gt;Templates and Wizards&lt;/strong&gt; main tab.&amp;#160; Select &lt;strong&gt;Web Application Access Management for Local Traffic Virtual Servers&lt;/strong&gt; as show below in Figure 1.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:1f178eb8-3e1d-4e15-ac19-ca26d4114383&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig1-8x6.jpg&quot; title=&quot;Figure 1. Device Wizard Selection&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;360&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig1_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After following the steps in the wizard (AAA server, virtual IP, pool info, etc), I get to the summary page shown below in Figure 2.&amp;#160; Before clicking finished, I need to enter the Visual Policy Editor to make a couple edits.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:42f98b23-9107-4265-ae1a-bac483c743e9&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig2-8x6.jpg&quot; title=&quot;Figure 2. Device Wizard Summary Page&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;663&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig2_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Immediately after the start box in the VPE, I add an &lt;strong&gt;iRule Event&lt;/strong&gt; as show in Figure 3.&amp;#160; This will trigger the iRule &lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;&quot;&gt;event ACCESS_POLICY_AGENT_EVENT&amp;#160; in the iRule featured later in this article.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:404f2905-8d24-43be-81df-b397c7666164&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig3-8x6.jpg&quot; title=&quot;Figure 3. Add iRule Event&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;490&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig3_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I make sure to assign an ID to the event before saving it.&amp;#160; Next, I click into the Logon Page event in the VPE and add a text field immediately after the password field.&amp;#160; I then set the &lt;strong&gt;Post Variable Name&lt;/strong&gt; and the &lt;strong&gt;Session Variable Name&lt;/strong&gt; to ‘appname’. (The name is not significant but will need to match a statement in some HTML I’ll replace later in the article.)&amp;#160; In the &lt;strong&gt;Logon Page Input Field #3&lt;/strong&gt; box, I enter ‘Application’ (this ensures the logon page agent will know to expect it as one of the POST parameters) and then click save.&amp;#160; See Figure 4 below for details.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c638782b-43c0-4c5f-892a-8ed2ff2b3448&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig4-8x6.jpg&quot; title=&quot;Figure 4. Logon Page Changes&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;535&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig4_7.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: The logon page agent will only parse and store POST parameters it knows about.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, I update the access policy by clicking &lt;strong&gt;Apply Access Policy&lt;/strong&gt; and then finish the &lt;strong&gt;Device Wizard&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Customize the Logon Page&lt;/h2&gt;
&lt;p&gt;Now that the policy is created, I need to login to the CLI to complete several steps.&lt;/p&gt;
&lt;p&gt;1. Change Directory into the specific policy’s logon directory:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cd/config/customization/advanced/logon/&amp;lt;policy_name&amp;gt;_act_logon_page_ag (where &amp;lt;policy_name&amp;gt; is your policy name.&amp;#160; devCenEx_act_logon_page_ag in my case.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2. Make a copy of the tmp_logon_en.inc file (the name &lt;strong&gt;logon_en.inc&lt;/strong&gt; is significant.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cp tmp_logon_en.inc logon_en.inc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3. Add group and world read permissions to the logon_en.inc file&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;chmod a+r logon_en.inc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4. Edit and save the logon_en.inc file, replacing this auto-generated PHP code with the HTML code below it.&amp;#160;&amp;#160; Notice the label and select tags reference &lt;strong&gt;Applications&lt;/strong&gt; and &lt;strong&gt;appname&lt;/strong&gt; (respectively) from our Logon Page in Figure 4.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Auto-generated PHP (remove)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&amp;lt;?
&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//------------------------------------------------------------&lt;/span&gt;
&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;foreach&lt;/span&gt;( $fields_settings &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;as&lt;/span&gt; $field_settings )
{
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;type&quot;&lt;/span&gt;] != &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;none&quot;&lt;/span&gt; )
    {
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt;( $GLOBALS[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;label_position&quot;&lt;/span&gt;] == &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;above&quot;&lt;/span&gt; ){
?&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td colspan=2 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;label &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;for&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] );&lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt;&amp;gt;&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;caption&quot;&lt;/span&gt;] );

?&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;type&quot;&lt;/span&gt;] );

?&amp;gt; name=&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;name&quot;&lt;/span&gt;] );

?&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] );&lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; &amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( ( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;rw&quot;&lt;/span&gt;] == 0 ? &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;disabled&quot;&lt;/span&gt; : &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; ) );

?&amp;gt; value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;value&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] );&lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;?
        }&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt;{
?&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_label_cell&quot;&lt;/span&gt; &amp;gt;&amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;caption&quot;&lt;/span&gt;] );

?&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_table_field_cell&quot;&lt;/span&gt;&amp;gt;&amp;lt;input type=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] );&lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; name=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;name&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); &lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;credentials_input_&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;type&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); &lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; &amp;lt;? &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;print&lt;/span&gt;( ( $field_settings[&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;rw&quot;&lt;/span&gt;] == 0 ? &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;disabled&quot;&lt;/span&gt; : &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt; ) ); 

?&amp;gt; value=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;? print( $field_settings[&quot;&lt;/span&gt;value&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;] ); &lt;br /&gt;&lt;br /&gt;?&amp;gt;&quot;&lt;/span&gt; autocomplete=&lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;off&quot;&lt;/span&gt;&amp;gt;&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;?
        }
    }
}
&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//------------------------------------------------------------&lt;/span&gt;
?&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;div&gt;&lt;strong&gt;Custom HTML (add)&lt;/strong&gt;&lt;/div&gt;
&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;div&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;colspan&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;Username&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;text&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;username&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;credentials_input_text&quot;&lt;/span&gt;  &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;autocomplete&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;off&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;autocapitalize&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;off&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;colspan&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;password&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;Password&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;password&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;password&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;credentials_input_password&quot;&lt;/span&gt;  &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;autocomplete&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;off&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;autocapitalize&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;off&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;colspan&lt;/span&gt;=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;credentials_table_unified_cell&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;Applications&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;appname&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
            %{session.custom.logon_opt} 
          &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
       &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;div&gt;Note: The HTML above can be further customized if desired.&amp;#160; The important section of code is:&lt;/div&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;select name&amp;gt;=”appname”&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; %{session.custom.logon_opt}&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/select&amp;gt;&lt;/p&gt;
&lt;div&gt;The POST variable was created in the Logon page and then the dummy session variable that will be utilized in the iRule.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;5. Apply the customizations to the policy&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;advCustHelp &amp;lt;your policy name&amp;gt;&lt;/p&gt;
&lt;p&gt;b customization group &amp;lt;your policy_name&amp;gt;_general_ui action update&lt;/p&gt;
&lt;p&gt;b profile access &amp;lt;your policy name&amp;gt; generation action increment&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;6. Create a string class for the applications.&amp;#160; The string should be the name of the application to be displayed in the Logon Page and the value should be the pool that hosts the applicable service.&amp;#160; See Figure 5 below for the GUI entry for the class.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt; ExampleDataGroup {
   {
      &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;OWA&quot;&lt;/span&gt; { &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;intranet-pool&quot;&lt;/span&gt; }
      &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Share Point&quot;&lt;/span&gt; { &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;sharepoint-pool&quot;&lt;/span&gt; }
   }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e8778643-13ff-41e4-b2fc-843eaf60e493&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig5-8x6.jpg&quot; title=&quot;Figure 5. Application Listing Class&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;576&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig5_6.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;7. Create the iRule (via iRule editor, GUI, or tmsh)&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; htmlstr &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Pull data from the data group&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; keys [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt; names ExampleDataGroup]
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;DATA GROUP:: $keys&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;foreach&lt;/span&gt; key $keys {
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;KEY:: $key&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Add a new option in the drop down box for each key&lt;/span&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; htmlstr [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;concat&lt;/span&gt; $htmlstr &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;option value=\&quot;$key\&quot;&amp;gt;$key&amp;lt;/option&amp;gt;&quot;&lt;/span&gt;]
  }
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;HTML STRING:: $htmlstr&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Using the session variable we inserted through advanced customization, we can insert the html code we generated above&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.custom.logon_opt&quot;&lt;/span&gt; $htmlstr
}

&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_ACL_ALLOWED&lt;/span&gt; {
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; appname [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.logon.last.appname&quot;&lt;/span&gt;]
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;appname: $appname&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; keys [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt; names ExampleDataGroup]
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; index [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;lsearch&lt;/span&gt; $keys $appname]
  &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;index: $index&quot;&lt;/span&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; {$index &amp;gt;= 0} {
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; keyValue [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt; element $index ExampleDataGroup]
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;pool&lt;/span&gt; [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;lindex&lt;/span&gt; $keyValue 1]
    &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# log local0. &quot;POOL:: [lindex $keyValue 1]&quot;&lt;/span&gt;
  }
}
&lt;/pre&gt;
&lt;p&gt;Note that the class name referenced in the iRule should match the actual class name (instead of ExampleDataGroup as shown above)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;8. Apply the iRule to the APM virtual server and I’m done!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh modify /ltm virtual custom_dropdown_vs rules { custom_dropdown_iRule }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Figure 6 below shows the resulting logon page from the customizations performed.&amp;#160; This is just the surface of what can be done to customize the logon page.&amp;#160; Many thanks to F5er ystephie for writing up the documentation steps for this solution.&lt;/p&gt;
&lt;div&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c24df361-8e21-4c33-b4b3-88386f04d160&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig6-8x6.png&quot; title=&quot;Figure 6. Custom Logon Page&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;9bfd376b&#039;})&quot;&gt;&lt;img height=&quot;570&quot; border=&quot;0&quot; width=&quot;660&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jun/Windows-Live-Writer-Customizing-the-BIG-IP-APM_EE92-apm_customlogon_fig6_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/default.aspx/APM.HomePage&quot;&gt;DevCentral Wiki: BIG-IP Access Policy Manager (APM) Wiki Home&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086455/Auto-launch-Remote-Desktop-Sessions-with-APM.aspx&quot;&gt;Auto-launch Remote Desktop Sessions with APM &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1177220/asg/62/Default.aspx&quot;&gt;NTLM/ Outlook Anywhere/ Big-IP APM - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086453/Web-Application-Login-Integration-with-APM.aspx&quot;&gt;Web Application Login Integration with APM &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/psilva/archive/2010/10/25/f5-tutorial-big-ip-apm-with-secureauth.aspx&quot;&gt;F5 Tutorial: BIG-IP APM with SecureAuth&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/47/aft/1177236/Default.aspx&quot;&gt;Set APM Cookies to HttpOnly - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/default.aspx/iRules.APM&quot;&gt;DevCentral Wiki: APM&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1177150/asg/39/Default.aspx&quot;&gt;nested virtuals with APM - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/psilva/category/1084486.aspx&quot;&gt;Pete Silva - apm&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/73/aft/1179046/Default.aspx&quot;&gt;BigIp_VE_10.1.0 — APM module and Hypervisor Support - DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/-RE1wnQGPLg&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1882843&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 21 Jun 2011 05:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1882843</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1882843#feedback</comments>
</item>
<item>
 <title>Changing the BIG-IP Default Syslog-NG Facilities</title>
 <link>http://jasonrahm.ulitzer.com/node/1880630</link>
 <description>&lt;p&gt;DevCentral community member geffr had a problem. The &lt;a href=&quot;http://www.f5.com/products/big-ip/application-security-manager.html&quot;&gt;BIG-IP Application Security Manager&lt;/a&gt; module logs to the local3 facility but he needs to send them to the local7 facility on a remote server. Before giving up entirely, he posted to &lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/44/aft/25821/showtab/groupforums/Default.aspx#1250561&quot;&gt;this thread&lt;/a&gt; in the Monitoring &amp;amp; Management group forum, where user nitass helped him jump through the syslog-ng hoops (&lt;a href=&quot;http://www.syslog.org/logged/pot-of-syslog-ng-tricks-version-3/&quot;&gt;click here for tips &amp;amp; tricks on syslog-ng&lt;/a&gt;) to the working solution posted below. It’s pretty straight forward. Define a template, a filter, and a destination, and then put the pieces together in a log statement.&lt;/p&gt;  &lt;p&gt;&lt;i /&gt;&lt;/p&gt;  &lt;div id=&quot;codeSnippetWrapper&quot;&gt;   &lt;blockquote&gt;     &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;b syslog &lt;span style=&quot;color: #0000ff&quot;&gt;include&lt;/span&gt; &lt;span style=&quot;color: #006080&quot;&gt;&#039;&quot;&lt;br /&gt;&lt;br /&gt;filter f_local3a {&lt;br /&gt;   facility(local3);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template t_asm {&lt;br /&gt;   template(\&quot;&amp;lt;190&amp;gt; $MSGHDR$MSG\n\&quot;);&lt;br /&gt;   template_escape(no);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;destination d_loghost5a {&lt;br /&gt;udp(\&quot;2.2.2.2\&quot; port (514) template(t_asm));&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;log {&lt;br /&gt;   source(local);&lt;br /&gt;   filter(f_local3a);&lt;br /&gt;   destination(d_loghost5a);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&quot;&#039;&lt;/span&gt; &lt;/pre&gt;
  &lt;/blockquote&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Note: The b syslog include ‘ “ “ ‘ wrapper around the custom configuration is merely for importing the configuration, it’s note part of the configuration itself.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt; &lt;/p&gt;

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/155/LTM-942-Custom-Syslog-Configuration.aspx&quot;&gt;LTM 9.4.2+: Custom Syslog Configuration &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/44/aft/1171993/showtab/groupforums/Default.aspx&quot;&gt;setting up syslog? - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/SyslogNGEmailConfiguration.html&quot;&gt;DevCentral Wiki: Syslog NG Email Configuration&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/201/Configuring-syslog-ng-to-email-messages.aspx&quot;&gt;Configuring syslog-ng to email messages &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/81/Syslog-Priority-Translation.aspx&quot;&gt;Syslog Priority Translation &amp;gt; DevCentral &amp;gt; F5 DevCentral &amp;gt; Tech Tips&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/deb/Tags/syslog/default.aspx&quot;&gt;Deb Allen - syslog&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/32/aft/1172264/afv/topic/asg/44/Default.aspx&quot;&gt;Customizing syslog-ng f_local0 filter - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/32/aft/790720/afv/topic/Default.aspx&quot;&gt;Syslog locally and remote with specific facility level ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/5/aft/84617/afv/topic/Default.aspx&quot;&gt;Duplicate syslog traffic to multiple destinations - DevCentral ...&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/31/aft/27956/afv/topic/Default.aspx&quot;&gt;Custom syslog-ng facility - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2cd57d08-f1cd-4ad7-ac1a-207b4f0a733c&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP&quot; rel=&quot;tag&quot;&gt;BIG-IP&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/ASM&quot; rel=&quot;tag&quot;&gt;ASM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Application+Security+Manager&quot; rel=&quot;tag&quot;&gt;Application Security Manager&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/syslog&quot; rel=&quot;tag&quot;&gt;syslog&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/syslog-ng&quot; rel=&quot;tag&quot;&gt;syslog-ng&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094490.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/CM7Xx_nWeZI&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1880630&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 20 Jun 2011 04:44:26 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1880630</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1880630#feedback</comments>
</item>
<item>
 <title>Hosting Sorry, Error, or Maintenance Pages on BIG-IP LTM with iRules</title>
 <link>http://jasonrahm.ulitzer.com/node/1873724</link>
 <description>&lt;p&gt;I’ve posted on this before (&lt;a href=&quot;http://devcentral.f5.com/weblogs/jason/archive/2009/05/12/host-that-sorry-page-on-your-big-ip.aspx&quot;&gt;Host that Sorry Page on your BIG-IP!&lt;/a&gt;) but it’s been a while and there have been a few updates.  Besides, narrowing the application to only sorry pages is a bit myopic—I’m sure my BIG-IP is offended that I treated it so callously.  Anyway, I got an inquiry a week or so ago about the images in tables not being picked up by the script.  The images in the table were referenced as such:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div&gt;     &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;#&lt;span style=&quot;color: #0000ff&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;table&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;background&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;=&quot;genericofflinebackground.gif&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;align&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;=&quot;center&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;=&quot;1024&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;=&quot;768&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;div&gt;
  &lt;br /&gt;I reached out to the author, Kirk Bauer, and he gave me some pointers as where to look.  There’s a function in the perl script that parses the html to look for items of interest:&lt;/div&gt;

&lt;div&gt; &lt;/div&gt;

&lt;blockquote&gt;
  &lt;pre style=&quot;border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px&quot;&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;sub&lt;/span&gt; start {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; ($self, $tag, $attr, $attrseq, $origtext) = @_;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   # &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; out original text
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($tag eq &#039;img&#039;) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($attr-&amp;gt;{&#039;src&#039;}) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;         $attr-&amp;gt;{&#039;src&#039;} = &amp;amp;handle_object($tag, &#039;src&#039;, $attr-&amp;gt;{&#039;src&#039;});
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   }&lt;/pre&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modifying the if ($tag..) conditional to match the table wasn’t that hard at all:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style=&quot;border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px&quot;&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;sub&lt;/span&gt; start {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; ($self, $tag, $attr, $attrseq, $origtext) = @_;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   # &lt;span style=&quot;color: #0000ff&quot;&gt;print&lt;/span&gt; out original text
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($tag eq &#039;img&#039;) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($attr-&amp;gt;{&#039;src&#039;}) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;         $attr-&amp;gt;{&#039;src&#039;} = &amp;amp;handle_object($tag, &#039;src&#039;, $attr-&amp;gt;{&#039;src&#039;});
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($tag eq &#039;table&#039;) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($attr-&amp;gt;{&#039;background&#039;}) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;         $attr-&amp;gt;{&#039;background&#039;} = &amp;amp;handle_object($tag, &#039;background&#039;, $attr-&amp;gt;{&#039;background&#039;});
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   }&lt;/pre&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;That solved problem number one.  The second problem with the script was that it wasn’t asking about partition preference, rather it just dumped the iRule and datagroups into the last partition defined in bigip.conf.  This was strange, as the code to handle partitions was in place:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style=&quot;border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px&quot;&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; @partitions;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;open&lt;/span&gt; (CONF, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;/config/bigip.conf&lt;/span&gt;&quot;) or &lt;span style=&quot;color: #0000ff&quot;&gt;die&lt;/span&gt; &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Could not read /config/bigip.conf: $!\n&lt;/span&gt;&quot;;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;while (&lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; $line = &amp;lt;CONF&amp;gt;) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($line =~ /^partition (.+) {/) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;push&lt;/span&gt; @partitions, $1;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;   }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is that the regex is trying to match “partition &amp;lt;my partition&amp;gt; {“ and that is (at least in 10.2.1 HF3) no longer in the bigip.conf file.  It has been moved to bigip_sys.conf.  Updating the code as shown below solved the issue and now the user is asked for the appropriate partition and the iRule and datagroup gets deployed as expected.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style=&quot;border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px&quot;&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; @partitions;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;open&lt;/span&gt; (CONF, &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;/config/bigip_sys.conf&lt;/span&gt;&quot;) or &lt;span style=&quot;color: #0000ff&quot;&gt;die&lt;/span&gt; &quot;&lt;span style=&quot;color: #8b0000&quot;&gt;Could not read /config/bigip_sys.conf: $!\n&lt;/span&gt;&quot;;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      while (&lt;span style=&quot;color: #0000ff&quot;&gt;my&lt;/span&gt; $line = &amp;lt;CONF&amp;gt;) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; ($line =~ /^partition (.+) {/) {
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;            &lt;span style=&quot;color: #0000ff&quot;&gt;push&lt;/span&gt; @partitions, $1;
&lt;/pre&gt;&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;         }
&lt;/pre&gt;&lt;pre style=&quot;background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#039;Courier New&#039;,courier,monospace; font-size: 12px&quot;&gt;      }&lt;/pre&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the full script, head to the iRules wiki entry &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/LTMMaintenancePageGenerator.html&quot;&gt;LTM Maintenance Page Generator&lt;/a&gt; and grab version 2.2.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/jason/archive/2009/05/12/host-that-sorry-page-on-your-big-ip.aspx&quot;&gt;Host that Sorry Page on your BIG-IP!&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/33977/Default.aspx&quot;&gt;about i-rule sorry page configuration - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/Automatic_maintenance_page___Sorry_page_with_images.html&quot;&gt;DevCentral Wiki: Automatic_maintenance_page___ Sorry_page_with_images&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/SorryPageIRuleGenerator_Perl.html&quot;&gt;DevCentral Wiki: Sorry Page I Rule Generator_ Perl&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/LTMMaintenancePageGenerator.html&quot;&gt;DevCentral Wiki: LTM Maintenance Page Generator&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/CodeShare.html&quot;&gt;DevCentral Wiki: CodeShare&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Default.aspx?tabid=53&amp;amp;aff=16&amp;amp;aft=4642&amp;amp;afv=topic&quot;&gt;Sorry Page when Severs are down - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/26111/asg/39/Default.aspx&quot;&gt;Site Dwon Page form https virtual server - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;
  &lt;/p&gt;&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ee2477b8-b0ac-4746-8fa5-9a74728b4381&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/sorry+page&quot; rel=&quot;tag&quot;&gt;sorry page&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/error+page&quot; rel=&quot;tag&quot;&gt;error page&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/maintenance+page&quot; rel=&quot;tag&quot;&gt;maintenance page&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/perl&quot; rel=&quot;tag&quot;&gt;perl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Kirk+Bauer&quot; rel=&quot;tag&quot;&gt;Kirk Bauer&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094480.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/8IPHtMwfDP0&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1873724&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 14 Jun 2011 14:04:50 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1873724</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1873724#feedback</comments>
</item>
<item>
 <title>Removing A Strange HTTP Header with iRules</title>
 <link>http://jasonrahm.ulitzer.com/node/1854976</link>
 <description>&lt;p&gt;User Ralph Hoflich dropped an interesting problem off in the forums for his first post evah…he had a wireshark capture with a highly unusual header name:&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:725c98a3-7f78-484a-9487-b899f96e9edb&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Removing-Strange-Headers_CF1F/HTTP_header-8x6.jpg&quot; title=&quot;HTTP Header &quot; rel=&quot;thumbnail&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Removing-Strange-Headers_CF1F/HTTP_header_4.png&quot; width=&quot;580&quot; height=&quot;187&quot; /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;Yes, the header name was “:”.  This is interesting as it is also the separator in headers between the field name/value pair as described in &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2&quot;&gt;rfc 2616 section 4.2&lt;/a&gt;.  Thankfully, it’s just another character and is parsed out as such with iRules.  So the simple task of removing a header like this is completed painlessly (as Ralph suspected in his own question).  I added a couple logging statements to check before/after request headers:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;HTTP_REQUEST&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: #006080&quot;&gt;&quot;[HTTP::header names]&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;HTTP::header&lt;/span&gt; remove :&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;HTTP_REQUEST_SEND&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;clientside&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;      &lt;span style=&quot;color: #0000ff&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: #006080&quot;&gt;&quot;[HTTP::header names]&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;a href=&quot;http://devcentral.f5.com/Wiki/default.aspx/iRules.HTTP__header&quot;&gt;HTTP::header remove&lt;/a&gt; command will not error out if the header isn’t present, so there’s no need for a conditional check.  &lt;/p&gt;

&lt;h3&gt;Testing&lt;/h3&gt;

&lt;p&gt;From the browser, I couldn’t generate the load as desired with the Firefox modify headers plugin, but I was able to insert the header with cURL:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;root@jrahm-dev:~# curl -v -H &#039;:: /r/n&#039; &lt;a href=&quot;http://10.10.20.50/&quot;&gt;http://10.10.20.50/&lt;/a&gt;

    &lt;br /&gt;* About to connect() to 10.10.20.50 port 80 (#0)

    &lt;br /&gt;*   Trying 10.10.20.50... connected

    &lt;br /&gt;* Connected to 10.10.20.50 (10.10.20.50) port 80 (#0)

    &lt;br /&gt;&amp;gt; GET / HTTP/1.1

    &lt;br /&gt;&amp;gt; User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15

    &lt;br /&gt;&amp;gt; Host: 10.10.20.50

    &lt;br /&gt;&amp;gt; Accept: */*

    &lt;br /&gt;&amp;gt; :: /r/n

    &lt;br /&gt;&amp;gt;

    &lt;br /&gt;&amp;lt; HTTP/1.1 200 OK

    &lt;br /&gt;&amp;lt; Date: Tue, 31 May 2011 20:02:57 GMT

    &lt;br /&gt;&amp;lt; Server: Apache/2.2.14 (Ubuntu)

    &lt;br /&gt;&amp;lt; Last-Modified: Thu, 24 Jun 2010 14:26:22 GMT

    &lt;br /&gt;&amp;lt; ETag: &quot;381fef-b1-489c77054eef8&quot;

    &lt;br /&gt;&amp;lt; Accept-Ranges: bytes

    &lt;br /&gt;&amp;lt; Content-Length: 177

    &lt;br /&gt;&amp;lt; Vary: Accept-Encoding

    &lt;br /&gt;&amp;lt; Content-Type: text/html

    &lt;br /&gt;&amp;lt; X-Pad: avoid browser bug

    &lt;br /&gt;&amp;lt;

    &lt;br /&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;It works!&amp;lt;/h1&amp;gt;

    &lt;br /&gt;&amp;lt;p&amp;gt;This is the default web page for this server.&amp;lt;/p&amp;gt;

    &lt;br /&gt;&amp;lt;p&amp;gt;The web server software is running but no content has been added, yet.&amp;lt;/p&amp;gt;

    &lt;br /&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;

    &lt;br /&gt;* Connection #0 to host 10.10.20.50 left intact

    &lt;br /&gt;* Closing connection #0

    &lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the resulting log statements:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;May 31 15:27:45 local/tmm info tmm[4972]: Rule header_remove &amp;lt;HTTP_REQUEST&amp;gt;: User-Agent Host Accept :
    &lt;br /&gt;May 31 15:27:45 local/tmm info tmm[4972]: Rule header_remove &amp;lt;HTTP_REQUEST_SEND&amp;gt;: User-Agent Host Accept&lt;/p&gt;
&lt;/blockquote&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/01/15/i-am-in-your-http-headers-attacking-your-application.aspx&quot;&gt;I am in your HTTP headers, attacking your application&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/HTTP__header.html&quot;&gt;DevCentral Wiki: HTTP::header&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2008/08/06/3519.aspx&quot;&gt;Working around client-side limitations on custom HTTP headers&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1174746/asg/50/Default.aspx&quot;&gt;Add http header of Server IP address? - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/2822/Default.aspx&quot;&gt;Syntax for http header manipulation - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1178695/asg/50/Default.aspx&quot;&gt;iRule persistance based on HTTP header - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/56131/asg/50/Default.aspx&quot;&gt;redirect base on HTTP header - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/56062/Default.aspx&quot;&gt;http header inserts - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/10069/asg/50/Default.aspx&quot;&gt;Error on HTTP::header insert - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8fffa527-f73f-468c-9de0-6508783d2f5d&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/HTTP%3a%3aheader&quot; rel=&quot;tag&quot;&gt;HTTP::header&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094442.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/oeXkPYW0pGk&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1854976&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 31 May 2011 09:24:33 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1854976</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1854976#feedback</comments>
</item>
<item>
 <title>Fun with iRules: Haiku Error Responses</title>
 <link>http://jasonrahm.ulitzer.com/node/1810131</link>
 <description>&lt;p&gt;One of our stellar sales engineers, Rob Eberhardt, whipped up a fun iRule after one of his customers showed him some HTTP 404 errors returning haiku in BeOS.  The class, and iRule, followed by the result.  Enjoy!&lt;/p&gt;  &lt;h3&gt;The Class&lt;/h3&gt;  &lt;p&gt;Stored as an external class in /var/class/haiku_int.class (integer type).&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;1 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;The web site you seek&amp;lt;br&amp;gt;Lies beyond our perception&amp;lt;br&amp;gt;But others await.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;2 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;Sites you are seeking&amp;lt;br&amp;gt;From your path they are fleeing&amp;lt;br&amp;gt;Their winter has come.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;3 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;A truth found, be told&amp;lt;br&amp;gt;You are far from the fold, Go&amp;lt;br&amp;gt;Come back yet again.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;4 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;Wind catches lily&amp;lt;br&amp;gt;Scatt&#039;ring petals to the wind:&amp;lt;br&amp;gt;Your site is not found.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;5 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;These three are certain:&amp;lt;br&amp;gt;Death, taxes, and site not found.&amp;lt;br&amp;gt;You, victim of one.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;6 := &lt;span style=&quot;color: #006080&quot;&gt;&quot;Ephemeral site.&amp;lt;br&amp;gt;I am the Blue Screen of Death.&amp;lt;br&amp;gt;No one hears your screams.&quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;



&lt;p&gt;This continues on through 38, but the remaining ones removed for brevity.  Now the class reference:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id=&quot;codeSnippetWrapper&quot;&gt;
    &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;
      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; haiku_class {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;   type value&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;   filename &lt;span style=&quot;color: #006080&quot;&gt;&quot;/var/class/haiku_int.class&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;   separator &lt;span style=&quot;color: #006080&quot;&gt;&quot;:=&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;   }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;h3&gt;The iRule&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;div id=&quot;codeSnippetWrapper&quot;&gt;
    &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;
      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;RULE_INIT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;  &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt;::error_404 {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;html&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;body bgcolor=&lt;span style=&quot;color: #006080&quot;&gt;&quot;#E7E7E7&quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;div &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt;=Section1&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;br&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;p &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt;=MsoNormal align=center&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;span&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;div align=center&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;&lt;span style=&quot;color: #0000ff&quot;&gt;table&lt;/span&gt; width=500 height=258&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;tr&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;td width=105 valign=center style=&lt;span style=&quot;color: #006080&quot;&gt;&#039;background:#0078AD&#039;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;p align=center&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;span style=&lt;span style=&quot;color: #006080&quot;&gt;&#039;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;; color: white; font-size: large&#039;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        Error 404:&amp;lt;br&amp;gt;File Not Found&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;td width=236 style=&lt;span style=&quot;color: #006080&quot;&gt;&#039;background:white&#039;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;        &amp;lt;p align=center&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&lt;span style=&quot;color: #006080&quot;&gt;&#039;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;&#039;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    }  &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;HTTP_RESPONSE&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;  if { [HTTP::status] == 404 } {&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; randomnumber [&lt;span style=&quot;color: #0000ff&quot;&gt;expr&lt;/span&gt; { int (38 * rand()) }]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; haiku [&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; match -value $randomnumber &lt;span style=&quot;color: #0000ff&quot;&gt;equals&lt;/span&gt; haiku_class]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; response [&lt;span style=&quot;color: #0000ff&quot;&gt;concat&lt;/span&gt; $&lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt;::error_404 $haiku]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;HTTP::respond&lt;/span&gt; 200 content [&lt;span style=&quot;color: #0000ff&quot;&gt;subst&lt;/span&gt; $response]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;  }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;} &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;h3&gt;The Result&lt;/h3&gt;

&lt;p&gt;Here’s a couple snapshots of the browser (I commented out the if clause to generate the error every request)&lt;/p&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:0b906682-4ae4-4a98-87b0-0370fb96ee2f&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Fun-with-iRules_CF2F/404_1-8x6.png&quot; title=&quot;&quot; rel=&quot;thumbnail&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Fun-with-iRules_CF2F/404_1_9.png&quot; width=&quot;420&quot; height=&quot;270&quot; /&gt;&lt;/a&gt;&lt;/div&gt;









&lt;p&gt;
  &lt;/p&gt;&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:3796af50-8d2a-4ab3-9d64-87a12befe39b&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Fun-with-iRules_CF2F/404_2-8x6.png&quot; title=&quot;&quot; rel=&quot;thumbnail&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Fun-with-iRules_CF2F/404_2_1.png&quot; width=&quot;420&quot; height=&quot;270&quot; /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;&lt;i /&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt; &lt;/p&gt;

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/4925/asg/39/Default.aspx&quot;&gt;more fun with iRules - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;https://devcentral.f5.com/weblogs/Joe/archive/2005/09/27/1506.aspx&quot;&gt;iRule: Fun with 404s&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2008/03/06/3099.aspx&quot;&gt;iRules: Rewriting URIs for Fun and Profit&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/5/aft/4233/afv/topic/Default.aspx&quot;&gt;Fun with 404s - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/19358/Default.aspx&quot;&gt;Fun with regexp... - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/4233/asg/52/Default.aspx&quot;&gt;Fun with 404s - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/6958/Default.aspx&quot;&gt;Fun with ldap - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aft/6084/Default.aspx&quot;&gt;more fun with jsessionid persistence - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/1174118/Default.aspx&quot;&gt;Akamai, True-Client-IP, and fun with logging - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086420/Fun-with-Hash-Performance-and-Google-Charts.aspx&quot;&gt;Fun with Hash Performance and Google Charts &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094363.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/iwKNTjP4nk0&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1810131&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 27 Apr 2011 09:41:39 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1810131</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1810131#feedback</comments>
</item>
<item>
 <title>Remote Authorization via Active Directory</title>
 <link>http://jasonrahm.ulitzer.com/node/1810132</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;A while back I wrote an article on &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2316/v10--Remote-Authorization-via-TACACS43.aspx&quot;&gt;remote authorization via tacacs+&lt;/a&gt;.&amp;#160; I got a question in the comments yesterday about the same functionality with active directory.&amp;#160; I hadn’t done anything with active directory outside of APM, so I wasn’t sure I could help. However, after reading up on a few solutions on askF5 (&lt;a href=&quot;http://support.f5.com/kb/en-us/solutions/public/10000/900/sol10929.html?sr=14099510&quot;&gt;10929&lt;/a&gt; and &lt;a href=&quot;http://support.f5.com/kb/en-us/solutions/public/11000/000/sol11072.html?sr=14099474&quot;&gt;11072&lt;/a&gt; specifically), I gave it a shot and turns out it’s not so difficult at all.&amp;#160; For more details on the roles themselves, reference the tacacs+ article.&amp;#160; This tech tip will focus solely on defining the administrator and guest roles in the remoterole configuration on BIG-IP and setting up the active directory attributes.&lt;/p&gt;
&lt;h3&gt;Mapping AD Attributes&lt;/h3&gt;
&lt;p&gt;The attribute in the remoterole for active directory will look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;memberOF=cn=&amp;lt;common name&amp;gt;, ou=&amp;lt;organizational unit&amp;gt;,dc=x,dc=y&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some notes on this&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;The cn can be a single account, or a group.&amp;#160; For example, jason.rahm (single account) or grp-Admins (security group)&amp;#160; In the string, they’re represented as such:
    &lt;ul&gt;
        &lt;li&gt;memberOF=cn=jason.rahm&lt;/li&gt;
        &lt;li&gt;memberOF=cn=grp-Admins&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;The ou is the organization unit where the cn is defined.&amp;#160; It can be deeper than one level (So if the OU organization was IT-&amp;gt;Ops and IT-&amp;gt;Eng, the ou part of the string would like this:
    &lt;ul&gt;
        &lt;li&gt;ou=Ops,ou=IT&lt;/li&gt;
        &lt;li&gt;ou=Eng,ou=IT&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;The dc is the domain component.&amp;#160; So for a domain like devcentral.test, the dc looks like this
    &lt;ul&gt;
        &lt;li&gt;dc=devcentral,dc=test&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Putting the examples all together, one attribute would look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;memberOF=cn=grp-Admins,ou=Ops,ou=IT,dc=devcentral,dc=test&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Defining the Remote Role Configuration&lt;/h3&gt;
&lt;p&gt;In tmsh, the remote-role configuration is under the auth module.&amp;#160; The configuration options available to a specific role (defined under role-info) are shown below&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(tmos.auth.remote-role)# modify role-info add { F5Guest { ?      &lt;br /&gt;
Properties:       &lt;br /&gt;
&amp;#160; &quot;}&quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Close the left brace       &lt;br /&gt;
&amp;#160; &lt;strong&gt;attribute&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Specifies the name of the group of remotely-authenticated users for whom you are configuring specific access rights to the BIG-IP system.       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; This value is required.       &lt;br /&gt;
&amp;#160; &lt;strong&gt;console&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Enables or disables console access for the specified group of remotely authenticated users. You may specify bpsh, disabled, tmsh or use       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; variable substitution as describe in the help page. The default value is disabled.       &lt;br /&gt;
&amp;#160; &lt;strong&gt;deny&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Enables or disables remote access for the specified group of remotely authenticated users. The default value is disable.       &lt;br /&gt;
&amp;#160; &lt;strong&gt;line-order&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Specifies the order of the line in the file, /config/bigip/auth/remoterole. The LDAP and Active Directory servers read this file line by       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; line. The order of the information is important; therefore, F5 recommends that you set the first line at 1000. This allows you, in the       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; future, to insert lines before the first line. This value is required.       &lt;br /&gt;
&amp;#160; &lt;strong&gt;role&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Specifies the role that you want to grant to the specified group of remotely authenticated users. The default value is no-access. The       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; available roles and the corresponding number that you use to specify the role are: admin (0), resource-admin (20), user-manager (40),       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; manager (100), application-editor (300), operator (400), guest (700), policy-editor (800) and no-access (900).       &lt;br /&gt;
&amp;#160; &lt;strong&gt;user-partition&lt;/strong&gt;&amp;#160; Specifies the user partition to which you are assigning access to the specified group of remotely authenticated users. The default value       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is Common.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With that syntax information and the AD attribute strings, I can define both roles:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh modify auth remote-role role-info add { F5Admins { attribute memberOF=cn=grp-F5Admins,ou=Groups,dc=devcentral,dc=test console enable line-order 1 role administrator user-partition all } }&lt;/p&gt;
&lt;p&gt;tmsh modify auth remote-role role-info add { F5Guests { attribute memberOF=cn=grp-F5Staff,ou=Groups,dc=devcentral,dc=test console disabled line-order 2 role guest user-partition all } }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next I confirm the settings took.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh show running-config /auth remote-role&lt;/p&gt;
&lt;p&gt;auth remote-role {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; role-info {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; F5Admins {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attribute memberOF=cn=grp-F5Admins,ou=Groups,dc=devcentral,dc=test       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console enable       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; line-order 1       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; role administrator       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; user-partition all       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; F5Guests {       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; attribute memberOF=cn=grp-F5Staff,ou=Groups,dc=devcentral,dc=test       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; console disabled       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; line-order 2       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; role guest       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; user-partition all       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Configure the BIG-IP to Use Active Directory&lt;/h3&gt;
&lt;p&gt;Here I set the BIG-IP to use ldap authentication, defining my base-dn and the login attribute (samaccountname) and the user template (&lt;a href=&quot;mailto:%s@devcentral.test&quot;&gt;%s@devcentral.test&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh modify auth ldap system-auth login-attribute samaccountname search-base-dn dc=devcentral,dc=test servers add { 192.168.202.110 } user-template &lt;a href=&quot;mailto:%s@devcentral.test&quot;&gt;%s@devcentral.test&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And once again confirming the settings:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmsh show running-config /auth ldap system-auth&lt;/p&gt;
&lt;p&gt;auth ldap system-auth {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; login-attribute samaccountname       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; search-base-dn dc=devcentral,dc=test       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; servers { 192.168.202.110 }       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; user-template &lt;a href=&quot;mailto:%s@devcentral.test&quot;&gt;%s@devcentral.test&lt;/a&gt;       &lt;br /&gt;
}       &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Testing the Configuration&lt;/h3&gt;
&lt;p&gt;For the test there are two users.&amp;#160; test.user belongs the grp-F5Staff cn, and jason.rahm belongs to the grp-F5Admins cn.&amp;#160; Therefore, test.user should have Guest access to the GUI and no access to the console, whereas jason.rahm should have Administrator access to the GUI and console access.&amp;#160; Let’s see if that’s the case.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:873d4df7-5d7b-445a-bbaa-a77ecac4a30f&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6cd0ded9&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;grp-F5Admins access to console confirmed&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_ssh_1-8x6.png&quot;&gt;&lt;img height=&quot;419&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_ssh_1_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ed3cf5aa-d736-4143-98ad-d72ddc836f06&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6cd0ded9&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;grp-F5Staff disabled console confirmed&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_ssh_2-8x6.png&quot;&gt;&lt;img height=&quot;419&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_ssh_2_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:32517402-468c-4e7b-9f79-4b865ae58959&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6cd0ded9&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;grp-F5Admins GUI Administrator role confirmed&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_gui_1-8x6.png&quot;&gt;&lt;img height=&quot;466&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_gui_1_5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:652f2452-3598-4eaa-b8e2-e2ac1a99696d&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6cd0ded9&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;grp-F5Staff GUI Guest role confirmed&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_gui_2-8x6.png&quot;&gt;&lt;img height=&quot;466&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-b5a6be537769_8B81-ad_remoteauth_gui_2_4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;In this tech tip I walked through the steps required to configure remote authorization utilizing the BIG-IP remoterole configuration and Active Directory.&amp;#160; I didn’t cover the custom attributes like the in tacacs+ article, but the same process applies, so if you’d rather define the roles within Active Directory that can be done as well.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/wkwr2fl6KlI&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1810132&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 27 Apr 2011 05:05:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1810132</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1810132#feedback</comments>
</item>
<item>
 <title>Getting Started with Splunk for F5</title>
 <link>http://jasonrahm.ulitzer.com/node/1808041</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;Pete Silva &amp;amp; Lori MacVittie both had blog posts last week featuring the F5 Application for Splunk, so I thought I’d take the opportunity to get &lt;a href=&quot;http://www.splunk.com/&quot;&gt;Splunk&lt;/a&gt; installed and check it out.&amp;#160; In this first part, I’ll cover the installation process. &amp;#160;This is one of the easiest installions I&#039;ve ever written about--it&#039;s almost like I&#039;m cheating or something.&lt;/p&gt;
&lt;h3&gt;Installing Splunk&lt;/h3&gt;
&lt;p&gt;My platform of choice for this article is Ubuntu, so I downloaded the 4.2.1 Debian package for 64-bit systems from the Splunk site.&amp;#160; Installation is a one step breeze:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;dpkg –i /var/tmp/splunk-4.2.1-98165-linux-2.6-amd64.deb&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After installation (defaulting to /opt/splunk) start the Splunk server:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/opt/splunk/bin/splunk start&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had to accept the license agreement during the startup process.&amp;#160; Afterwards, I was instructed to point my browser to http:&amp;lt;server&amp;gt;:8000.&amp;#160; I logged in with the default credentials (admin / changeme) and then was instructed to change my password, which I did (you can skip this step if you prefer).&amp;#160; Pretty easy path to an completed installation.&amp;#160; The browser should now be in the state shown below in Figure 1.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c83c961e-3c56-4ff2-bb1f-be89a53335fd&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ff4767d2&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 1. Splunk Home&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_home-8x6.png&quot;&gt;&lt;img height=&quot;375&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_home_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;Installing Splunk for F5&lt;/h3&gt;
&lt;p&gt;Click on Manager in the upper right-hand corner of the screen, which should take you to the screen shown below in Figure 2.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f883b5a1-10e1-44e2-b762-550688563a85&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ff4767d2&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 2. Splunk Manager&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_manager-8x6.png&quot;&gt;&lt;img height=&quot;375&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_manager_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Next, click on Apps as shown below in Figure 3.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:9c1f8df1-0e48-4ca4-8781-c81da9246407&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ff4767d2&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 3. Splunk Apps&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_apps-8x6.png&quot;&gt;&lt;img height=&quot;375&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_apps_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;At this point you have a choice.&amp;#160; If you downloaded the &lt;a href=&quot;http://splunk-base.splunk.com/apps/22294/splunk-for-f5&quot;&gt;Splunk for F5&lt;/a&gt; app from &lt;a href=&quot;http://splunk-base.splunk.com/&quot;&gt;splunkbase&lt;/a&gt;, you can click the “install app from file” button.&amp;#160; I chose to install from the web, so I clicked the “find more apps online” button.&amp;#160; This loaded a listing from splunkbase, with the Splunk for F5 app shown at the bottom of Figure 4 below.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:4e2133c7-e6ea-452c-809e-6892ada0188f&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ff4767d2&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 4. Online Apps&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_onlineapps-8x6.png&quot;&gt;&lt;img height=&quot;375&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_onlineapps_7.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After clicking the “install Free” button, I had to enter my splunk.com credentials, then the application installed.&amp;#160; Splunk requested a restart, so I restarted and then logged back in.&amp;#160; My new session was returned to the online apps screen, so to get to my new F5 app, I clicked “back to search” in the upper left corner, which took my to the Search app home page.&amp;#160; Finally, in the upper right corner I selected App and then clicked “Splunk for F5 Security”.&amp;#160; This resulted in the screen show below in Figure 5.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:a44d4c8b-797c-4bda-9ba8-c5ec49b52533&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;ff4767d2&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 5. Splunk for F5&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_f5_postinstall-8x6.png&quot;&gt;&lt;img height=&quot;375&quot; border=&quot;0&quot; width=&quot;580&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Getting-Started-with-Splunk-for-F5_C797-splunk_f5_postinstall_3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Success!&amp;#160; Now…what to do with it?&amp;#160; How is this useful?&amp;#160; Check back for part two next week… For some hints, check out the blogs I mentioned at the top of this article from Pete and Lori:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/macvittie/archive/2011/04/22/f5-friday-spelunking-for-big-data.aspx&quot;&gt;Spelunking for Big Data&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/psilva/archive/2011/04/19/do-you-splunk-2.0.aspx&quot;&gt;Do You Splunk 2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;i&gt;Other Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/psilva/archive/2009/01/14/do-you-splunk.aspx&quot;&gt;Do you Splunk?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/asg/39/aft/1172058/showtab/groupforums/Default.aspx&quot;&gt;ASM &amp;amp; Splunk integration - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/psilva/archive/2010/03/09/f5-networks-partner-spotlight-splunk.aspx&quot;&gt;F5 Networks Partner Spotlight - Splunk&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/32/aft/1145124/Default.aspx&quot;&gt;f5 ltm dashboard in splunk - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aft/1178697/Default.aspx&quot;&gt;Logging HTTP traffic to Splunk - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/1172552/afv/topic/Default.aspx&quot;&gt;Client IP Logging with F5 &amp;amp; Splunk - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/JeOtnx-jw_Q&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1808041&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 26 Apr 2011 10:09:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1808041</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1808041#feedback</comments>
</item>
<item>
 <title>To the Cloud! (On a Wing and a Prayer)</title>
 <link>http://jasonrahm.ulitzer.com/node/1805761</link>
 <description>&lt;p&gt;Being the &lt;strike&gt;incredible&lt;/strike&gt; horrible planner I am, I started to order invitations early last week for a party I’m throwing for my wife’s graduation and it turns out they wanted double the cost of the invitations in overnight shipping!  So…I sent evites.  It took a day, however, to actually get them out.  I started the process but was interrupted by the EC2 outage.  I only know that for sure because the evite site I used was very quick to tell me in their error message that the problem was with the “Amazon EC2 Datacenter.”  &lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/tornado2_2.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;tornado2&quot; border=&quot;0&quot; alt=&quot;tornado2&quot; align=&quot;right&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/tornado2_thumb.png&quot; width=&quot;244&quot; height=&quot;239&quot; /&gt;&lt;/a&gt;Was Amazon down?  Yes.  Is it Amazon’s fault the evite site couldn’t deliver?  Absolutely not.  The only failure that’s really noteworthy is that the issues they faced cascaded beyond a single availability zone and impacted others.  That shouldn’t happen—Amazon has some explaining to do on that front.&lt;/p&gt;  &lt;p&gt;Infrastructure as a service is a platform, not a design.  To set it and forget it in EC2 is just begging for problems, as hundreds of app owners found out last week.  “The Cloud” is hot, trendy, sexy, whatever you want to call it, but it’s not a panacea.  It’s difficult enough to find all the hard and soft points of failure in your own datacenter, but the problem is even more exacerbated when most of the systems your application runs on is abstracted and inaccessible for you to isolate problems.  &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/o_start_quote_rb_2.gif&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;o_start_quote_rb&quot; border=&quot;0&quot; alt=&quot;o_start_quote_rb&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/o_start_quote_rb_thumb.gif&quot; width=&quot;24&quot; height=&quot;13&quot; /&gt;&lt;/a&gt;Everything fails, all the time&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/o_end_quote_rb_2.gif&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;o_end_quote_rb&quot; border=&quot;0&quot; alt=&quot;o_end_quote_rb&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/To-the-Cloud-On-a-Wing-and-a-Prayer_E9FA/o_end_quote_rb_thumb.gif&quot; width=&quot;24&quot; height=&quot;13&quot; /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;--Werner Vogels, CTO Amazon.com&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So for a better experience in deploying applications to the cloud, you must assume that everything will break at every point.  That means that multiple availability zones in a single region is probably not a smart move.  If your application is mission critical, perhaps even multiple regions with a single vendor is not a smart move.  It’s time to stop looking to the cloud as the “easy button” and face reality—you still need people with solid network and systems design skills to get you from an application in the cloud to a cloud application.&lt;/p&gt;  &lt;h3 /&gt;  &lt;h3&gt;Resources&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://www.bluegecko.net/uncategorized/ec2-outage-reactions-showcase-widespread-ignorance-regarding-the-cloud/&quot;&gt;EC2 Outage Reactions Showcase Widespread Ignorance Regarding the Cloud&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://broadcast.oreilly.com/2011/04/the-aws-outage-the-clouds-shining-moment.html&quot;&gt;The AWS Outage: The Cloud’s Shining Moment&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://cloudnewsdaily.com/2011/04/three-things-we-can-learn-from-aws-failure/&quot;&gt;Three Things We Can Learn from AWS Failure&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://feedproxy.google.com/~r/CloudComputingPodcast/~5/tN-s3OsEfWg/Cloud_Computing_Podcast_Ep_144.mp3&quot;&gt;Cloud Computing Podcast Episode 144&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.cohaa.org/content/sites/default/files/AWS%20-%20How%20to%20think%20cloud%20-%20Steve%20Riley.pdf&quot;&gt;How to “Think Cloud”: Architectural Design Patterns for Cloud Computing&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/11/03/maybe-ubuntu-enterprise-cloud-makes-cloud-computing-too-easy.aspx&quot;&gt;Maybe Ubuntu Enterprise Cloud Makes Cloud Computing Too Easy&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2011/04/04/on-cloud-integration-and-performance.aspx&quot;&gt;On Cloud, Integration and Performance&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/Tags/cloud%20computing/default.aspx&quot;&gt;Lori MacVittie - cloud computing&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/01/21/cloud-computing-location-is-important-but-not-the-way-you.aspx&quot;&gt;Cloud Computing: Location is important, but not the way you think&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2011/03/09/cloud-is-the-how-not-the-what.aspx&quot;&gt;Cloud is the How not the What&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/02/18/dynamic-infrastructure-the-cloud-within-the-cloud.aspx&quot;&gt;Dynamic Infrastructure: The Cloud within the Cloud&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2008/11/05/cloud-computing-the-last-definition-youll-ever-need.aspx&quot;&gt;Cloud Computing: The Last Definition You&#039;ll Ever Need&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/06/10/infrastructure-matters-challenges-of-cloud-based-testing.aspx&quot;&gt;Infrastructure Matters: Challenges of Cloud-based Testing&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/01/23/load-balancing-is-key-to-successful-cloud-based-dynamic-architectures.aspx&quot;&gt;Load balancing is key to successful cloud-based (dynamic ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/05/26/f5-and-the-cloud.aspx&quot;&gt;F5 and the Cloud&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/05/11/get-your-saas-off-my-cloud.aspx&quot;&gt;Get your SaaS off my cloud&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c88834a4-8494-4632-b2a7-30e40962d73f&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Amazon+EC2&quot; rel=&quot;tag&quot;&gt;Amazon EC2&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/EC2&quot; rel=&quot;tag&quot;&gt;EC2&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Cloud&quot; rel=&quot;tag&quot;&gt;Cloud&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Cloud+Computing&quot; rel=&quot;tag&quot;&gt;Cloud Computing&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Werner+Vogels&quot; rel=&quot;tag&quot;&gt;Werner Vogels&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094357.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/lJpdOoXHc-w&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1805761&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 25 Apr 2011 04:08:17 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1805761</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1805761#feedback</comments>
</item>
<item>
 <title>Auto-launch Remote Desktop Sessions with APM</title>
 <link>http://jasonrahm.ulitzer.com/node/1801774</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;In my spare time, I do volunteer IT work and for quite some time my users have used the &lt;a href=&quot;http://sourceforge.net/projects/sslexplorer/&quot;&gt;SSL-Explorer&lt;/a&gt; fork AditoVPN to get remote access to their work machines remotely.&amp;#160; Adito does the job, but it requires a server (albeit virtual, but still) that must be maintained, seems to have been forked again (&lt;a href=&quot;http://sourceforge.net/projects/openvpn-als/&quot;&gt;OpenVPN ALS&lt;/a&gt;) and occasionally locks up and requires more hands-on attention than I really have time for.&amp;#160; I bought a copy of LTM VE last year to handle the web/mail services and was excited about moving users off the Adito solution when I learned that APM VE would be available when version 10.2.1 was released.&amp;#160; I never have more than a handful of users accessing at the same time, so the base APM Limited license that is included with LTM VE suited me just fine.&amp;#160; This article will show users how to configure APM to auto-launch a remote desktop session to an Active Directory user’s specified computer.&lt;/p&gt;
&lt;h3&gt;APM Required Components&lt;/h3&gt;
&lt;p&gt;The network access wizard does a tremendous job of getting the configuration kicked off, so I’d recommend that as a starting point.&amp;#160; A couple things however that weren’t exactly obvious or just didn’t work:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If you already have your domain controller defined and in use on another application, you’ll need to define a dummy AD scenario or the wizard will fail.&amp;#160; After the configuration is complete, you can reselect the proper server in your policy and then you can delete the dummy config.&lt;/li&gt;
    &lt;li&gt;The ssl certificates/profiles are absent from the wizard, so you’ll need to configure these separately.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the wizard is complete, you end up with these configuration objects:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Access Profile w/ Policy&lt;/li&gt;
    &lt;li&gt;AAA Server&lt;/li&gt;
    &lt;li&gt;Network Access Resource&lt;/li&gt;
    &lt;li&gt;Lease Pool&lt;/li&gt;
    &lt;li&gt;Webtop&lt;/li&gt;
    &lt;li&gt;Virtual Server (or two if configuring the redirect from http)&lt;/li&gt;
    &lt;li&gt;Connectivity Profile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As stated previously, you’ll need to separately configure your ssl certificate and profile and update your virtual server accordingly.&lt;/p&gt;
&lt;h3&gt;Preparing Active Directory&lt;/h3&gt;
&lt;p&gt;The goal here is to minimize the amount of work required of remote users.&amp;#160; Once a user is logged in, the remote desktop client should launch for the user and be populated with the server (or desktop) name/ip.&amp;#160; If you choose, you can also have the users store credentials in an rdp file on their desktop so it would only require a single logon, but since that’s not a secure practice I won’t cover that here.&amp;#160; To auto-launch rdp, you need to call the mstsc.exe executable with the /v option:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-mstsc_options_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;523&quot; border=&quot;0&quot; width=&quot;404&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;mstsc_options&quot; title=&quot;mstsc_options&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-mstsc_options_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Any attribute on the account will do, but for this example I’m using the description attribute on the test.user AD account:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-ad_descr_4.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;540&quot; border=&quot;0&quot; width=&quot;404&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;ad_descr&quot; title=&quot;ad_descr&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-ad_descr_thumb_1.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Access Policy Configuration&lt;/h3&gt;
&lt;p&gt;The network access wizard created an access policy that looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_startingpoint_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;184&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_startingpoint&quot; title=&quot;vpe_startingpoint&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_startingpoint_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you created your real AD server, you won’t need to update the AD Auth object.&amp;#160; However, if you created a dummy AD in the network wizard, you’ll need to open AD Auth, select your real server, then click save.&amp;#160; Because I know where my users are, I’m going to start the policy with an IP Geolocation Match object and restrict to the United States.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_geoloc_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;234&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_geoloc&quot; title=&quot;vpe_geoloc&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_geoloc_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can see the actual object on the left and the configuration of the “successful” branch in the expression above.&amp;#160; If the location data matches the US, the logon page is presented.&amp;#160; I used a standard Logon Page object here.&amp;#160; After the logon page is the AD_Auth object, and then I added an AD Query object immediately after on the Successful branch of the AD Auth object.&amp;#160; First, I removed the first branch rule (highlighted) from the object as it is unnecessary:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_adquery_remove_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;179&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_adquery_remove&quot; title=&quot;vpe_adquery_remove&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_adquery_remove_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then, I entered the search filter for the username:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_adquery_filter_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;302&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_adquery_filter&quot; title=&quot;vpe_adquery_filter&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_adquery_filter_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Text in the above image is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(samAccountName=%{session.logon.last.username})&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On the fallback path of the AD Query object, insert a Variable Assign object (should sit in between AD Query and the already present Resource Assign objects):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_variableassign_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;264&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_variableassign&quot; title=&quot;vpe_variableassign&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_variableassign_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add an entry as shown above.&amp;#160; Change to a configuration variable and set the type/name/property as shown below:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_variableassign_specifics_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;264&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_variableassign_specifics&quot; title=&quot;vpe_variableassign_specifics&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_variableassign_specifics_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The expression text is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;expr {&quot;&amp;lt;application_launch&amp;gt;&amp;lt;item&amp;gt;&amp;lt;path&amp;gt;mstsc.exe&amp;lt;/path&amp;gt;&amp;lt;parameter&amp;gt;[mcget {session.ad.last.attr.description} ]&amp;lt;/parameter&amp;gt;&amp;lt;os_type&amp;gt;WINDOWS&amp;lt;/os_type&amp;gt;&amp;lt;/item&amp;gt;&amp;lt;/application_launch&amp;gt;&quot;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you used the network access wizard, the Resource Assign object is already complete, but if starting from scratch, you’ll want to assign a network access resource and a webtop from your configuration:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_resourceassign_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;249&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_resourceassign&quot; title=&quot;vpe_resourceassign&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_resourceassign_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Final step is to change the Deny flag after the Resource Assign object to Allow.&amp;#160; This should result in an overview of the Access Policy as such:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_overview_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;119&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;vpe_overview&quot; title=&quot;vpe_overview&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-vpe_overview_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On the Access Profiles list, make sure you apply the access policy if you haven’t:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-access_profiles_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;eb32f441&#039;})&quot;&gt;&lt;img height=&quot;126&quot; border=&quot;0&quot; width=&quot;604&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;access_profiles&quot; title=&quot;access_profiles&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Apr/Windows-Live-Writer-Auto-launch_BD4F-access_profiles_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That should do it!&lt;/p&gt;
&lt;h3&gt;Testing RDP Auto-Launch&lt;/h3&gt;
&lt;p&gt;Enough of configuration…does it work?&amp;#160; Let’s give it a try:&lt;/p&gt;
&lt;div class=&quot;techTipPlayer&quot;&gt;&lt;a id=&quot;421f275d-0bbc-4fa6-bbf2-d22040560315&quot; href=&quot;http://www.youtube.com/watch?v=KtY2sVjiSr0&quot; alt=&quot;youtube&quot;&gt;APM RDP Auto-Launch&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The APM module for BIG-IP is an amazing access solution.&amp;#160; The default behavior in this scenario is to auto-launch the remote desktop session, but in addition to that functionality the user also has normal network-level access to whatever networks you defined while working through the wizard.&amp;#160; Much thanks to F5er Doug Lohf for configuration details and insight.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/category/1084486.aspx&quot;&gt;Pete Silva - apm&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/APM.HomePage&quot;&gt;DevCentral Wiki: BIG-IP Access Policy Manager (APM) Wiki Home&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1171904/asg/62/Default.aspx&quot;&gt;Does LTM any advanced health monitor for RDP service? - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2010/10/25/f5-tutorial-big-ip-apm-with-secureauth.aspx&quot;&gt;F5 Tutorial: BIG-IP APM with SecureAuth&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086453/Web-Application-Login-Integration-with-APM.aspx&quot;&gt;Web Application Login Integration with APM &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/47/aft/1177236/Default.aspx&quot;&gt;Set APM Cookies to HttpOnly - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1177150/asg/39/Default.aspx&quot;&gt;nested virtuals with APM - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/23/aft/86343/Default.aspx&quot;&gt;RDP acceleration - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules.APM&quot;&gt;DevCentral Wiki: APM&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1177220/asg/62/Default.aspx&quot;&gt;NTLM/ Outlook Anywhere/ Big-IP APM - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/bdqqcg0tpCY&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1801774&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 19 Apr 2011 23:53:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1801774</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1801774#feedback</comments>
</item>
<item>
 <title>iRules IP Comparison Considerations with IP::addr Command</title>
 <link>http://jasonrahm.ulitzer.com/node/1777866</link>
 <description>&lt;p&gt;Anyone utilizing IP network comparisons in iRules is probably familiar with this syntax:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::client_addr&lt;/span&gt;[/24 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;   &lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;##Do this&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;In fact, there are several methods for doing a comparison.&amp;#160; Here are three functional equivalents that include the most common form shown above:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;[/24 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;[/255.255.255.0 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;]IP::remote_addr[ mask 255.255.255.0&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0]&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;All three work, returning true if there is match and false if not.&amp;#160; These formats, however, are not as ideal as it was never intended to work this way.&amp;#160; What occurs when performing the comparison this way is the system has to convert the internal IP address to string form, apply the network mask, then re-convert the result back into an IP network object for comparison to the last argument.&amp;#160; While possible, it isn’t as efficient and technically is an oversight in the syntax validation checking.&amp;#160; It’s not slated to be “fixed” at this point, but it could be in the future, so you should consider updating any iRules to one of these formats:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;[ &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0/24]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;[ &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0/255.255.255.0]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;[ &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;10.10.20.0 mask 255.255.255.0&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;In these formats, the input address does not need to be masked and can be directly compared with the pre-parsed network specification.&amp;#160; Finally, there is one more format that works:&lt;/div&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;pre id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
[&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::remote_addr&lt;/span&gt;] mask 255.255.255.0[ &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;equals&lt;/span&gt; 10.10.20.0]&lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;This also doesn’t require any additional conversion, but the sheer volume of commands in that statement is an immediate indicator (to me, anyway) that it’s probably not very efficient.&lt;/div&gt;
&lt;div&gt;&amp;#160;&lt;/div&gt;
&lt;h3&gt;Performance&lt;/h3&gt;
&lt;div&gt;Before running each format through a simple test (ab –n 10000 –c 25 &lt;a href=&quot;http://&amp;lt;vip&amp;gt;&quot; title=&quot;http://&amp;lt;vip&amp;gt;&quot;&gt;http://&amp;lt;vip&amp;gt;&lt;/a&gt;), I set up a control so I could isolate the cycles for each format:&lt;/div&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;HTTP_REQUEST&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;timing&lt;/span&gt; on {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;### CONTROL ###&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { 1 } { }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since all the formats will return true if the match is found, then subtracting out the average cycles from this iRule should give me a pretty accurate accounting of cycles required for each specific format.&amp;#160; So I can replace the “1” from the conditional with each format, as shown in this iRule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;HTTP_REQUEST&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;timing&lt;/span&gt; on {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;### FUNCTIONAL EQUIVALENTS &quot;RECOMMENDED&quot; ###&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #1 Cycles: 6839 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;5703&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::remote_addr[ equals 10.10.20.0/24] } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #2 Cycles: 6903 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;5767&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::remote_addr[ equals 10.10.20.0/255.255.255.0] } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #3 Cycles: 7290 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;6154&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::remote_addr[ equals &quot;10.10.20.0 mask 255.255.255.0&quot;] } { }    &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;### FUNCTIONAL EQUIVALENTS &quot;NOT RECOMMENDED&quot; ###&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #4 Cycles: 8500 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;7364&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::remote_addr[/24 equals 10.10.20.0] } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #5 Cycles: 8543 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;7407&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::remote_addr[/255.255.255.0 equals 10.10.20.0] } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #6 Cycles: 8827 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;7691&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr &quot;]IP::remote_addr[ mask 255.255.255.0&quot; equals 10.10.20.0] } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;### ALTERNATE FORMAT ###&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    Format #7 Cycles: 9124 - 1136 = &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;7988&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#    if { [IP::addr ]IP::addr [IP::remote_addr] mask 255.255.255.0[ equals 10.10.20.0]    } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;### CONTROL ###&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;# Cycles: &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;1136&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;#  if { 1 } { }&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can see from the average cycles data I added to each of the formats comments above that the recommended formats are all faster than the formats that are not recommended.&amp;#160; What’s interesting is the subtle differences in the “/” formats within each group of functional equivalents and then the significant outliers that the “&amp;lt;net&amp;gt; mask &amp;lt;mask&amp;gt;” formats are within their group.&amp;#160; Also of note is that the last format, while acceptable, is really inefficient and should probably be avoided.&amp;#160; The table below breaks down the increase in cycles for each of the formats compared to the best performer:&amp;#160;[IP::addr ]IP::remote_addr[ equals 10.10.20.0/24].&lt;/p&gt;
&lt;blockquote&gt;&lt;img src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Mar/ipaddr_comparisons.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whereas the number of cycles required to execute this operation are all quite small, the difference beyond the first two similar formats is quite significant.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Many ways to skin a cat, some good, some not so good.&amp;#160; Just to be clear, using the mask on the initial argument of the comparison should be avoided, and if you currently have iRules utilizing this format, it would be best to update them sooner rather than later.&amp;#160; I’ll be doing the same on all the DevCentral wikis, forums, articles, and blogs.&amp;#160; If you find some references where we haven’t made this distinction, please comment below.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/jason/archive/2011/03/23/ipaddr-and-ipv6.aspx&quot;&gt;IP::addr and IPv6&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/default.aspx/iRules/IP__addr.html&quot;&gt;DevCentral Wiki: IP::addr&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/1172683/afv/topic/Default.aspx&quot;&gt;Why do we need to use [IP::addr ]IP::client_addr[]? - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/25219/afv/topic/Default.aspx&quot;&gt;IP Address based iRule - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/TOPFgslfZpA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1777866&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 31 Mar 2011 21:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1777866</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1777866#feedback</comments>
</item>
<item>
 <title>iRules Data Group Formatting Rules</title>
 <link>http://jasonrahm.ulitzer.com/node/1772871</link>
 <description>&lt;p&gt;BIG-IP LTM supports internal and external classes (called Data Groups in the GUI) of address, string, and integer types.&amp;#160; An internal class is stored in the bigip.conf file, whereas external classes are split between the bigip.conf and the file system (the class itself is defined in the bigip.conf file, but the values of the class are stored in the file system in a location of your choice, though /var/class is the location defined for synchronization in the cs.dat file)&amp;#160; Which flavor?&amp;#160; Depends on the requirements.&amp;#160; External classes are generally best suited for very large datasets or for datasets that require frequent updates like blacklists.&amp;#160; Formatting is slightly different depending on whether the class is internal or external, and is also different based on the class type: address, integer, or string.&amp;#160; Below I’ll show the formatting requirements for each scenario.&amp;#160; If you are using the GUI to create key/value pairs in a class (and therefore deciding on an internal class), the formatting is handled for you.&amp;#160; Note that with internal classes, the dataset is defined with the class, but with external classes, the class is defined with type, separator, and the filename where the dataset is stored.&amp;#160; If there is no value for the type (internal or external) it is omitted with no separator.&lt;/p&gt;
&lt;h3&gt;Address Classes&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;[internal class]       &lt;br /&gt;
&lt;/strong&gt;class addr_testclass {      &lt;br /&gt;
&amp;#160;&amp;#160; {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; host 192.168.1.1      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; host 192.168.1.2 { &quot;host 2&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; network 192.168.2.0/24      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; network 192.168.3.0/24 { &quot;network 2&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160; }      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[external class]       &lt;br /&gt;
&lt;/strong&gt;class addr_testclass_ext {      &lt;br /&gt;
&amp;#160;&amp;#160; type ip      &lt;br /&gt;
&amp;#160;&amp;#160; filename &quot;/var/class/addr_testclass.class&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; separator &quot;:=&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[/var/class/addr_testclass.class]       &lt;br /&gt;
&lt;/strong&gt;host 192.168.1.1,      &lt;br /&gt;
host 192.168.1.2 := &quot;host 2&quot;,      &lt;br /&gt;
network 192.168.2.0/24,      &lt;br /&gt;
network 192.168.3.0/24 := &quot;network 2&quot;,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note: You can also add network entries in the address type external file like shown immediately below, but when the class is updated, it will be converted to the CIDR format.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;network 192.168.4.0 mask 255.255.255.0 := “network 3”,     &lt;br /&gt;
network 192.168.5.0 prefixlen 24 := &quot;network 4&quot;,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Integer Classes&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;[internal class]       &lt;br /&gt;
&lt;/strong&gt;class int_testclass {      &lt;br /&gt;
&amp;#160;&amp;#160; {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 { &quot;test 1&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 { &quot;test 2&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160; }      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[external class]       &lt;br /&gt;
&lt;/strong&gt;class int_testclass_ext {      &lt;br /&gt;
&amp;#160;&amp;#160; type value      &lt;br /&gt;
&amp;#160;&amp;#160; filename &quot;/var/class/int_testclass.class&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; separator &quot;:=&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[/var/class/int_testclass.class]       &lt;br /&gt;
&lt;/strong&gt;1 := &quot;test 1&quot;,      &lt;br /&gt;
2 := &quot;test 2&quot;,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;String Classes&lt;/h3&gt;
&lt;p&gt;With string classes, quotes are necessary on the types and values:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;[internal class]       &lt;br /&gt;
&lt;/strong&gt;class str_testclass {      &lt;br /&gt;
&amp;#160;&amp;#160; {      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &quot;str1&quot; { &quot;value 1&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &quot;str2&quot; { &quot;value 2&quot; }      &lt;br /&gt;
&amp;#160;&amp;#160; }      &lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[external class]       &lt;br /&gt;
&lt;/strong&gt;class str_testclass_ext {      &lt;br /&gt;
&amp;#160;&amp;#160; type string      &lt;br /&gt;
&amp;#160;&amp;#160; filename &quot;/var/class/str_testclass.class&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; separator &quot;:=&quot;      &lt;br /&gt;
&amp;#160;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[/var/class/str_class.class]       &lt;br /&gt;
&lt;/strong&gt;&quot;str1&quot; := &quot;value 1&quot;,      &lt;br /&gt;
&quot;str2&quot; := &quot;value 2&quot;,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Working With External Files&lt;/h3&gt;
&lt;p&gt;Now that the formatting of the classes themselves are complete, I’d like to point out one more issue, and that’s file formatting. If you’re editing all the external classes by hand on the BIG-IP, you have nothing to worry about.&amp;#160; However, if you edit them on an external system and copy them over, be careful on which editor you choose.&amp;#160; The Unix/Linux line terminator is a line feed (0x0A) whereas Windows default is a carriage return/line feed (0x0D0A) and Mac typically employs just a carriage return (0x0D).&amp;#160; The file needs to be formatted in unix-style.&amp;#160; I use gVim on my windows laptop.&amp;#160; By default, it uses the dos-style, as evidenced in my hex readout in gVim below:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;0000000: 6865 6c6c 6f2c 2077 6f72 6c64 &lt;strong&gt;0d0a&lt;/strong&gt; 7468&amp;#160; hello, world..th      &lt;br /&gt;
0000010: 6973 2069 7320 6120 6c69 6e65 2074 6572&amp;#160; is is a line ter      &lt;br /&gt;
0000020: 6d69 6e61 746f 7220 7465 7374 &lt;strong&gt;0d0a 0d0a&lt;/strong&gt;&amp;#160; minator test....      &lt;br /&gt;
0000030: &lt;strong&gt;0d0a&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, this is easily changed in gVim: “set fileformat=unix”.&amp;#160; After this setting, now my linefeeds are correct:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;0000000: 6865 6c6c 6f2c 2077 6f72 6c64 &lt;strong&gt;0a&lt;/strong&gt;74 6869&amp;#160; hello, world.thi      &lt;br /&gt;
0000010: 7320 6973 2061 206c 696e 6520 7465 726d&amp;#160; s is a line term      &lt;br /&gt;
0000020: 696e 6174 6f72 2074 6573 74&lt;strong&gt;0a&lt;/strong&gt; &lt;strong&gt;0a0a&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; inator test...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The guidance here is…use a good editor (hint..Notepad and Word are not on that list!)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2309/v10--New-class-features-in-iRules.aspx&quot;&gt;v.10 - New class features in iRules &amp;gt; DevCentral &amp;gt; F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/227/Validating-Data-Group-Class-References.aspx&quot;&gt;Validating Data Group (Class) References &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/1172712/Default.aspx&quot;&gt;Datagroup access during a datagroup update - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1167195/asg/56/Default.aspx&quot;&gt;Address Datagroup &quot;value&quot; field - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1178456/asg/50/Default.aspx&quot;&gt;External class and class command - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/1170933/afv/topic/Default.aspx&quot;&gt;Format of external (STring) class file - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aft/1177114/asg/51/Default.aspx&quot;&gt;Question around Datagroup manipulation - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/1177276/afv/topic/Default.aspx&quot;&gt;Create an External class file - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/OP0QODJkjAk&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1772871&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 29 Mar 2011 10:50:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1772871</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1772871#feedback</comments>
</item>
<item>
 <title>BIG-IP Configuration Conversion Scripts</title>
 <link>http://jasonrahm.ulitzer.com/node/1770741</link>
 <description>&lt;p&gt;Two of our biggest internal contributors, Kirk Bauer and John Alam, are at it again with a handful of perl scripts aimed at easing your migration from some of the “other guys” to BIG-IP.  While they aren’t going to map every nook and cranny of the configurations to a BIG-IP feature, they will get you well along the way, taking out as much of the human error element as possible.  I built a few pages in the &lt;a href=&quot;http://devcentral.f5.com/wiki/Default.aspx/AdvDesignConfig.HomePage&quot;&gt;Advanced Design &amp;amp; Configuration wiki&lt;/a&gt; to host these scripts.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/Cisco.html&quot;&gt;Migrating from Cisco ACE, CSM, or CSS&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/CitrixNetscaler.html&quot;&gt;Migrating from Citrix Netscaler&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/Radware.html&quot;&gt;Migrating from Radware&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obviously with these being perl scripts you’ll need a &lt;a href=&quot;http://www.perl.org/&quot;&gt;copy of perl&lt;/a&gt;, or just load the script on your BIG-IP and do the migration there!&lt;/p&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iControl/Perl.html&quot;&gt;DevCentral Wiki: Perl&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/dan/archive/2009/02/20/if-radware-succeeds-in-purchasing-alteon-will-anyone-care.aspx&quot;&gt;If Radware Succeeds in Purchasing Alteon, Will Anyone Care?&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/Joe/archive/2005/06/06/553.aspx&quot;&gt;64-bit numbers in perl&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iControl/PerlLtmConfigToXml.html&quot;&gt;DevCentral Wiki: Perl Ltm Config To Xml&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1174523/asg/51/Default.aspx&quot;&gt;GTM Network Map - Perl - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/CSSToBIGIPConversionScript.html&quot;&gt;DevCentral Wiki: CSS To BIGIP Conversion Script&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1176825/asg/63/Default.aspx&quot;&gt;Perl script to parse Siebel lbconfig.txt file update for BIG-IP ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/47/aft/1170644/afv/topic/asg/39/Default.aspx&quot;&gt;Convert Cisco CSS config to Big IP 3600 - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/1/aft/1145053/Default.aspx&quot;&gt;Perl script to dump API response-&amp;gt;result - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/31/aft/86007/Default.aspx&quot;&gt;Cisco CSS cookie persistency - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/1/aft/1144711/afv/topic/Default.aspx&quot;&gt;another potential 64 bit conversion issue in perl - DevCentral ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/AdvDesignConfig/Radware.html&quot;&gt;DevCentral Wiki: Radware&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/32/aft/57465/Default.aspx&quot;&gt;CSS Config to F5 Config - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f4a5bd9a-0140-4b22-980d-7f1b4157134a&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP+LTM&quot; rel=&quot;tag&quot;&gt;BIG-IP LTM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Perl&quot; rel=&quot;tag&quot;&gt;Perl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Migration&quot; rel=&quot;tag&quot;&gt;Migration&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/John+Alam&quot; rel=&quot;tag&quot;&gt;John Alam&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Kirk+Bauer&quot; rel=&quot;tag&quot;&gt;Kirk Bauer&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094303.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/SlP_AaXIw7o&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1770741&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 28 Mar 2011 05:06:35 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1770741</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1770741#feedback</comments>
</item>
<item>
 <title>Accessing TCP Options from iRules</title>
 <link>http://jasonrahm.ulitzer.com/node/1768760</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;I’ve written several articles on the TCP profile (&lt;a href=&quot;/wiki/default.aspx/AdvDesignConfig/LTMProfileArticles.html&quot;&gt;click here&lt;/a&gt;) and enjoy digging into TCP.&amp;#160; It’s a beast, and I am constantly re-learning the inner workings.&amp;#160; Still etched in my visual memory map, however, is the TCP header format, shown in Figure 1 below.&lt;/p&gt;
&lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:77e8b315-622c-4b2e-a7cd-6087910c4a37&quot; style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot;&gt;&lt;a onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;afa81f0c&#039;})&quot; class=&quot;itcexpando&quot; rel=&quot;thumbnail&quot; title=&quot;Figure 1. TCP Header&quot; href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Mar/Windows-Live-Writer-1b9e3461bd38_B9BB-tcphdr-8x6.png&quot;&gt;&lt;img height=&quot;360&quot; border=&quot;0&quot; width=&quot;710&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Mar/Windows-Live-Writer-1b9e3461bd38_B9BB-tcphdr_6.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Since 9.0 was released, TCP payload data (that which comes after the header) has been consumable in iRules via the TCP::payload and the port information has been available in the contextual commands TCP::local_port/TCP::remote_port and of course TCP::client_port/TCP::server_port.&amp;#160; Options, however, have been inaccessible.&amp;#160; However, beginning with version 10.2.0-HF2, it is now possible to retrieve data from the options fields.&lt;/p&gt;
&lt;h3&gt;Preparing the BIG-IP&lt;/h3&gt;
&lt;p&gt;Currently, it is necessary to set a bigpipe database key with the option (or options) of interest:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;bigpipe db Rules.Tcpoption.settings [option, first|last], [option, first|last]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The option is an integer between 2 and 255, and the first/last setting indicates whether the system will retain the first or last instance of the specified option.&amp;#160; Once that key is set, you’ll need to do a bigstart restart for it to take (&lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;warning&lt;/strong&gt;:&lt;/font&gt; &lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;service impacting&lt;/font&gt;&lt;/strong&gt;).&amp;#160; This is only necessary prior to 10.2.1.&amp;#160; Note also that the LTM only collects option data starting with the ACK of a connection.&amp;#160; The initial SYN is ignored even if you select the first keyword.&amp;#160; This is done to prevent a SYN flood attack (in keeping with SYN-cookies).&lt;/p&gt;
&lt;h3&gt;A New iRules Command: TCP::option&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;/wiki/default.aspx/iRules/TCP__option.html&quot;&gt;TCP::option&lt;/a&gt; command has the following syntax:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TCP::option get &amp;lt;option&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty simple, no? So now that you can access them, what fun can be had?&amp;#160;&lt;/p&gt;
&lt;h3&gt;Real World Scenario: Akamai&lt;/h3&gt;
&lt;p&gt;In Akamai’s IPA and SXL product lines, they support client IP visibility by embedding a version number (one byte) and an IPv4 address (four bytes) as part of their overlay path feature in tcp option number 28.&amp;#160; To access this data, we first set the database key:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;b db Rules.Tcpoption.settings [28,first]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, the iRule utilizing the TCP::option command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;CLIENT_ACCEPTED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; opt28 [TCP::option get 28]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt; length $opt28] == 5 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;binary&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;scan&lt;/span&gt; $opt cH8 ver addr&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { $ver != 1 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Unsupported Akamai version: $ver&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;         } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;               &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;scan&lt;/span&gt; $addr &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;%2x%2x%2x%2x&quot;&lt;/span&gt; ip1 ip2 ip3 ip4&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; optaddr &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;$ip1.$ip2.$ip3.$ip4&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  13:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;HTTP_REQUEST&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  14:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;info&lt;/span&gt; exists optaddr] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum15&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  15:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;HTTP::header&lt;/span&gt; insert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;X-Forwarded-For&quot;&lt;/span&gt; $optaddr&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum16&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum17&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  17:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Akamai version should be one, so we log if not.&amp;#160; Otherwise, we take the address (stored in the variable addr in hex) and scan it to get the decimal equivalents to build the address for inserting in the X-Forwarded-For header.&amp;#160; Cool, right?&amp;#160; Also cool—along with the new TCP::option command, an extension was made to the &lt;a href=&quot;/wiki/default.aspx/iRules/IP__addr.html&quot;&gt;IP::addr&lt;/a&gt; command to parse binary fields into a dotted decimal IP address.&amp;#160; This extension is also available beginning in 10.2.0-HF2.&amp;#160; Here’s the syntax:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IP::addr parse [-swap] &amp;lt;binary field&amp;gt; [&amp;lt;offset&amp;gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So in the context of our TCP option, we have 5-bytes of data with the first byte not mattering in the context of an address, so we get at the address with this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;set optaddr [IP::addr parse ]TCP::option get 28[ 1]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This cleans up the rule a bit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;CLIENT_ACCEPTED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; opt28 [TCP::option get 28]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt; length $opt28] == 5 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;binary&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;scan&lt;/span&gt; $opt c ver&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { $ver != 1 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Unsupported Akamai version: $ver&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;         } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; optaddr [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; parse $opt28 1]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;HTTP_REQUEST&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  13:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;info&lt;/span&gt; exists optaddr] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  14:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;HTTP::header&lt;/span&gt; insert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;X-Forwarded-For&quot;&lt;/span&gt; $optaddr&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum15&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum16&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  16:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;No need to store the address in the first binary scan and no need for the scan command at all so I eliminated those.&amp;#160; Setting a forwarding header is not the only thing we can do with this data.&amp;#160; It could also be shipped off to a logging server, or used as a snat address (assuming the server had either a default route to the BIG-IP, or specific routes for the customer destinations, which is doubtful).&amp;#160; Logging is trivial, shown below with the &lt;a href=&quot;/wiki/default.aspx/iRules/log.html&quot;&gt;log command&lt;/a&gt;.&amp;#160; The &lt;a href=&quot;/wiki/default.aspx/iRules.HSL&quot;&gt;HSL commands&lt;/a&gt; could be used in lieu of log if sending off-box to a log server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;CLIENT_ACCEPTED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; opt28 [TCP::option get 28]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt; length $opt28] == 5 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;binary&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;scan&lt;/span&gt; $opt c ver&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { $ver != 1 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Unsupported Akamai version: $ver&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;         } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; optaddr [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; parse $opt28 1]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Client IP extracted from Akamai TCP option is $optaddr&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;If setting the provided IP as a snat address, you’ll want to make sure it’s a valid IP address before doing so.&amp;#160; You can use the TCL catch command and IP::addr to perform this check as seen in the iRule below:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;CLIENT_ACCEPTED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; addrs [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;list&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;192.168.1.1&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;256.168.1.1&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;192.256.1.1&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;192.168.256.1&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;192.168.1.256&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;         ]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;foreach&lt;/span&gt; x $addrs {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;catch&lt;/span&gt; {&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; $x mask 255.255.255.255}] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;IP $x is invalid&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt;         } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; { &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;IP $x is valid&quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  14:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The output of this iRule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;CLIENT_ACCEPTED&amp;gt;: IP 192.168.1.1 is valid     &lt;br /&gt;
&amp;lt;CLIENT_ACCEPTED&amp;gt;: IP &lt;strong&gt;256&lt;/strong&gt;.168.1.1 is invalid      &lt;br /&gt;
&amp;lt;CLIENT_ACCEPTED&amp;gt;: IP 192.&lt;strong&gt;256&lt;/strong&gt;.1.1 is invalid      &lt;br /&gt;
&amp;lt;CLIENT_ACCEPTED&amp;gt;: IP 192.168.&lt;strong&gt;256&lt;/strong&gt;.1 is invalid      &lt;br /&gt;
&amp;lt;CLIENT_ACCEPTED&amp;gt;: IP 192.168.1.&lt;strong&gt;256&lt;/strong&gt; is invalid&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adding this logic into a functional rule with snat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id=&quot;codeSnippetWrapper&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;CLIENT_ACCEPTED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; opt28 [TCP::option get 28]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt; length $opt28] == 5 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;binary&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;scan&lt;/span&gt; $opt c ver&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { $ver != 1 } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   6:&lt;/span&gt;             &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Unsupported Akamai version: $ver&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   7:&lt;/span&gt;         } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   8:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; optaddr [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; parse $opt28 1]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;   9:&lt;/span&gt;                 &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;catch&lt;/span&gt; {&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;IP::addr&lt;/span&gt; $x mask 255.255.255.255}] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  10:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;$optaddr is not a valid address&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  11:&lt;/span&gt;                     &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;snat&lt;/span&gt; automap&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  12:&lt;/span&gt;                 } &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  13:&lt;/span&gt;                         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0. &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Akamai inserted Client IP is $optaddr.  Setting as snat address.&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  14:&lt;/span&gt;                         &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;snat&lt;/span&gt; $optaddr &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum15&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  15:&lt;/span&gt;                 }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum16&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  16:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum17&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum18&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt;  18:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Alternative TCP Option Use Cases&lt;/h3&gt;
&lt;p&gt;The Akamai solution shows an application implementation taking advantage of normally unused space in TCP headers.&amp;#160;&amp;#160;&amp;#160; There are, however, defined uses for several option “kind” numbers.&amp;#160; The list is available here: &lt;a href=&quot;http://www.iana.org/assignments/tcp-parameters/tcp-parameters.xml&quot; title=&quot;http://www.iana.org/assignments/tcp-parameters/tcp-parameters.xml&quot;&gt;http://www.iana.org/assignments/tcp-parameters/tcp-parameters.xml&lt;/a&gt;.&amp;#160; Some options that might be useful in troubleshooting efforts:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Opkind 2 – Max Segment Size&lt;/li&gt;
    &lt;li&gt;Opkind 3 – Window Scaling&lt;/li&gt;
    &lt;li&gt;Opkind 5 – Selective Acknowledgements&lt;/li&gt;
    &lt;li&gt;Opkind 8 – Timestamps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, with tcpdump you get all this plus the context of other header information and data, but hey, another tool in the toolbox, right?&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/macvittie/archive/2008/10/14/3-really-good-reasons-you-should-use-tcp-multiplexing.aspx&quot;&gt;3 Really good reasons you should use TCP multiplexing&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/macvittie/archive/2008/10/03/new-tcp-vulnerability-about-trust-not-technology.aspx&quot;&gt;New TCP vulnerability about trust, not technology&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/wiki/default.aspx/iRules/log.html&quot;&gt;DevCentral Wiki: log&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/285/Investigating-the-LTM-TCP-Profile-Max-Syn-Retransmissions-amp-Idle-Timeout.aspx&quot;&gt;Investigating the LTM TCP Profile: Max Syn Retransmissions &amp;amp; Idle ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/300/Investigating-the-LTM-TCP-Profile-Acknowledgements.aspx&quot;&gt;Investigating the LTM TCP Profile: Acknowledgements &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/Joe/archive/2009/08/19/x_forwarded_for_log_filter_for_windows_servers.aspx&quot;&gt;X-Forwarded-For Log Filter for Windows Servers&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/287/Investigating-the-LTM-TCP-Profile-Windows-amp-Buffers.aspx&quot;&gt;Investigating the LTM TCP Profile: Windows &amp;amp; Buffers &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/282/Investigating-the-LTM-TCP-Profile-Nagles-Algorithm.aspx&quot;&gt;Investigating the LTM TCP Profile: Nagle&#039;s Algorithm &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/309/Investigating-the-LTM-TCP-Profile-The-Finish-Line.aspx&quot;&gt;Investigating the LTM TCP Profile: The Finish Line &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/190/iRules-Update-New-options-for-the-log-command.aspx&quot;&gt;iRules Update: New options for the &quot;log&quot; command &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/jason/archive/2011/03/23/ipaddr-and-ipv6.aspx&quot;&gt;IP::addr and IPv6&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/304/Investigating-the-LTM-TCP-Profile-ECN-amp-LTR.aspx&quot;&gt;Investigating the LTM TCP Profile: ECN &amp;amp; LTR &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1084377/Writing-to-and-rotating-custom-log-files.aspx&quot;&gt;Writing to and rotating custom log files &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/aQbqQZ8edag&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1768760&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 25 Mar 2011 10:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1768760</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1768760#feedback</comments>
</item>
<item>
 <title>GTM Classless Classes</title>
 <link>http://jasonrahm.ulitzer.com/node/1766155</link>
 <description>&lt;p&gt;I love ingenuity.  &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; community member wassim asked a question a little more than a month ago that has been asked several times before: How do you build a class in GTM so you don’t have to use a hoard of if statements to account for your addresses?  Well, classes (datagroups) aren’t yet supported in GTM iRules, so the options have been sparse.  One option that could be utilized is to build a list that you can initialize in RULE_INIT:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;RULE_INIT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; addr_group1 [&lt;span style=&quot;color: #0000ff&quot;&gt;list&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt;         &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.10.10.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;         &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.10.20.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.10.30.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt;     ]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum7&quot;&gt;   7:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; addr_group2 [&lt;span style=&quot;color: #0000ff&quot;&gt;list&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum8&quot;&gt;   8:&lt;/span&gt;    &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.20.10.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum9&quot;&gt;   9:&lt;/span&gt;         &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.20.20.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum10&quot;&gt;  10:&lt;/span&gt;         &lt;span style=&quot;color: #006080&quot;&gt;&quot;10.20.30.0&quot;&lt;/span&gt; \&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum11&quot;&gt;  11:&lt;/span&gt;     ]&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum12&quot;&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;This, while possible, is hardly ideal.  A few days ago, rather than drop the issue, wassim posted back with an alternative solution: Regions.  GTM Regions allows one to assemble groups of topology records, which once assembled, can be referenced from an iRule:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id=&quot;codeSnippetWrapper&quot;&gt;
    &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;
      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: #cc6633&quot;&gt;DNS_REQUEST&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; { [&lt;span style=&quot;color: #0000ff&quot;&gt;matchregion&lt;/span&gt; ldns addr_group1] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;host&lt;/span&gt; 1.2.3.4&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;elseif&lt;/span&gt; { [&lt;span style=&quot;color: #0000ff&quot;&gt;matchregion&lt;/span&gt; ldns addr_group2] } {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;host&lt;/span&gt; 5.6.7.8&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt;     } &lt;span style=&quot;color: #0000ff&quot;&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum7&quot;&gt;   7:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;host&lt;/span&gt; 1.1.1.1&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum8&quot;&gt;   8:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#039;Courier New&#039;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum9&quot;&gt;   9:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Still have if/else statements, but it will be trimmed down to as many regions as you have defined.  Nice work, wassim!&lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/5/aft/1174529/afv/topic/Default.aspx&quot;&gt;GTM irule help with matchregion? - devcentral - F5 devcentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/35/GTM-and-iRules-allowing-intelligent-redirection-for-most-protocols.aspx&quot;&gt;GTM and iRules allowing intelligent redirection for most protocols ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2355/v101--Configuring-GTMs-DNS-Security-Extensions.aspx&quot;&gt;v10.1 - Configuring GTM&#039;s DNS Security Extensions &amp;gt; DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/31/aft/1173024/Default.aspx&quot;&gt;GTM Geo Target based on State US -- Version 10.2 HF1 - DevCentral ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2c1810cd-c7b2-43fc-bdea-f1f8da9ba27c&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP+GTM&quot; rel=&quot;tag&quot;&gt;BIG-IP GTM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/GTM&quot; rel=&quot;tag&quot;&gt;GTM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/wassim&quot; rel=&quot;tag&quot;&gt;wassim&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094294.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/Fikz_Vd06hY&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1766155&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 23 Mar 2011 10:47:18 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1766155</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1766155#feedback</comments>
</item>
<item>
 <title>IP::addr and IPv6</title>
 <link>http://jasonrahm.ulitzer.com/node/1766156</link>
 <description>&lt;p&gt;Did you know that all address internal to tmm are kept in IPv6 format?  If you’ve written external monitors, I’m guessing you knew this.  In the external monitors, for IPv4 networks the IPv6 “header” is removed with the line:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font face=&quot;Times New Roman&quot;&gt;IP=`echo $1 | sed &#039;s/::ffff://&#039;`&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;IPv4 address are stored in what’s called “IPv4-mapped” format. An IPv4-mapped address has its first 80 bits set to zero and the next 16 set to one, followed by the 32 bits of the IPv4 address.  The prefix looks like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;0000:0000:0000:0000:0000:ffff: (abbreviated as ::ffff:, which looks strickingly simliar—ok, identical—to the pattern stripped above)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notation of the IPv4 section of the IPv4-formatted address vary in implementations between ::ffff:192.168.1.1 and ::ffff:c0a8:c8c8, but only the latter notation (in hex) is supported.  If you need the decimal version, you can extract it like so:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;% puts $x
    &lt;br /&gt;::ffff:c0a8:c8c8

    &lt;br /&gt;% if { [string range $x 0 6] == &quot;::ffff:&quot; } {

    &lt;br /&gt;scan [string range $x 7 end] &quot;%2x%2x:%2x%2x&quot; ip1 ip2 ip3 ip4

    &lt;br /&gt;set ipv4addr &quot;$ip1.$ip2.$ip3.$ip4&quot;

    &lt;br /&gt;}

    &lt;br /&gt;192.168.200.200&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Address Comparisons&lt;/h3&gt;

&lt;p&gt;The text format is not what controls whether the &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/IP__addr.html&quot;&gt;IP::addr command&lt;/a&gt; (nor the &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/class.html&quot;&gt;class command&lt;/a&gt;) does an IPv4 or IPv6 comparison. Whether or not the IP address is IPv4-mapped is what controls the comparison. The text format merely controls how the text is then translated into the internal IPv6 format (ie: whether it becomes a IPv4-mapped address or not). Normally, this is not an issue, however, if you are trying to compare an IPv6 address against an IPv4 address, then you really need to understand this mapping business.  Also, it is not recommended to use 0.0.0.0/0.0.0.0 for testing whether something is IPv4 versus IPv6 as that is not really valid a IP address—using the 0.0.0.0 mask (technically the same as /0) is a loophole and ultimately, what you are doing is loading the equivalent form of a IPv4-mapped mask. Rather, you should just use the following to test whether it is an IPv4-mapped address: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;if { [IP::addr $IP1 equals ::ffff:0000:0000/96] } {  log local0. “Yep, that’s an IPv4 address” }&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These notes are covered in the &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/IP__addr.html&quot;&gt;IP::addr wiki entry&lt;/a&gt;.  Any updates to the command and/or supporting notes will exist there, so keep the links handy.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;i&gt;Related Articles&lt;/i&gt; 

&lt;ul class=&quot;ArrowList&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2011/02/04/ipv4-ipv6-migration-coexist-gateway.aspx&quot;&gt;F5 Friday: &#039;IPv4 and IPv6 Can Coexist&#039; or &#039;How to eat your cake ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;https://devcentral.f5.com/weblogs/dctv/archive/2011/02/22/service-provider-series-managing-the-ipv6-migration.aspx&quot;&gt;Service Provider Series: Managing the ipv6 Migration&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/psilva/archive/2009/11/06/ipv6-and-the-end-of-the-world.aspx&quot;&gt;IPv6 and the End of the World&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/2241/aft/1176882/Default.aspx&quot;&gt;No More IPv4. You do have your IPv6 plan running now, right ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/2247/aft/1176890/Default.aspx&quot;&gt;Question about IPv6 - BIGIP - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aft/1177252/asg/50/Default.aspx&quot;&gt;Insert IPv6 address into header - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/24/aft/15344/afv/topic/asg/61/Default.aspx&quot;&gt;Business Case for IPv6 - DevCentral - F5 DevCentral &amp;gt; Community ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/04/27/wersquore-sorry.-the-ipv4-address-you-are-trying-to-reach.aspx&quot;&gt;We&#039;re sorry. The IPv4 address you are trying to reach has been ...&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/dmacvittie/Tags/F5%20BIG-IP%20IPv6%20Gateway%20Module/default.aspx&quot;&gt;Don MacVittie - F5 BIG-IP IPv6 Gateway Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c9efd512-4315-44be-94ab-336cf8ff2e74&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/IPv6&quot; rel=&quot;tag&quot;&gt;IPv6&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/IP%3a%3aaddr&quot; rel=&quot;tag&quot;&gt;IP::addr&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/class&quot; rel=&quot;tag&quot;&gt;class&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1094291.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/nr5AvG9zvZE&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1766156&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 23 Mar 2011 04:26:50 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1766156</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1766156#feedback</comments>
</item>
<item>
 <title>Microsoft Exchange 2010 iRule Workflow Visualized</title>
 <link>http://jasonrahm.ulitzer.com/node/1755065</link>
 <description>&lt;p&gt;F5’s own John Alam sent over his latest Visio creation to share with the &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; community.  This diagram details the workflow of the comprehensive exchange services iRule described in the &lt;a href=&quot;http://www.f5.com/pdf/deployment-guides/f5-exchange-2010-dg.pdf&quot;&gt;Microsoft Exchange 2010 Deployment Guide&lt;/a&gt;. Enjoy.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Exchange-2010-iRule-Workflow-Visualized_971F/Exchange%20single%20url%20irule_2.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;Exchange single url irule&quot; border=&quot;0&quot; alt=&quot;Exchange single url irule&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/Exchange-2010-iRule-Workflow-Visualized_971F/Exchange%20single%20url%20irule_thumb.png&quot; width=&quot;1000&quot; height=&quot;801&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For visio, pdf, png, &amp;amp; svg versions of this image, &lt;a href=&quot;http://devcentral.f5.com/downloads/advdc/exchange_irule_workflows.zip&quot;&gt;click here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt; &lt;/p&gt;  &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2009/11/10/microsoft-exchange-2010-helo-new-architecture.aspx&quot;&gt;Microsoft Exchange 2010: HELO New Architecture&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/dctv/archive/2011/01/19/webcast-microsoft-exchange-server-availability-and-scalability.aspx&quot;&gt;Webcast - Microsoft Exchange Server Availability And Scalability&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/286/Exchange-Persistence-Duality-and-iRules.aspx&quot;&gt;Exchange Persistence Duality and iRules &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/2267/afv/topic/aft/1174320/Default.aspx&quot;&gt;How Microsoft deployed Exchange Server 2010 with hardware load ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/6130/aft/1176688/Default.aspx&quot;&gt;Planning an Exchange Migration? - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/rkorock/archive/2010/08/06/1088383.aspx&quot;&gt;Exchange 2010 with F5 BIG-IP and Dell Article Published&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/dctv/archive/2010/11/05/devconnections-2010-attendee-discusses-exchange-and-cloud-computing.aspx&quot;&gt;devconnections 2010: Attendee discusses Exchange and Cloud Computing&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/25/aft/1172976/afv/topic/asg/62/Default.aspx&quot;&gt;F5 with mixed Exchange 2007 and 2010 Client Access Servers ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/25/aft/1172014/afv/topic/asg/62/Default.aspx&quot;&gt;Trying to implement Exchange 2010 - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/25/aft/1177146/Default.aspx&quot;&gt;Exchange 2010 Monitors for LTM - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/25/aft/1176704/afv/topic/asg/62/Default.aspx&quot;&gt;Exchange 2010/LTM10.2 RPC mail delivery delay ? - DevCentral - F5 ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/31/aft/1174067/afv/topic/asg/52/Default.aspx&quot;&gt;Exchange 2010 Global address list issue - DevCentral - F5 ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/downloads/Presentations/F5SolutionForMicrosoftExchange2010.pptx&quot;&gt;F5 solution for Microsoft Exchange&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/dcpodcast/Tags/Exchange/default.aspx&quot;&gt;DevCentral Weekly Roundup | Audio Podcast - Exchange&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/25/aft/1172803/afv/topic/asg/62/Default.aspx&quot;&gt;Exchange 2007 - What Type of SSL certificate required (single ...&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6857e80e-a685-4917-a18e-28e056345b54&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Visio&quot; rel=&quot;tag&quot;&gt;Visio&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Exchange&quot; rel=&quot;tag&quot;&gt;Exchange&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Exchange+2010&quot; rel=&quot;tag&quot;&gt;Exchange 2010&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/John+Alam&quot; rel=&quot;tag&quot;&gt;John Alam&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1092458.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/Wvujx5ApQpQ&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1755065&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 15 Mar 2011 05:04:01 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1755065</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1755065#feedback</comments>
</item>
<item>
 <title>Documenting iRules with Comment Headers</title>
 <link>http://jasonrahm.ulitzer.com/node/1747754</link>
 <description>&lt;p&gt;Did I lose you at “Documenting?”&amp;#160; Documentation is rarely at the top of the list of things we make time for, yet the practice is critical.&amp;#160; You never know when you’re going to see that iRule again, and if it’s six months later after an upgrade and you have to stare at code for a while just to figure out what its purpose is, well, that’s a problem.&amp;#160; With iRules, comments are not compiled into byte-code, so there is no performance hit taken with their presence.&amp;#160;&amp;#160;&amp;#160; Some things you could consider for the documentation header:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Overall concept for the rule or some simple workflow&lt;/li&gt;
    &lt;li&gt;Date/Time the header was created&lt;/li&gt;
    &lt;li&gt;Revision information&lt;/li&gt;
    &lt;li&gt;External Requirements (profiles, classes, dns configurations)&lt;/li&gt;
    &lt;li&gt;LTM Platform&lt;/li&gt;
    &lt;li&gt;TMOS Version and Hotfix level the iRule was developed on&lt;/li&gt;
    &lt;li&gt;Known versions the iRule does NOT work on (and why if known)&lt;/li&gt;
    &lt;li&gt;CMP Compatibility flag&lt;/li&gt;
    &lt;li&gt;iRule performance data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This in comment format would look something like this (not all the above list included):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;## GRACEFUL SSL SECURITY STRENGTH ENFORCEMENT     &lt;br /&gt;
##      &lt;br /&gt;
## Sends users with browsers not capable of 256-bit encryption to      &lt;br /&gt;
## error page, forces capable browsers to higher security profile      &lt;br /&gt;
##      &lt;br /&gt;
## CMP compatible:&amp;#160; Yes      &lt;br /&gt;
##      &lt;br /&gt;
## This rule requires:      &lt;br /&gt;
##&amp;#160; 1. Default clientssl profile allowing 128-bit encryption: DEFAULT:!ADH:!EXPORT40:!EXP:!LOW      &lt;br /&gt;
##&amp;#160; 2. Additional clientssl profile set to higher security: DEFAULT:!ADH:!EXPORT40:!EXP:!LOW:!MEDIUM      &lt;br /&gt;
##&amp;#160; 3. HTTP profile      &lt;br /&gt;
##&amp;#160; 4. Datagroup (accepted_ciphers in this example) with hex strings of 256-bit accepted ciphers:      &lt;br /&gt;
##&amp;#160; class accepted_ciphers {      &lt;br /&gt;
##&amp;#160;&amp;#160;&amp;#160;&amp;#160; &quot;0035&quot;      &lt;br /&gt;
##&amp;#160;&amp;#160;&amp;#160;&amp;#160; &quot;c014&quot;&amp;#160; &lt;br /&gt;
##&amp;#160; }      &lt;br /&gt;
##&amp;#160; # NOTE that the &quot;&quot; should not be added when submitting the strings in the GUI      &lt;br /&gt;
##&amp;#160;&amp;#160; &lt;br /&gt;
## This rule developed on:      &lt;br /&gt;
##&amp;#160; TMOS v9.4.8 355.0      &lt;br /&gt;
##&amp;#160; LTM1500      &lt;br /&gt;
##      &lt;br /&gt;
##&amp;#160; Note: Confirmed NOT WORKING on TMOS vBIG-IP Version 10.2.0 1707.0      &lt;br /&gt;
##&amp;#160;&amp;#160; (due to failure of eval of SSL::profile in CLIENT_DATA event)      &lt;br /&gt;
##      &lt;br /&gt;
## Sizing Data:      &lt;br /&gt;
## RULE clientssl_issue      &lt;br /&gt;
## +-&amp;gt; CLIENT_ACCEPTED&amp;#160;&amp;#160; 200 total&amp;#160;&amp;#160; 0 fail&amp;#160;&amp;#160; 0 abort      &lt;br /&gt;
## |&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cycles (min, avg, max) = (0, 0, 0)      &lt;br /&gt;
## +-&amp;gt; CLIENT_DATA&amp;#160;&amp;#160; 200 total&amp;#160;&amp;#160; 0 fail&amp;#160;&amp;#160; 0 abort      &lt;br /&gt;
## |&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cycles (min, avg, max) = (439752, 491878, 3673016)      &lt;br /&gt;
## +-&amp;gt; HTTP_REQUEST&amp;#160;&amp;#160; 200 total&amp;#160;&amp;#160; 0 fail&amp;#160;&amp;#160; 0 abort      &lt;br /&gt;
##&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cycles (min, avg, max) = (0, 0, 0)      &lt;br /&gt;
##      &lt;br /&gt;
##&amp;#160; NOTES: Test case: httperf --server=x.x.x.x --port=443 --uri=/ --ssl --ssl-no-reuse --num-conn=200 --rate=5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s incredibly useful going into a scenario where you have to troubleshoot or validate upgrades or patches to infrastructure or applications.&amp;#160; Whereas some of that information would have to be manually generated, some of it can be auto-generated.&amp;#160;&lt;/p&gt;
&lt;h3&gt;Automating iRule Header Information via pyControl&lt;/h3&gt;
&lt;p&gt;Looking back to the &lt;a href=&quot;/wiki/default.aspx/iControl/pycontrolIruleTiming.html&quot;&gt;pyControl iRule Timing script&lt;/a&gt; I started in &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086438/2x5-Minute-iRules--Timing.aspx&quot;&gt;2x5 Minute iRules on Timing&lt;/a&gt;, what if I turned the timing on/off from the script, and removed the old header (if present) and inserted a new one after testing?&amp;#160; The first changes to the script is to add a section of code to download the iRule (via the query_rule iControl method) from the LTM and pull out any existing header information.&amp;#160; I also am using a counter for the number of performance trials.&amp;#160; After yanking this information from the iRule, I add timing and then re-bundle the iRule and send it back to the LTM (via the modify_rule method.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;rule_contents = rl.query_rule(rule_names = [irule])     &lt;br /&gt;
brl = rule_contents[0].rule_definition.split(&#039;\n&#039;)      &lt;br /&gt;
rl_ver = 1      &lt;br /&gt;
for x in brl:      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if x[:18] == &#039;#hdr_info: Trials:&#039;:      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rl_ver = int(x.split(&#039; &#039;)[2].encode(&#039;ascii&#039;)) + 1      &lt;br /&gt;
brl = filter (lambda a: a[:10] != &#039;#hdr_info:&#039;, brl)      &lt;br /&gt;
brl.insert(0, u&#039;timing on&#039;)      &lt;br /&gt;
brl = &#039;\n&#039;.join(brl)      &lt;br /&gt;
rule_contents[0].rule_definition = brl      &lt;br /&gt;
rl.modify_rule(rules = rule_contents)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note the &quot; u&#039;timing on&#039; &quot; insert.&amp;#160; The list items in the iRule object are all unicode.&amp;#160; Rather than converting to ascii to work with them, I&amp;#160;just left the objects as unicode, so each insert utilizes the unicode designator in python.&amp;#160; Load is then sent as before in the script and then after the stats have been calculated and displayed to console, I package the header information in a list that I then add to the existing iRule after removing timing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;rule_contents = rl.query_rule(rule_names = [irule])     &lt;br /&gt;
brl = rule_contents[0].rule_definition.split(&#039;\n&#039;)      &lt;br /&gt;
brl.remove(u&#039;timing on&#039;)      &lt;br /&gt;
irules_header = []      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: ### END ###&#039;)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: CPU Util / request: %s&#039; % (z*100.0/tmm_cpu_cycles))      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Total Avg Cycles: %s&#039; % z)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Target: %s&#039; % url)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Cores: %s, Speed: %s&#039; % (cpu_cores, cpu_num))      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Platform: %s&#039; % platform_ID)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Time: %s&#039; % time.asctime(time.localtime(time.time())))      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Trials: %s&#039; % rl_ver)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: Name: %s&#039; % irule)      &lt;br /&gt;
irules_header.append(u&#039;#hdr_info: ### BEGIN ###&#039;)      &lt;br /&gt;
for x in irules_header:      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; brl.insert(0, x)      &lt;br /&gt;
brl = &#039;\n&#039;.join(brl)      &lt;br /&gt;
rule_contents[0].rule_definition = brl      &lt;br /&gt;
rl.modify_rule(rules = rule_contents)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, I pull the complete rule back down from the LTM and display to console:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;rule_contents = rl.query_rule(rule_names = [irule])     &lt;br /&gt;
print &quot;\nFinal iRule:\n&quot;      &lt;br /&gt;
print rule_contents[0].rule_definition&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The result of this with the full script is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;jrahm@ubuntu:~/scripts$ python2.6 is2.py 172.16.99.5 admin w3c &lt;a href=&quot;http://172.16.100.99&quot;&gt;http://172.16.100.99&lt;/a&gt; 200&lt;/p&gt;
&lt;p&gt;Please enter your password:     &lt;br /&gt;
Password:&lt;/p&gt;
&lt;p&gt;Resetting statistics for the w3c iRule&lt;/p&gt;
&lt;p&gt;Enabling timing and removing header information&lt;/p&gt;
&lt;p&gt;Making 200 requests to host &lt;a href=&quot;http://172.16.100.99&quot;&gt;http://172.16.100.99&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;### iRule w3c Performance Results     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BIG-IP LTM Z100 has 2454400000 availabe CPU Cycles (1 cores, 3068.000 MHz)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Average Cycles/sec:&amp;#160;&amp;#160;&amp;#160;&amp;#160; 665391      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CPU Utilization/req:&amp;#160;&amp;#160;&amp;#160; 0.0271101287484 percent      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Max Requests/sec:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3688&lt;/p&gt;
&lt;p&gt;Inserting Header in iRule and disabling timing&lt;/p&gt;
&lt;p&gt;Final iRule:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#hdr_info: ### BEGIN ###       &lt;br /&gt;
#hdr_info: Name: w3c        &lt;br /&gt;
#hdr_info: Trials: 4        &lt;br /&gt;
#hdr_info: Time: Wed Mar&amp;#160; 9 09:16:21 2011        &lt;br /&gt;
#hdr_info: Platform: Z100        &lt;br /&gt;
#hdr_info: Cores: 1, Speed: 3068.000        &lt;br /&gt;
#hdr_info: Target: &lt;/strong&gt;&lt;a href=&quot;http://172.16.100.99&quot;&gt;&lt;strong&gt;http://172.16.100.99&lt;/strong&gt;&lt;/a&gt;      &lt;br /&gt;
&lt;strong&gt;#hdr_info: Total Avg Cycles: 665391       &lt;br /&gt;
#hdr_info: CPU Util / request: 0.0271101287484        &lt;br /&gt;
#hdr_info: ### END ###        &lt;br /&gt;
&lt;/strong&gt;when HTTP_REQUEST {      &lt;br /&gt;
&amp;#160;&amp;#160; # &amp;lt; CONDENSED FOR CLARITY      &lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Parting Thoughts&lt;/h3&gt;
&lt;p&gt;If you wanted to incorporate some of the ideas from above that wouldn’t be fit for auto-generation (like rule concept and workflow), you could place that information immediately before your first event with a different pattern than “#hdr_info:” since the script will remove any line matching that pattern.&amp;#160; The full script is in the &lt;a href=&quot;/wiki/default.aspx/iControl.CodeShare&quot;&gt;iControl codeshare&lt;/a&gt; under &lt;a href=&quot;/wiki/default.aspx/iControl/pycontrolIruleTimingAndCommentHeaderInsert.html&quot;&gt;pycontrol irule timing and comment header insert&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What other ideas do you have for rule documentation?&amp;#160; Post them in the comments section below.&lt;/p&gt;
&lt;div style=&quot;clear: both; height: 11px;&quot; class=&quot;d_itc_f&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/cRLw6jHpaXo&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1747754&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 09 Mar 2011 04:30:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1747754</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1747754#feedback</comments>
</item>
<item>
 <title>2x5-Minute iRules - Timing</title>
 <link>http://jasonrahm.ulitzer.com/node/1740617</link>
 <description>&lt;p&gt;Timing is a command in iRules that triggers the system to track the number of cycles each event in an iRule consumes.&amp;#160; Deb has covered timing previously in &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/123/iRules-Optimization-101--05--Evaluating-iRule-Performance.aspx&quot; target=&quot;_blank&quot;&gt;iRules Optimization 101 – #05 – Evaluating iRule Performance&lt;/a&gt;, so I took that and a presentation someone internally put together from that information and recorded a walkthrough on what makes timing tick.&amp;#160; (ba-dah, ching!)&lt;/p&gt;
&lt;div class=&quot;techTipPlayer&quot;&gt;&lt;a id=&quot;5a6afbb8-2001-493f-8ee7-5237db94bdb1&quot; href=&quot;http://www.youtube.com/watch?v=aGcq2d3zoUI&quot; alt=&quot;youtube&quot;&gt;iRule Timing Part 1&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I also took the opportunity to dust off my pycontrol skills and whipped up a script that will do some load testing against a virtual with your iRule applied, then download and crunch the stats specific to your platform cores/speeds so the numbers should be accurate.&amp;#160;&lt;/p&gt;
&lt;div class=&quot;techTipPlayer&quot;&gt;&lt;a id=&quot;5a6afbb8-2001-493f-8ee7-5237db94bbd1&quot; href=&quot;http://www.youtube.com/watch?v=U0raBwhgPX4&quot; alt=&quot;youtube&quot;&gt;iRule Timing Part 2&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I uploaded the script to the &lt;a href=&quot;/wiki/default.aspx/iControl.CodeShare&quot; target=&quot;_blank&quot;&gt;iControl codeshare&lt;/a&gt;, titled &lt;a href=&quot;/wiki/default.aspx/iControl/pycontrolIruleTiming.html&quot; target=&quot;_blank&quot;&gt;pycontroliRuleTiming.&lt;/a&gt;&amp;#160; A sample of the output from the script is below:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;mailto:jrahm@jrahm-dev:/var/tmp$&quot;&gt;jrahm@jrahm-dev:/var/tmp$&lt;/a&gt; ./iRuleStats.py 10.10.20.5 admin timing_test &lt;a href=&quot;http://10.10.20.50&quot;&gt;http://10.10.20.50&lt;/a&gt;      &lt;br /&gt;
Please enter your password:      &lt;br /&gt;
Password:&lt;/p&gt;
&lt;p&gt;Resetting Statistics for the timing_test iRule&lt;/p&gt;
&lt;p&gt;Running load test to host &lt;a href=&quot;http://10.10.20.50&quot;&gt;http://10.10.20.50&lt;/a&gt;      &lt;br /&gt;
### Raw Data ###      &lt;br /&gt;
Event:&amp;#160; HTTP_REQUEST      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STATISTIC_RULE_AVERAGE_CYCLES = 41767      &lt;br /&gt;
Event:&amp;#160; HTTP_RESPONSE      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STATISTIC_RULE_AVERAGE_CYCLES = 92363&lt;/p&gt;
&lt;p&gt;### iRule timing_test Performance Results     &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BIG-IP LTM 3600 has 3413568000 availabe CPU Cycles (2 cores, 2133.480 MHz)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Average Cycles/sec:&amp;#160;&amp;#160;&amp;#160;&amp;#160; 134130      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CPU Utilization/req:&amp;#160;&amp;#160;&amp;#160; 0.00392931970302 percent      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Max Requests/sec:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 25449&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Related Articles&lt;/i&gt;&lt;/p&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/3650/afv/topic/Default.aspx&quot;&gt;Timing iRules - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/23451/Default.aspx&quot;&gt;irule timing: how to convert Cycles to Seconds - DevCentral - F5 ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/123/iRules-Optimization-101--05--Evaluating-iRule-Performance.aspx&quot;&gt;iRules Optimization 101 - #05 - Evaluating iRule Performance ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/aff/5/aft/8008/afv/topic/Default.aspx&quot;&gt;Time-based iRules - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/weblogs/jason/archive/2009/05/05/when-optimization-techniques-fail----why-testing-is-so-important.aspx&quot;&gt;When Optimization Techniques Fail -- Why Testing is so Important&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Community/GroupDetails/tabid/1082223/aff/40/aft/33360/afv/topic/asg/45/Default.aspx&quot;&gt;Perfomance gain of using HTTP Classes over iRules - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Forums/tabid/53/afv/topic/aff/5/aft/20351/Default.aspx&quot;&gt;iRule causing ever-increasing TMM CPU utilization - DevCentral ...&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/132/iRules-101--06--When.aspx&quot;&gt;iRules 101 - #06 - When &amp;gt; DevCentral &amp;gt; F5 DevCentral &amp;gt; Tech Tips&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/91JZcDvw6TE&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1740617&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 03 Mar 2011 07:53:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1740617</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1740617#feedback</comments>
</item>
<item>
 <title>Mitigate Java Vulnerability with iRules</title>
 <link>http://jasonrahm.ulitzer.com/node/1703070</link>
 <description>I got a request yesterday morning to asking if there was a way to drop HTTP requests if a certain number was referenced in the Accept-Language header.  The user referenced this post on Exploring Binary. The number, 2.2250738585072012e-308, causes the Java runtime and compiler to go into an infinite loop when converting it to java_tweetsdouble-precision binary floating-point.  Not good. Twitter is ablaze on the issue, and there is a good discussion thread on Hacker News as well.  So how do you stop it?&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1703070&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 10 Feb 2011 07:15:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1703070</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1703070#feedback</comments>
</item>
<item>
 <title>One Time Passwords via an SMS Gateway with BIG-IP Access Policy Manager</title>
 <link>http://jasonrahm.ulitzer.com/node/1708361</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt;
&lt;p&gt;One time passwords, or OTP, are used (as the name indicates) for a single session or transaction.&amp;#160; The plus side is a more secure deployment, the downside is two-fold—first, most solutions involve a token system, which is costly in management, dollars, and complexity, and second, people are lousy at remembering things, so a delivery system for that OTP is necessary.&amp;#160; The exercise in this tech tip is to employ BIG-IP APM to generate the OTP and pass it to the user via an SMS Gateway, eliminating the need for a token creating server/security appliance while reducing cost and complexity.&lt;/p&gt;
&lt;h3&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;This guide was developed by F5er Per Boe utilizing the newly released BIG-IP version 10.2.1.&amp;#160; The “-secure” option for the mcget command is new in this version and is required in one of the steps for this solution.&amp;#160; Also, this solution uses the Clickatell SMS Gateway to deliver the OTPs.&amp;#160; Their API is documented at &lt;span lang=&quot;NO-BOK&quot; style=&quot;line-height: 115%; font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt;&quot;&gt;&lt;a href=&quot;http://www.clickatell.com/downloads/http/Clickatell_HTTP.pdf&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;http://www.clickatell.com/downloads/http/Clickatell_HTTP.pdf&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;.&amp;#160; &lt;/span&gt;Other gateway providers with a web-based API could easily be substituted.&amp;#160; Also, there are steps at the tail end of this guide to utilize the BIG-IP’s built-in mail capabilities to email the OTP during testing in lieu of SMS.&amp;#160; The process in delivering the OTP is shown in Figure 1.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:4501822e-5e4a-4e1c-a1ce-bcca1cd5a03a&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_process_flow-8x6.png&quot; title=&quot;Figure 1. OTP Process Flow&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;547&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_process_flow_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;First a request is made to the BIG-IP APM.&amp;#160; The policy is configured to authenticate the user’s phone number in Active Directory, and if successful, generate a OTP and pass along to the SMS via the HTTP API.&amp;#160; The user will then use the OTP to enter into the form updated by APM before allowing the user through to the server resources.&lt;/p&gt;
&lt;h3&gt;BIG-IP APM Configuration&lt;/h3&gt;
&lt;p&gt;Before configuring the policy, an access profile needs to be created, as do a couple authentication servers.&amp;#160; First, let’s look at the authentication servers&lt;/p&gt;
&lt;h4&gt;Authentication Servers&lt;/h4&gt;
&lt;p&gt;To create servers used by BIG-IP APM, navigate to Access Policy-&amp;gt;AAA Servers and then click create.&amp;#160; This profile is simple, supply your domain server, domain name, and admin username and password as shown in Figure 2.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:1b021f03-004f-4e2f-816a-c70014377ae0&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig2-8x6.png&quot; title=&quot;Figure 2. Active Directory Server&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;534&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig2_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The other authentication server is for the SMS Gateway, and since it is an HTTP API we’re using, we need the HTTP type server as shown in Figure 3.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:2c702876-e5d8-4f0f-8530-12f7fdca1ef3&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_http_aaa-8x6.png&quot; title=&quot;Figure 3. HTTP Server&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;555&quot; height=&quot;609&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_http_aaa_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Note that the hidden form values highlighted in red will come from your Clickatell account information.&amp;#160; Also note that the form method is GET, the form action references the Clickatell API interface, and that the match type is set to look for a specific string.&amp;#160; The Clickatell SMS Gateway expects the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://api.clickatell.com/http/sendmsg?api_id=xxxx&amp;amp;user=xxxx&amp;amp;password=xxxx&amp;amp;to=xxxx&amp;amp;text=xxxx&quot;&gt;https://api.clickatell.com/http/sendmsg?api_id=xxxx&amp;amp;user=xxxx&amp;amp;password=xxxx&amp;amp;to=xxxx&amp;amp;text=xxxx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, successful logon detection value highlighted in red at the bottom of Figure 3 should be modified to response code returned from SMS Gateway.&amp;#160; Now that the authentication servers are configured, let’s take a look at the access profile and create the policy.&lt;/p&gt;
&lt;p&gt;Access Profile &amp;amp; Policy&lt;/p&gt;
&lt;p&gt;Before we can create the policy, we need an access profile, shown below&amp;#160; in Figure 4 with all default settings.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f05b52bf-79fb-44ac-936c-89a922a0f7ee&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_accessprofile-8x6.png&quot; title=&quot;Figure 4. Access Profile&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;377&quot; height=&quot;609&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_accessprofile_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Now that that is done, we click on Edit under the Access Policy column highlighted in red in Figure 5.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7c647a2e-7023-47fa-895b-f122dc6a5bd3&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig5-8x6.png&quot; title=&quot;Figure 5. Access Policy&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;214&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig5_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The default policy is bare bones, or as some call it, empty.&amp;#160; We’ll work our way through the objects, taking screen captures as we go and making notes as necessary.&amp;#160; To add an object, just click the “+” sign after the Start flag.&amp;#160; The first object we’ll add is a Logon Page as shown in Figure 6.&amp;#160; No modifications are necessary here, so you can just click save.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:579d16ba-c1bb-40b4-b83e-6f8d7d25a064&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig6-8x6.png&quot; title=&quot;Figure 6. Logon Page&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;506&quot; height=&quot;609&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig6_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Next, we’ll configure the Active Directory authentication, so we’ll add an AD Auth object.&amp;#160; Only setting here in Figure 7 is selecting the server we created earlier.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:60e4eee3-be87-4de3-a81d-aaec19554c30&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig7-8x6.png&quot; title=&quot;Figure 7. AD Authentication&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;302&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig7_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Following the AD Auth object, we need to add an AD Query object on the AD Auth successful branch as shown in Figures 8 and 9.&amp;#160; The server is selected in the properties tab, and then we create an expression in the branch rules tab.&amp;#160; To create the expression, click change, and then select the Advanced tab.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:a306c378-208a-4815-a168-bd71e162d018&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig8-8x6.png&quot; title=&quot;Figure 8. AD Query Properties&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;346&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig8_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:16681da1-8337-479e-994d-6cbe68b1fa9f&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig9-8x6.png&quot; title=&quot;Figure 9. AD Query Branch Rules&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;261&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig9_10.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The expression used in this AD Query branch rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;expr { [mcget {session.ad.last.attr.mobile}] != &quot;&quot; }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next we add an iRule Event object to the AD Query OK branch that will generate the one time password and provide logging.&amp;#160; Figure 10 Shows the iRule Event object configuration.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:bf7df0d2-8788-4637-81aa-5eec31ad46a0&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_eventOTP-8x6.png&quot; title=&quot;Figure 10. iRule Event&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;234&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_eventOTP_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;The iRule referenced by this event is below.&amp;#160; The logging is there for troubleshooting purposes, and should probably be disabled in production.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;div style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot; id=&quot;codeSnippet&quot;&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt;  &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_AGENT_EVENT&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;expr&lt;/span&gt; srand([&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;clock&lt;/span&gt; clicks])&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; otp [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt; range ]&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;format&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;%08d&quot;&lt;/span&gt; [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;expr&lt;/span&gt; int(rand() * 1e9)][ 1 6 ]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; mail [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.ad.last.attr.mail&quot;&lt;/span&gt;] &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; mobile [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.ad.last.attr.mobile&quot;&lt;/span&gt;] &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; logstring mail,$mail,otp,$otp,mobile,$mobile&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.user.otp.pw $otp&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.user.otp.&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; $logstring&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.user.otp.username [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.logon.last.username&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;session&lt;/span&gt;.logon.last.username [&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ACCESS::session&lt;/span&gt; data get &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;session.ad.last.attr.mobile&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0.alert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Event [ACCESS::policy agent_id] Log $logstring&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;ACCESS_POLICY_COMPLETED&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
    &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;log&lt;/span&gt; local0.alert &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;Result: [ACCESS::policy result]&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;
}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;On the fallback path of the AD Query object, add a Message Box object as shown in Figure 11 to alert the user if no mobile number is configured in Active Directory.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:000077d3-76dc-4838-9530-8c6f8c32397f&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_adNoneMobile-8x6.png&quot; title=&quot;Figure 11. Message Box AD Alert&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;329&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_adNoneMobile_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;On the fallback path of the Event OTP object, we need to add the HTTP Auth object.&amp;#160; This is where the SMS Gateway we configured in the authentication server is referenced.&amp;#160; It is shown in Figure 12.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:639b21f5-0639-4153-907d-276ceb1aa8aa&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig11-8x6.png&quot; title=&quot;Figure 12. HTTP Auth Object&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;222&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig11.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;On the fallback path of the HTTP Auth object, we need to add a Message Box as shown in Figure 13 to communicate the error to the client.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d77c6c98-5601-4261-b827-bd55ec452900&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig12-8x6.png&quot; title=&quot;Figure 13. Message Box Error&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;333&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig12.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;On the Successful branch of the HTTP Auth object, we need to add a Variable Assign object to store the username.&amp;#160; A simple expression and a unique name for this variable object is all that is changed.&amp;#160; This is shown in Figure 14.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:642b48bc-78d2-4a28-ae5f-62dc98e7ca59&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig13-8x6.png&quot; title=&quot;Figure 14. Username Variable Assign&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;279&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig13.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;On the fallback branch of the Username Variable Assign object, we’ll configure the OTP Logon page, which requires a Logon Page object (shown in Figure 15).&amp;#160; I haven’t mentioned it yet, but the name field of all these objects isn’t a required change, but adding information specific to the object helps with readability.&amp;#160; On this form, only one entry field is required, the one time password, so the second password field (enabled by default) is set to none and the initial username field is changed to password.&amp;#160; The Input field below is changed to reflect the type of logon to better queue the user.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:b2c6e4c3-f3f4-4600-939c-5b1903df6258&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig15-8x6.png&quot; title=&quot;Figure 15. OTP Logon Page&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;479&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig15_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Finally, we’ll finish off with an Empty Action object where we’ll insert an expression to verify the OTP.&amp;#160; The name is configured in properties and the expression in the branch rules, as shown in Figures 16 and 17.&amp;#160; Again, you’ll want to click advanced on the branch rules to enter the expression.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c04f59fa-7028-4760-87a0-c786607f41be&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig16a-8x6.png&quot; title=&quot;Figure 16. Emtpy Action Properties&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;200&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig16a_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c24747c2-d916-48dc-92c4-2dd83eac6c75&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig16b-8x6.png&quot; title=&quot;Figure 17. Empty Action Branch Rules&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;252&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig16b_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The expression used in the branch rules above is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;expr { [mcget {session.user.otp.pw}] == [mcget -secure {session.logon.last.otp}] }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note again that the –secure option is only available in version 10.2.1 forward.&amp;#160; Now that we’re done adding objects to the policy, one final step is to click on the Deny following the OK branch of the OTP Verify Empty Action object and change it from Deny to Allow.&amp;#160; Figure 18 shows how it should look in the visual policy editor window.&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ae76b71a-c87e-48c1-b573-a2fbb79c50f8&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_vpefinal-8x6.png&quot; title=&quot;Figure 18. VPE Final Solution&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;205&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_vpefinal.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Now that the policy is completed, we can attach the access profile to the virtual server and test it out, as can be seen in Figures 19 and 20 below.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7483fc56-298a-41f3-b704-bde2485968fb&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig17-8x6.png&quot; title=&quot;Figure 19. User Logon&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;492&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig17.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:c10c1fae-1ff7-4198-a1f0-71e33f4b3642&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig18-8x6.png&quot; title=&quot;Figure 20. One Time Password Entry&quot; rel=&quot;thumbnail&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;6012427d&#039;})&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;461&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Feb/Windows-Live-Writer-661ceb59daf0_4D81-otp_fig18.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;h3&gt;Email Option&lt;/h3&gt;
&lt;p&gt;If during testing you’d rather send emails than utilize the SMS Gateway, then configure your BIG-IP for mail support (&lt;a href=&quot;http://support.f5.com/kb/en-us/solutions/public/3000/600/sol3664.html&quot; target=&quot;_blank&quot;&gt;Solution 3664&lt;/a&gt;), keep the Logging object, lose the HTTP Auth object, and configure the system with this script to listen for the messages sent to /var/log/ltm from the configured Logging object:&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;  &lt;blockquote&gt;
&lt;p&gt;#!/bin/bash      &lt;br /&gt;
while true       &lt;br /&gt;
do       &lt;br /&gt;
&amp;#160;&amp;#160; tail -n0 -f /var/log/ltm | while read line       &lt;br /&gt;
&amp;#160;&amp;#160; do       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var2=`echo $line | grep otp | awk -F&#039;[,]&#039; &#039;{ print $2 }&#039;`       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var3=`echo $line | grep otp | awk -F&#039;[,]&#039; &#039;{ print $3 }&#039;`       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var4=`echo $line | grep otp | awk -F&#039;[,]&#039; &#039;{ print $4 }&#039;`       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if [ &quot;$var3&quot; = &quot;otp&quot; -a -n &quot;$var4&quot; ]; then       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; echo Sending pin $var4 to $var2       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; echo One Time Password is $var4 | mail -s $var4 $var2       &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fi       &lt;br /&gt;
&amp;#160;&amp;#160; done       &lt;br /&gt;
done&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The log messages look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jan 26 13:37:24 local/bigip1 notice apd[4118]: 01490113:5: b94f603a: session.user.otp.log is mail,user1@home.local,otp,609819,mobile,12345678&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The output from the script as configured looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[root@bigip1:Active] config # ./otp_mail.sh      &lt;br /&gt;
Sending pin 239272 to &lt;a href=&quot;mailto:user1@home.local&quot;&gt;user1@home.local&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The BIG-IP APM is an incredibly powerful tool to add to the LTM toolbox.&amp;#160; Whether using the mail system or an SMS gateway, you can take a bite out of your infrastructure complexity by using this solution to eliminate the need for a token management service.&amp;#160; Many thanks again to F5er Per Boe for this excellent solution!&lt;/p&gt;
&lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/g1SCwVcfTUo&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1708361&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 08 Feb 2011 00:00:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1708361</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1708361#feedback</comments>
</item>
<item>
 <title>iRules HTTP Event Order Update</title>
 <link>http://jasonrahm.ulitzer.com/node/1699455</link>
 <description>&lt;p&gt;I received an update to the HTTP Event Order diagram last night from the excellent F5er John Alam.  Here it is, in all its glory!&lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:59c03207-52ff-4f1a-b7e4-2d13658efc40&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/1a9d7d79c260_8F96/httpeventorder-8x6.png&quot; title=&quot;&quot; rel=&quot;thumbnail&quot;&gt;&lt;img width=&quot;830&quot; height=&quot;620&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/jason/Windows-Live-Writer/1a9d7d79c260_8F96/httpeventorder_6.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Fire up the printer, the laminator, whatever, and get this on your cubicle wall pronto!  For comparison, the original drawing is in the second link below.  For visio, pdf, and svg versions of this image, &lt;a href=&quot;http://devcentral.f5.com/downloads/advdc/iRule_HTTP_events.zip&quot;&gt;click here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;em&gt;Related Articles&lt;/em&gt;
&lt;ul class=&quot;ArrowList&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/344/iRules-Event-Order.aspx&quot;&gt;iRules Event Order &amp;gt; DevCentral &amp;gt; F5 DevCentral &amp;gt; Tech Tips&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/jason/archive/2009/09/08/irules-insight-http-event-order.aspx&quot;&gt;iRules Insight - HTTP Event Order&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/240/Stacking-iRules-A-Modular-Approach.aspx&quot;&gt;Stacking iRules: A Modular Approach &amp;gt; DevCentral &amp;gt; F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/5/aft/1166767/afv/topic/Default.aspx&quot;&gt;HTTP::payload replace with MORE data? - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;div style=&quot;padding: 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a3503297-35ac-438f-b03a-08df33777296&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/HTTP&quot; rel=&quot;tag&quot;&gt;HTTP&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/John+Alam&quot; rel=&quot;tag&quot;&gt;John Alam&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1092366.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/mNtCA93Yz1s&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1699455&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 01 Feb 2011 11:18:58 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1699455</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1699455#feedback</comments>
</item>
<item>
 <title>BIG-IP Configuration Visualizer - iControl Style</title>
 <link>http://jasonrahm.ulitzer.com/node/1704101</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt; &lt;p&gt;I posted almost two years ago to the day on a cool tool called &lt;a href=&quot;/weblogs/jason/archive/2009/01/21/me-caveman-need-picture-bigip-config-visualizer.aspx&quot;
 target=&quot;_blank&quot;&gt;BIG-IP Config Visualizer&lt;/a&gt;, or BCV, that one of our field engineers put together that utilizes a BIG-IP config parser and GraphViz to create images visualizing the relationship of configuration objects for a particular virtual server.&amp;#160;
 Well, I’m here to report that another community user, Russell Moore, has taken that work to the next level.&amp;#160; Rather than trying to figure out the nuances of configuration objects amongst all the versions of BIG-IP, he converted the script to utilize iControl!&amp;#160;
 In this tech tip, I’ll walk through the installation steps necessary to get this tool off the ground.&lt;/p&gt; &lt;h3&gt;The Setup&lt;/h3&gt; &lt;p&gt;Install a few libraries and GraphViz via apt-get&lt;/p&gt; &lt;ul&gt; &lt;li&gt;apt-get install libssl-dev libcrypt-ssleay-perl libio-socket-ssl-perl
 libgraph-writer-graphviz-perl&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Open a CPAN shell and install SOAP::Lite and Net::Netmask&lt;/p&gt; &lt;ul&gt; &lt;li&gt;perl –MCPAN –e shell &lt;ul&gt; &lt;li&gt;install SOAP::Lite&lt;/li&gt; &lt;li&gt;install Net::Netmask&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;After installing those libraries and
 tools, &lt;a href=&quot;/wiki/default.aspx/iControl/BIG_IPConfigurationVisualizer.html&quot; target=&quot;_blank&quot;&gt;grab the BCV-iControl source from the codeshare&lt;/a&gt;, save it as an executable (bcv.pl on my system) and set these variables (I only changed the ones in bold type):&lt;/p&gt;
 &lt;blockquote&gt; &lt;p&gt;#Declare CLI $vars &lt;br /&gt; my $vs1; &lt;br /&gt; my $new_dir&amp;#160;&amp;#160; = &#039;NO_DIR&#039;; &lt;br /&gt; my $extension = &#039;NO_EXT&#039;; &lt;br /&gt; &lt;strong&gt;my $ltm_host = &quot;172.16.99.5&quot;; &lt;br /&gt; &lt;/strong&gt;my $ltm_port = &#039;443&#039;; &lt;br /&gt; &lt;strong&gt;my $user_id = &quot;admin&quot;; &lt;br /&gt; &lt;/strong&gt;my
 $req_partition; &lt;br /&gt; &lt;strong&gt;my $user_password = &quot;admin&quot;; &lt;br /&gt; &lt;/strong&gt;my $ltm_protocol = &#039;https&#039;; &lt;br /&gt; my $path; &lt;br /&gt; my $dir;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Finally, some command-line options:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;root@ubuntu:/home/jrahm# ./bcv.pl -h &lt;br /&gt;
 Thank you for using BIG-IP Configuration Visualizer (BCV 1.16.1-revisited with soap) &lt;br /&gt; -v &amp;lt;VS_NAME&amp;gt; this prints the specified virtual server and requires option -c. &lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160; Default is to print all&lt;/p&gt; &lt;p&gt;-c Specify the partition/container
 to look in for option -v&lt;/p&gt; &lt;p&gt;-t &amp;lt;iControl host LTM&amp;gt; specify ltm_host IP we will connect to&lt;/p&gt; &lt;p&gt;-d specifies a directory you want the images in. &lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Has to be in Current working Directory: &lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
 /home/jrahm &lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Default is /img)&lt;/p&gt; &lt;p&gt;-e Define image format options: svg, png (default is jpg)&lt;/p&gt; &lt;p&gt;-help for help but you already found it&lt;/p&gt; &lt;/blockquote&gt; &lt;h3&gt;The Payoff&lt;/h3&gt; &lt;p&gt;Now that all the legwork is complete,
 we can play!&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;root@ubuntu:/home/jrahm# ./bcv.pl&lt;/p&gt; &lt;p&gt;Please wait while we build some maps of your system. &lt;br /&gt; Retrieving SelfIPs in Partition: ** Common ** &lt;br /&gt; Mapping Partition: ** Common ** routes to gateways &lt;br /&gt; Mapping Partition:
 ** Common ** selfIPs and VLANs.. &lt;br /&gt; Mapping Partition: ** Common ** pools and iRule references to pools............ &lt;br /&gt; Mapping Partition: ** Common ** virtual servers and properties... &lt;br /&gt; Drawing VS: dc.hashtest which is 1 of 3 in Partition: Common
 &lt;br /&gt; Drawing VS: testvip1 which is 2 of 3 in Partition: Common &lt;br /&gt; Drawing VS: management_vip which is 3 of 3 in Partition: Common&lt;/p&gt; &lt;p&gt;All drawings completed!&amp;#160; They can be found in: &lt;br /&gt; /home/jrahm/img&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Taking a look at
 the virtual server I used for the &lt;a href=&quot;/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1086426/Revisiting-Hash-Load-Balancing-and-Persistence-on-BIG-IP-LTM.aspx&quot; target=&quot;_blank&quot;&gt;hashing algorithm distribution tech tip&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/media/images/dc.hashtest.jpg&quot;&gt;&lt;img
 width=&quot;1028&quot; height=&quot;155&quot; border=&quot;0&quot; style=&quot;background-image: none; border-width: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; title=&quot;dc.hashtest&quot; alt=&quot;dc.hashtest&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-BIG-IP-Configuration-Visualizer_5BCE-dc.hashtest-8x6.jpg&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;Visual representations of configurations are incredibly helpful in identifying issues quickly.&amp;#160; An interesting next step would be to track state of objects from iteration of the drawings, and build a page to include all
 the images.&amp;#160; That would make a nice and cheap dashboard for application owners or operating centers.&amp;#160; Any takers?&amp;#160; Thanks to community user Russell Moore that took a great contributed tool and made it better with iControl!&lt;/p&gt; &lt;div style=&quot;padding:
 0px; margin: 0px; display: inline; float: none;&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9d88c272-98da-4513-9fa1-48adca86e3ff&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/f5+DevCentral&quot; rel=&quot;tag&quot;&gt;f5 DevCentral&lt;/a&gt;,&lt;a
 href=&quot;http://technorati.com/tags/iControl&quot; rel=&quot;tag&quot;&gt;iControl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/GraphViz&quot; rel=&quot;tag&quot;&gt;GraphViz&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Perl&quot; rel=&quot;tag&quot;&gt;Perl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/BIG-IP&quot; rel=&quot;tag&quot;&gt;BIG-IP&lt;/a&gt;,&lt;a
 href=&quot;http://technorati.com/tags/LTM&quot; rel=&quot;tag&quot;&gt;LTM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Russell+Moore&quot; rel=&quot;tag&quot;&gt;Russell Moore&lt;/a&gt;&lt;/div&gt; &lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height:
 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/mVNXuYtym3k&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1704101&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 25 Jan 2011 05:01:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1704101</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1704101#feedback</comments>
</item>
<item>
 <title>Revisiting Hash Load Balancing and Persistence on BIG-IP LTM</title>
 <link>http://jasonrahm.ulitzer.com/node/1704100</link>
 <description>&lt;script type=&quot;text/javascript&quot; src=&quot;/DesktopModules/itcMetaPost/js/ca0c21fbdc85f6a1597417732d450607.ashx?hs=1&quot;&gt;&lt;/script&gt; &lt;p&gt;A good while back (Dec ‘07!), Deb wrote up &lt;a href=&quot;http://links.f5.com/eU74WV&quot; target=&quot;_blank&quot;&gt;hash load balancing&lt;/a&gt; in six pages
 of goodness.&amp;#160; She made some really good points in her introduction that bear repeating:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-blockquote_thumb_2_2.gif&quot; class=&quot;itcexpando&quot;
 onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;46&quot; height=&quot;28&quot; border=&quot;0&quot; style=&quot;background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;blockquote_thumb_2&quot; title=&quot;blockquote_thumb_2&quot;
 src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-blockquote_thumb_2_thumb.gif&quot; /&gt;&lt;/a&gt;Load balancing of cache and proxy servers has long been a standard task for F5&#039;s BIG-IP LTM. However, cache and proxies
 have unique requirements over other types of applications. It&#039;s not realistically possible to cache an entire site, let alone the Internet, on a single cache device. The solution is to intelligently load balance requests and &#039;persist&#039; them to a specific cache
 not based on who the client is, but based on the content requested. In a forward proxy example, all requests for site1.com would go to cache1 while all requests for site2.com go to cache2. Since each cache gets all the requests for their respective sites,
 they will have the most up to date version of the content cached. This also allows the caches to scale more efficiently as each would only need to cache N percent of the possible destination content. In BIG-IP LTM nomenclature, adding more members (nodes or
 servers) to the pool reduces the percent of content such as URIs that any cache server needs to store.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;The point of this article is not to rewrite Deb’s excellent work, so please go read that article first.&amp;#160; Back?&amp;#160; Great…let’s
 move on.&amp;#160; In my previous article, &lt;a href=&quot;http://links.f5.com/fV2Nvp&quot; target=&quot;_blank&quot;&gt;Fun with Hash Performance&lt;/a&gt;, I tested each of the hashing algorithms (minus the persist carp function), pushing fifty-thousand executions of the hash and timing it
 for comparison.&amp;#160; This time, I’d like to take a look at how each of the hashes distributes the traffic amongst different pool sizes and with two different numbers of unique URLs.&amp;#160; In the event you are priming cache arrays, or merely want to use all
 the resources you allocate to an application, using a hash gives you a deterministic way to plan.&amp;#160; However, not all hashes are created equal in this regard, and I know a little (very little) on how they work in general, but have never seen any testing
 to prove out exactly how they behave with load balancing.&amp;#160; Knowing how they react to your application and how they perform arms you, the technician, with another tool in the toolbox when it comes time to architect a solution.&amp;#160; The goal here is to
 chart the standard deviation for each of the hashes.&amp;#160; The lower the standard deviation, the more evenly distributed the connections/content would be.&amp;#160; We&#039;ll get to the charts later on, however.&amp;#160; Let&#039;s start with the test cases, which can be
 seen in Table 1.&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table width=&quot;400&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;p style=&quot;text-align: center;&quot;&gt;&amp;#160;&lt;/p&gt; &lt;td valign=&quot;top&quot; style=&quot;text-align: center;&quot; colspan=&quot;3&quot;&gt;&lt;strong&gt;Table 1 - Hashing Algorithm Tests&lt;/strong&gt;&lt;/td&gt;
 &lt;p style=&quot;text-align: center;&quot;&gt;&amp;#160;&lt;/p&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Test Case #&lt;/strong&gt;&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Pool Members&lt;/strong&gt;&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Unique URLs&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td
 width=&quot;131&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;3&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;2&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;3&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;5000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot;
 valign=&quot;top&quot;&gt;3&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;4&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;4&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;4&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;5000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;5&lt;/td&gt;
 &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;8&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;6&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;8&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;5000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;7&lt;/td&gt; &lt;td width=&quot;134&quot;
 valign=&quot;top&quot;&gt;16&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;8&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;16&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;5000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;9&lt;/td&gt; &lt;td width=&quot;134&quot; valign=&quot;top&quot;&gt;32&lt;/td&gt;
 &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;131&quot; valign=&quot;top&quot;&gt;10&lt;/td&gt; &lt;td width=&quot;135&quot; valign=&quot;top&quot;&gt;32&lt;/td&gt; &lt;td width=&quot;132&quot; valign=&quot;top&quot;&gt;5000&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;h3&gt;Generating the Unique URLs&lt;/h3&gt; &lt;p&gt;I don’t have
 five-thousand, or even two-thousand unique URLs laying around, so I’ll need to generate them.&amp;#160; I need each of them in two formats as well.&amp;#160; When I began testing, my intention was to run every request from a class through an iRule loop, and for all
 but one of the hashes that’s still true.&amp;#160; For the built-in carp persistence, however, I couldn’t figure a way to grab the data without a pool member connection, so I added another LTM to serve as pool members and used curl to request the URLs.&amp;#160; It
 was important for consistency, so I used this python code to generate the random string and save the list as a file of complete URLs for curl and a list of URIs for the class:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;#!/usr/bin/python&lt;br /&gt; import sys, os, random, string&lt;br /&gt;
 &lt;br /&gt; num = int(sys.argv[1])&lt;br /&gt; classfile = &quot;/home/jrahm/randomURLs_%s&quot; % num&lt;br /&gt; urlfile = &quot;/home/jrahm/urllist_%s.txt&quot; % num&lt;br /&gt; &lt;br /&gt; c = open(classfile, &#039;w&#039;)&lt;br /&gt; u = open(urlfile, &#039;w&#039;)&lt;br /&gt; &lt;br /&gt; for x in range(1, num+1):&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;
 y=&quot;&quot;.join(random.choice(string.letters) for i in xrange(random.randrange(3,15,1))) + &quot;/image%s.jpg&quot; % x&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160; c.write(y+ &quot;\n&quot;)&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160; u.write(&quot;http://172.16.101.50/&quot; + y + &quot;\n&quot;)&lt;/p&gt; &lt;/blockquote&gt; &lt;h3&gt;Configuring the Test
 Environment&lt;/h3&gt; &lt;p&gt;For most of the hashes, I just needed an LTM and a browser.&amp;#160; For the carp testing, I needed another LTM and a client to loop through the unique URLs.&amp;#160; With LTM VE and a laptop with 8G of RAM, I was able to set up the entire environment
 virtually, as shown below.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-hashtest_configuration_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img
 width=&quot;714&quot; height=&quot;595&quot; style=&quot;margin: 10px; display: block; float: none;&quot; alt=&quot;hashtest_configuration&quot; title=&quot;hashtest_configuration&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-hashtest_configuration_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;LTM1 is doing the heavy lifting.&amp;#160; A single virtual server (172.16.101.50) is configured with one of several pools, each with a specific number of pool members (shown in the pool name in the image above).&amp;#160; These pools were configured
 in tmsh with the aptly named &lt;a href=&quot;/wiki/default.aspx/tmsh/CreatePoolMembers.html&quot; target=&quot;_blank&quot;&gt;create_pool.tcl&lt;/a&gt; script from the wiki.&amp;#160; The pool members are actually virtual servers hosted on LTM 2.&amp;#160; I created those virtuals with a new tmsh
 script based on the create_pool.tcl script called, shockingly, create_virtuals.tcl, which I added to the tmsh wiki under &lt;a href=&quot;/wiki/default.aspx/tmsh/CreateLTMVirtuals.html&quot; target=&quot;_blank&quot;&gt;CreateLTMVirtuals&lt;/a&gt;.&amp;#160; Yea, tmsh!&lt;/p&gt; &lt;blockquote&gt; &lt;/blockquote&gt;
 &lt;p&gt;The iRule I used for these virtual servers is very short, and used just to respond to queries passed on by LTM 1:&lt;/p&gt; &lt;blockquote&gt; &lt;div id=&quot;codeSnippetWrapper&quot;&gt; &lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height:
 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color:
 white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 1:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;when&lt;/span&gt; &lt;span
 style=&quot;color: rgb(204, 102, 51);&quot;&gt;HTTP_REQUEST&lt;/span&gt; {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace;
 direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 2:&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;HTTP::respond&lt;/span&gt; 200 content &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;[LB::server
 addr]&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;&lt;/span&gt;&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color:
 black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 3:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt;&lt;/div&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;h3&gt;The Test iRule&lt;/h3&gt; &lt;p&gt;&amp;#160;I’m utilizing tables to store the hash results/pool hit counts, once the
 urls are processed, I lookup the data in the table, store it in a variable, then delete the table.&amp;#160; The carp urls are coming from a client, the rest of the hashing algorithms are processed internally to the iRule (shown below).&amp;#160; As I worked through
 the test cases, only things I changed were the class name (random_urls_2k or random_urls_5k) and the pool name.&amp;#160; For the carp test preceding the /hashtest step, I also changed the default pool on the virtual to match the iRule.&amp;#160; I could have automated
 all this to death, but chose expediency on some things.&lt;/p&gt; &lt;blockquote&gt; &lt;div id=&quot;codeSnippetWrapper&quot;&gt; &lt;div id=&quot;codeSnippet&quot; style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family:
 &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier
 New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum1&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 1:&lt;/span&gt; when HTTP_REQUEST {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height:
 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum2&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 2:&lt;/span&gt; &lt;span style=&quot;color:
 rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; uri [HTTP::uri]&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction:
 ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum3&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 3:&lt;/span&gt; persist carp $uri&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244,
 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum4&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 4:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt;
 { $uri eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;/hashtest&quot;&lt;/span&gt; } {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace;
 direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum5&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 5:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;foreach&lt;/span&gt; hash [list &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;md5&quot;&lt;/span&gt; &lt;span style=&quot;color:
 rgb(0, 96, 128);&quot;&gt;&quot;crc32&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;sha1&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;sha256&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;sha384&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;sha512&quot;&lt;/span&gt;] {&lt;/pre&gt;
 &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow:
 visible;&quot;&gt;&lt;span id=&quot;lnum6&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 6:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; clen [class size random_urls_2k]&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color:
 white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum7&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 7:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;for&lt;/span&gt;
 { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; x 0 } {$x &amp;amp;lt; $clen} { &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;incr&lt;/span&gt; x } {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color:
 rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum8&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 8:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;binary&lt;/span&gt;
 &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;scan&lt;/span&gt; [$hash ]class element -name $x random_urls_2k[] w1 hashval&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width:
 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum9&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 9:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; hashval [expr {$hashval % ]active_members
 hashpool_3[}]&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size:
 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum10&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 10:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; { [table &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;incr&lt;/span&gt; -subtable $hash -mustexist pm$hashval] eq &lt;span style=&quot;color:
 rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt;} {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black;
 font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum11&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 11:&lt;/span&gt; table &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; -subtable $hash pm$hashval 1 indefinite indefinite&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none;
 text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum12&quot; style=&quot;color:
 rgb(96, 96, 96);&quot;&gt; 12:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black;
 font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum13&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 13:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width:
 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum14&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 14:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;foreach&lt;/span&gt; pm [table keys -subtable
 $hash] {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow:
 visible;&quot;&gt;&lt;span id=&quot;lnum15&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 15:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;append&lt;/span&gt; hash_$hash &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;[table lookup -subtable $hash $pm], &quot;&lt;/span&gt;&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style:
 none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum16&quot; style=&quot;color:
 rgb(96, 96, 96);&quot;&gt; 16:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black;
 font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum17&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 17:&lt;/span&gt; table delete -subtable $hash -all&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244,
 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum18&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 18:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style:
 none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum19&quot; style=&quot;color: rgb(96,
 96, 96);&quot;&gt; 19:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;foreach&lt;/span&gt; pm [table keys -subtable carp] {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin:
 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum20&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 20:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;append&lt;/span&gt; hash_carp
 &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;[table lookup -subtable carp $pm], &quot;&lt;/span&gt;&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier
 New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum21&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 21:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color:
 rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum22&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 22:&lt;/span&gt; table delete -subtable carp -all&lt;/pre&gt;
 &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span
 id=&quot;lnum23&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 23:&lt;/span&gt; HTTP::respond 200 content &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;crc32:$hash_crc32&amp;lt;br&amp;gt;md5:$hash_md5&amp;lt;br&amp;gt;\&lt;/span&gt;&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align:
 left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum24&quot; style=&quot;color: rgb(96, 96,
 96);&quot;&gt; 24:&lt;/span&gt; sha1:$hash_sha1&amp;lt;br&amp;gt;sha256:$hash_sha256&amp;lt;br&amp;gt;sha384:$hash_sha384&amp;lt;br&amp;gt;\&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family:
 &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum25&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 25:&lt;/span&gt; sha512:$hash_sha512&amp;lt;br&amp;gt;carp:$hash_carp&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre
 style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span
 id=&quot;lnum26&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 26:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace;
 direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum27&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 27:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244,
 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum28&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 28:&lt;/span&gt; when HTTP_REQUEST_SEND {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre
 style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum29&quot;
 style=&quot;color: rgb(96, 96, 96);&quot;&gt; 29:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; { $uri ne &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;/hashtest&quot;&lt;/span&gt; } {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height:
 12pt; background-color: rgb(244, 244, 244); margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum30&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 30:&lt;/span&gt; &lt;span style=&quot;color:
 rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt; psel [getfield ]LB::server addr[ &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;.&quot;&lt;/span&gt; 4][&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em;
 width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum31&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 31:&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;if&lt;/span&gt; { ]table &lt;span style=&quot;color:
 rgb(204, 102, 51);&quot;&gt;incr&lt;/span&gt; -subtable carp -mustexist pm$psel[ eq &lt;span style=&quot;color: rgb(0, 96, 128);&quot;&gt;&quot;&quot;&lt;/span&gt;} {&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244);
 margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum32&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 32:&lt;/span&gt; table &lt;span style=&quot;color: rgb(204, 102, 51);&quot;&gt;set&lt;/span&gt;
 -subtable carp pm$psel 1 indefinite indefinite&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction:
 ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum33&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 33:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align: left; padding: 0px; line-height: 12pt; background-color: rgb(244, 244, 244);
 margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum34&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 34:&lt;/span&gt; }&lt;/pre&gt; &lt;!--CRLF--&gt; &lt;pre style=&quot;border-style: none; text-align:
 left; padding: 0px; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#039;Courier New&#039;,courier,monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible;&quot;&gt;&lt;span id=&quot;lnum35&quot; style=&quot;color: rgb(96, 96, 96);&quot;&gt; 35:&lt;/span&gt;
 }&lt;/pre&gt; &lt;!--CRLF--&gt;&lt;/div&gt; &lt;/div&gt; &lt;/blockquote&gt; &lt;p&gt;Because I couldn’t test carp in the same was as the other hashes, each test case is a two step process.&amp;#160; First, I hit the LTM 1 virtual server from my Ubuntu client with this command, referencing the urllist
 built earlier:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;xargs curl –I &amp;lt; /home/jrahm/urlllist_2000.txt&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Once that completes, I hit the virtual directly with this command, which returns the data shown immediately below the command:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;curl
 &lt;a href=&quot;http://172.16.101.50/hashtest&quot; title=&quot;http://172.16.101.50/hashtest&quot;&gt;http://172.16.101.50/hashtest&lt;/a&gt; &lt;br /&gt; &amp;lt;html&amp;gt;&amp;lt;body&amp;gt;crc32:655, 682, 663, &amp;lt;br&amp;gt;md5:634, 653, 713, &amp;lt;br&amp;gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sha1:684, 655, 661, &amp;lt;br&amp;gt;sha256:669, 714, 617, &amp;lt;br&amp;gt;&lt;br
 /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sha384:689, 635, 676, &amp;lt;br&amp;gt;sha512:634, 684, 682, &amp;lt;br&amp;gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; carp:671, 642, 646, &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
 &lt;/blockquote&gt; &lt;p&gt;That gives me the data I need to move on and calculate and graph the standard deviation for test case 1.&amp;#160; After going through each test case, I have results for each of the hashes for each of the urllist lengths, which I set arbitrarily
 at 2000 and 5000.&lt;/p&gt; &lt;h3&gt;The Graphs&lt;/h3&gt; &lt;p&gt;The &lt;a href=&quot;/downloads/techtips/hashtest_results.zip&quot; target=&quot;_blank&quot;&gt;data (and more graphs) are available&lt;/a&gt; if you want to manipulate and graph a different way.&amp;#160; I broke down the data and each of the graphs
 below represent a single hash and it’s standard deviation given the number of unique URLs and the number of members in the pool.&amp;#160; Note that for CRC32, the max pool members with connections was always ten, so for a 16 member pool, six members had no connection
 at all.&amp;#160; I wasn’t entirely sure how to handle this in the calculations, so I just entered zeroes for the remaining pool members.&amp;#160; But that said, you surely will not want to use CRC32 as a load balancing/persistence algorithm in pools larger than
 three. &amp;#160;In case it&#039;s not apparent, the x-axis is number of pool members (shown as mbr), and the y-axis is the value of the standard deviation.&amp;#160; As alluded to earlier, a lower standard deviation is more desirable if you want an even distribution of
 your content (in a caching scenario, or connections elsewise).&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-crc32_stddev_4.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img
 width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot; style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;crc32_stddev&quot; title=&quot;crc32_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-crc32_stddev_thumb_1.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-md5_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;md5_stddev&quot; title=&quot;md5_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-md5_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha1_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;sha1_stddev&quot; title=&quot;sha1_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha1_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha256_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;sha256_stddev&quot; title=&quot;sha256_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha256_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha384_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;sha384_stddev&quot; title=&quot;sha384_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha384_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha512_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;sha512_stddev&quot; title=&quot;sha512_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-sha512_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-carp_stddev_2.png&quot; class=&quot;itcexpando&quot; onclick=&quot;return mp.expand(this,{slideshowGroup:&#039;b23fe6f1&#039;})&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; border=&quot;0&quot;
 style=&quot;background-image: none; border: 0px none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px;&quot; alt=&quot;carp_stddev&quot; title=&quot;carp_stddev&quot; src=&quot;/Portals/0/images/metapost/News-Articles/citizen_elah/2011/Jan/Windows-Live-Writer-e68028959217_CC0D-carp_stddev_thumb.png&quot;
 /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It’s interesting data, isn’t it?&amp;#160; All the cryptographic hashes largely perform better distributions with more targets.&amp;#160; Keep all this in context, though.&amp;#160; Remember that SHA384/SHA512 was six times longer in processing than the
 CRC32, and double MD5/SHA1.&amp;#160; Finding the sweet spot between algorithm/distribution will come down to available resources, business requirements, or both.&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;Advanced load balancing and persistence with hashing algorithms offers
 a great deal of benefit, but great care should be exercised in testing and knowing your environment.&lt;/p&gt; &lt;div class=&quot;d_itc_f&quot; style=&quot;clear: both; height: 11px;&quot;&gt;&lt;script src=&quot;/DesktopModules/itcMetaPost/js/m.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;/div&gt; &lt;p&gt;&amp;#160;&lt;/p&gt;]&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/Qy31oTmLkpw&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1704100&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 21 Jan 2011 06:14:00 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1704100</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1704100#feedback</comments>
</item>
<item>
 <title>An Homage to LTM</title>
 <link>http://jasonrahm.ulitzer.com/node/1668767</link>
 <description>&lt;p&gt;Sad, I know.  But I had Shakespeare on the brain this morning, and whereas I’m pretty sure he’ll roll over in his grave at me identifying with him in the same blog post as what’s below, well, I figured I’d tap into my (not so) creative side.&lt;/p&gt;  &lt;h3&gt;An Homage to LTM&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size=&quot;5&quot; face=&quot;Script MT Bold&quot;&gt;Gather my packets, LTM       &lt;br /&gt;And give to all comprising flows        &lt;br /&gt;Careful analysis on which to        &lt;br /&gt;Accept or deny my humble requests.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size=&quot;5&quot; face=&quot;Script MT Bold&quot;&gt;The lower layers thou swiftly removes,       &lt;br /&gt;The heart of my request reveals         &lt;br /&gt;A simple &lt;font face=&quot;Times New Roman&quot;&gt;GET&lt;/font&gt; or two or fifty.        &lt;br /&gt;Carest thou doesn&#039;t; an effortless task.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size=&quot;5&quot; face=&quot;Script MT Bold&quot;&gt;Wherest shall thou dispatch my requests?       &lt;br /&gt;Is thy Master&#039;s TCL&#039;d iRules logic sound?        &lt;br /&gt;&lt;font face=&quot;Times New Roman&quot;&gt;HTTP_REQUEST&lt;/font&gt; doctors my solicitation and         &lt;br /&gt;Relinquishes its firm grip--sweet release!&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote /&gt;  &lt;p&gt;Alright, DevCentralites…flame away!&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:28eeef5b-6dc7-4fda-a348-575fc5f509e3&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/LTM&quot; rel=&quot;tag&quot;&gt;LTM&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1092316.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/eHmHxhWmHnA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1668767&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 06 Jan 2011 11:35:51 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1668767</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1668767#feedback</comments>
</item>
<item>
 <title>F5 BIG-IP LTM Image Hosting&amp;ndash;Redeux!</title>
 <link>http://jasonrahm.ulitzer.com/node/1611518</link>
 <description>&lt;p&gt;We’ve covered pushing images from LTM before with Kirk’s excellent perl script work on sorry pages.  But that’s not the only thing you can host images for, and it’s not the only approach.  &lt;a title=&quot;&quot; href=&quot;http://devcentral.f5.com&quot; rel=&quot;&quot;&gt;DevCentral&lt;/a&gt; community user kevin.stewart crafted up a nifty bash script to achieve the same ends, and gobbles up every image in /var/images, b64 encodes them, then drops them into a class.  The script is minimal in lines, but powerful in output:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;#!/bin/bash&lt;/p&gt;    &lt;p&gt;## clear /var/class_build/images_build.class     &lt;br /&gt;echo -n &quot;&quot; &amp;gt; /var/class/images.class;&lt;/p&gt;    &lt;p&gt;## loop through real images and create base64 data for images_build.class     &lt;br /&gt;for i in $(ls /var/images); do      &lt;br /&gt;  echo \&quot;`echo $i |tr &#039;[:upper:]&#039; &#039;[:lower:]&#039;`\&quot; := \&quot;`base64 /var/images/$i |tr -d &#039;\n&#039;`\&quot;, &amp;gt;&amp;gt; /var/class/images.class;      &lt;br /&gt;done&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This results in a class with lines that look like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&quot;favicon.ico&quot; := &quot;iVBORw0KGgoAAAANSUhEUgAAAJ8AAACfC…”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Create the class in the GUI, then the iRule is pretty simple as well:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;when RULE_INIT {     &lt;br /&gt;  ## define the class names      &lt;br /&gt;  set static::IMAGES_CLASS “images.class”      &lt;br /&gt;}      &lt;br /&gt;when HTTP_REQUEST {       &lt;br /&gt;  ## is the request an image? Process images from the base64 encoded image class      &lt;br /&gt;  if { [string tolower [HTTP::path]] ends_with “.jpg” or [string tolower [HTTP::path]] ends_with “.png” \      &lt;br /&gt;    or [string tolower [HTTP::path]] ends_with “.gif” } {      &lt;br /&gt;      ## assume image name is after the last forward slash character in the URI      &lt;br /&gt;      if { [class match [string range [HTTP::uri] [expr [string last “/” [HTTP::uri]] + 1] end] equals $static::IMAGES_CLASS] } {      &lt;br /&gt;        HTTP::respond 200 content [b64decode [class lookup [string range [HTTP::uri] [expr [string last “/” [HTTP::uri]] + 1] end] $static::IMAGES_CLASS]] \      &lt;br /&gt;          “Content-Type” “image/png” “Last-Modified” “Sun, 29 Mar 1970 18:53:56 GMT”      &lt;br /&gt;      }      &lt;br /&gt;  }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Pretty powerful stuff, huh?  Note you’ll need v10 for this implementation, it could, however, be rewritten for v9.  Full write-up is in the codeshare: &lt;a title=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/LTMImageHosting.html&quot; href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/LTMImageHosting.html&quot;&gt;http://devcentral.f5.com/wiki/default.aspx/iRules/LTMImageHosting.html&lt;/a&gt;&lt;/p&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/jason/archive/2009/05/12/host-that-sorry-page-on-your-big-ip.aspx&quot;&gt;Host that Sorry Page on your BIG-IP!&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/5/aft/33977/Default.aspx&quot;&gt;about i-rule sorry page configuration - DevCentral - F5 DevCentral ...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/SorryPageIRuleGenerator_Perl.html&quot;&gt;DevCentral Wiki: Sorry Page I Rule Generator_ Perl&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iRules/Automatic_maintenance_page___Sorry_page_with_images.html&quot;&gt;DevCentral Wiki: Automatic_maintenance_page___ Sorry_page_with_images&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a3f38213-93b9-41ca-820f-e405822234ac&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iRules&quot; rel=&quot;tag&quot;&gt;iRules&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1090353.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/8Gomq_FdnFA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1611518&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 12 Nov 2010 11:52:48 EST</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1611518</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1611518#feedback</comments>
</item>
<item>
 <title>2048-bit Infrastructure Impact Reporting Tool</title>
 <link>http://jasonrahm.ulitzer.com/node/1557947</link>
 <description>&lt;p&gt;A few weeks ago Lori nailed it with a post (&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2010/09/10/f5-friday-the-2048-bit-keys-to-the-kingdom.aspx&quot; target=&quot;_blank&quot;&gt;The 2048-bit Keys to the Kingdom&lt;/a&gt;) on the coming forced migration to 2048-bit keys.  A few days prior, I got a call from “THE” Matt Cauthorn, DevCentral resident stud contributor L4L7 about the very same issue.  Not surprisingly, he was ahead of the game on this and has spent some time developing a tool that will take the mystery out of the licensing and infrastructure impact checklist items Lori mentioned.  Well what does this tool do?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Function      &lt;ul&gt;       &lt;li&gt;Generates a high-level report in pdf format on what 2048-bit keys will do to your infrastructure &lt;/li&gt;        &lt;li&gt;Graphs the last seven days of TPS data by default (you can also run against 24 hour and 30 day data as well) &lt;/li&gt;        &lt;li&gt;Highlight any platforms in your infrastructure that might be improperly sized for 2048-bit keys under existing loads &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Details      &lt;ul&gt;       &lt;li&gt;Fetches some graph data, the license file, the platform ID, the TMOS version, and general system information.  These are all &lt;strong&gt;read-only&lt;/strong&gt; calls. &lt;/li&gt;        &lt;li&gt;Assumptions          &lt;ul&gt;           &lt;li&gt;Using 1024-bit keys today.  This may not be true for you.  If you’re using 2048-bit keys, the report will still generate useful information &lt;/li&gt;            &lt;li&gt;To estimate your maximum platform TPS, the tool simply takes the maximum 1024-bit TPS for your platforms and reports 20% of that value.  Note that this is maximum platform TPS, not maximum licensed TPS. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Requirements&lt;/h3&gt;  &lt;p&gt;If you haven’t taken the time to configure your environment for pyControl, you’ll need to do so to use this tool.  There are installation tutorials for &lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2358/Getting-Started-with-pyControl-v2-Installing-on-Windows.aspx&quot; target=&quot;_blank&quot;&gt;Windows&lt;/a&gt; and &lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2359/Getting-Started-with-pyControl-v2-Installing-on-Ubuntu-Desktop.aspx&quot; target=&quot;_blank&quot;&gt;Ubuntu&lt;/a&gt;.  Here are the packages you’ll need:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://www.python.org/&quot; target=&quot;_blank&quot;&gt;Python&lt;/a&gt; 2.5, 2.6, or 2.7 (avoid 2.6 if you can) &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://pypi.python.org/pypi/setuptools&quot; target=&quot;_blank&quot;&gt;Setuptools&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;https://fedorahosted.org/suds/&quot; target=&quot;_blank&quot;&gt;Suds&lt;/a&gt; (Grab the GA version, which is currently 0.4) &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/LinkClick.aspx?link=http%3a%2f%2fdevcentral.f5.com%2flabs%2fpycontrol%2fpycontrol.tar.gz&amp;amp;tabid=73&amp;amp;mid=433&quot; target=&quot;_blank&quot;&gt;pyControl&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.reportlab.com/software/opensource/rl-toolkit/download/&quot; target=&quot;_blank&quot;&gt;Reportlab&lt;/a&gt; (I grabbed the latest daily windows installer) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These details and the reporting tool itself are ready for you &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iControl/SSL2048bitKeyTPSReportingTool.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; in the &lt;a href=&quot;http://devcentral.f5.com/wiki/default.aspx/iControl/CodeShare.html&quot; target=&quot;_blank&quot;&gt;iControl codeshare&lt;/a&gt;.  Enjoy!&lt;/p&gt; &lt;i&gt;Related Articles&lt;/i&gt;   &lt;ul class=&quot;ArrowList&quot;&gt;   &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2010/02/03/wils-ssl-tps-versus-http-tps-over-ssl.aspx&quot;&gt;WILS: SSL TPS versus HTTP TPS over SSL&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/aff/32/aft/1174206/afv/topic/asg/44/Default.aspx&quot;&gt;SSL TPS license - DevCentral - F5 DevCentral &amp;gt; Community &amp;gt; Group ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Default.aspx?tabid=53&amp;amp;aft=1171913&quot;&gt;SSL transaction (TPS) rate limit reached - DevCentral - F5 ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2010/06/24/data-center-feng-shui-ssl.aspx&quot;&gt;Data Center Feng Shui: SSL&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/weblogs/macvittie/archive/2010/09/10/f5-friday-the-2048-bit-keys-to-the-kingdom.aspx?utm_source=twitterfeed&amp;amp;utm_medium=twitter&quot;&gt;F5 Friday: The 2048-bit Keys to the Kingdom&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/1082327/Experimenting-with-pyControl-on-LTM-VE.aspx&quot;&gt;Experimenting with pyControl on LTM VE &amp;gt; DevCentral &amp;gt; F5 ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2358/Getting-Started-with-pyControl-v2-Installing-on-Windows.aspx&quot;&gt;Getting Started with pyControl v2: Installing on Windows ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/2359/Getting-Started-with-pyControl-v2-Installing-on-Ubuntu-Desktop.aspx&quot;&gt;Getting Started with pyControl v2: Installing on Ubuntu Desktop ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/afv/topic/aff/1/aft/86059/Default.aspx&quot;&gt;Does pycontrol work in Linux? - DevCentral - F5 DevCentral ...&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://devcentral.f5.com/Forums/tabid/53/aff/2108/afv/topic/aft/1172128/Default.aspx&quot;&gt;pyControl v2.0 - DevCentral - F5 DevCentral &amp;gt; Forums - Social ...&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1fa0addf-0187-40d7-8451-d0ccb27191b6&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/F5+DevCentral&quot; rel=&quot;tag&quot;&gt;F5 DevCentral&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/SSL+TPS&quot; rel=&quot;tag&quot;&gt;SSL TPS&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/2048-bit&quot; rel=&quot;tag&quot;&gt;2048-bit&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/pyControl&quot; rel=&quot;tag&quot;&gt;pyControl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/iControl&quot; rel=&quot;tag&quot;&gt;iControl&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/reportlab&quot; rel=&quot;tag&quot;&gt;reportlab&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/suds&quot; rel=&quot;tag&quot;&gt;suds&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/python&quot; rel=&quot;tag&quot;&gt;python&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Matt+Cauthorn&quot; rel=&quot;tag&quot;&gt;Matt Cauthorn&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Jason+Rahm&quot; rel=&quot;tag&quot;&gt;Jason Rahm&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://devcentral.f5.com/weblogs/jason/aggbug/1090272.aspx&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/f5/jason/~4/qPjsN-SVL7k&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://jasonrahm.ulitzer.com/node/1557947&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 04 Oct 2010 13:20:46 EDT</pubDate>
 <guid isPermaLink="true">http://jasonrahm.ulitzer.com/node/1557947</guid>
 <comments>http://jasonrahm.ulitzer.com/node/1557947#feedback</comments>
</item>
</channel>
</rss>

