F5 irule(判斷client IP及x-forward-for IP可否進入pool)

由於廠商CDN無法鎖定Geolocation,所以要在irule上鎖定只有CDN的node可以來存取,且要鎖定user真實IP不讓禁止的國家存取。

when HTTP_REQUEST {
    set accessip [IP::client_addr]  ;#設定accessip變數為來存取的IP
    set original_ip [getfield [HTTP::header "X-Forwarded-For"] "," 1]  ;#設定original_ip變數為XFF的第一個IP(user真實IP)
    set accessip_country [whereis $accessip country]  ;#設定accessip_country變數為存取IP的國家代碼
    set realip_country [whereis $original_ip country]     ;#設定realip_country變數為XFF的第一個IP(user真實IP)的國家代碼
    if { [class match $accessip equals "CDN-node"] || [class match $accessip equals "TW-OA-IP"]  } {
                   log local0. "MYWEB  User real IP  is $original_ip $realip_country CDN node IP is $accessip $accessip_country" 
        if { [class match $original_ip equals "TW-OA-IP"] || [class match $original_ip equals "PH-OA-IP"] } {
            log local0. "MYWEB   User real IP is $original_ip $realip_country CDN node IP is $accessip $accessip_countr"
            ;#來存取的IP如果等於CDN-node或TW-OA-IP,且user真實IP為TW-OA-IP或PH-OA-IP可正常存取
        }
        elseif { [class match $realip_country equals "blockedcountries"] } {
            HTTP::respond 403 content     [ifile get sorry_page]
            #如果來存取的IP如果等於CDN-node或TW-OA-IP但是user真實IP的國家代碼是被封鎖的返回無法訪問返回403禁止頁面
        }
        else {
            log local0. "MYWEB User real IP is $original_ip $realip_country CDN node IP is $accessip$accessip_country"
            ;#如果來存取的IP如果等於CDN-node或TW-OA-IP,user真實IP的國家代碼不是被封鎖的國家是可以正常進入
        }
    } 
    else {
        HTTP::respond 403 content     [ifile get sorry_page]
        log local0. " MYWEB Block Geo country User real IP is $original_ip $realip_country  $accessip $accessip_country"  
        ;#其他不被允許的存取IP,返回403禁止頁面
    }
}