XFF Header Persistence iRule
Problem this snippet solves:
Identifies XFF headers and allows the selection of which header the iRule should persist on; assuming consistent ordering of multiple XFF headers. The iRule will work for single XFF headers as well, simply select 0 for the index.
How to use this snippet:
Instructions
- Fill in the Contributed by, Description, and iRule Source fields below.
- Select "SAMPLECODE" and other approprate categories.
- Add a meta description
- Include relevant iRule commands,events,etc used in this iRule.
- Delete this section.
- Click Save.
This iRule requires LTM v10. or higher. Contributed by: saltman
Code :
when HTTP_REQUEST {
# iRule: XFF Persistence iRule
# Function: Parse X-Forwarded-For header information and generate persistence records based on the selected header value
#
# Configuration Parameters:
# xff_debug - set to 1 to enable debug logging, set to 0 to disable logging
# xff_header_index - select which XFF header to use in the list; 0 is the first element in the list
# persistence_timeout - select the duration of the persistence record in seconds
set xff_debug 1
set xff_header_index 0
set persistence_timeout 900
set xff ''
# Log the value for all XFF header(s)
if {$xff_debug}{log local0. "[IP::client_addr]:[TCP::client_port]: [HTTP::method] to [HTTP::host][HTTP::uri], xff: [HTTP::header values X-Forwarded-For]"}
if {[HTTP::header values X-Forwarded-For] ne ""} {
# Convert the XFF headers to a list; single items will be index 0
set xff_list [split [HTTP::header values X-Forwarded-For] ,]
# Display the list elements
for {set x 0} {$x< [llength $xff_list]} {incr x} {
if {$xff_debug}{log local0. "XFF List Elements: Item $x [lindex $xff_list $x]"}
}
# Assign the preferred XFF element
# Check to make sure the preferred index is available in the list
if {$xff_header_index > [llength $xff_list]}{log local0. "ERROR: Preferred XFF header index is not present!"}
set xff [lindex $xff_list $xff_header_index]
if {$xff_debug}{log local0. "Preferred XFF Header Index is $xff_header_index with value of $xff"}
# Log preferred XFF and show current record if one exists
if {$xff_debug}{log local0. "[IP::client_addr]:[TCP::client_port]: Persisting on preferred XFF: $xff, existing record? [persist lookup uie $xff]"}
# Set a persistence entry based on the preferred XFF
persist uie $xff $persistence_timeout
} else {
# No XFF header found in the payload
if {$xff_debug}{log local0. "No XFF Header detected"}
}
}
when SERVER_CONNECTED {
# Log connection to identified server; show client and persistence record
if {$xff_debug && $xff ne ""}{log local0. "[IP::client_addr]:[TCP::client_port]: Persistence record: [persist lookup uie $xff]"}
}Published Mar 18, 2015
Version 1.0Scott_Altman_81
Historic F5 Account
Joined March 02, 2011
Scott_Altman_81
Historic F5 Account
Joined March 02, 2011
No CommentsBe the first to comment