F5 iRule log
前言
這跟最近在做的 log 分析也有關係 因為我們實驗室所管理的系統(ep, cls…)都是經由 F5[1] 來做管理 F5 不是戰鬥機..而是 F5 Network 公司,他們公司是做服務器負載平衡的設備 同時也被稱為,本地流量管理器,「聽說」可以做 4-7 層的 Load Balance 他提供的一些服務有 Load Balance、application switch、狀態監控、智能 IP 轉換 高級路由、SSL 加速、智能 HTTP 壓縮、TCP 優化等等等等等 [2] 為什麼可以這麼神奇的提供這麼多功能? 因為……它很貴!!!!!!!
所謂的 iRule,就是要用 TCL[3] 這種腳本語言所編寫的 它可以讓你選擇在想要的「時機」有如空中抓小鳥般的,攔截處理 HTTP、SERVER 連線的請求 而 F5 它提供了強大的函式庫 可以很容易的取得 URI::protoclo、URI::path、HTTP:method 等等這種資訊 他編寫的格式大概是這樣
when EVENT_NAME options{
body
}
when 是用來定義一種特色的狀態發生 例如 HTTPREQUEST、SERVERCONNECTED 等等 EVENT NAME 可以在 iRule 的事件參考文件中找到 還有所謂的 priority ,優先等級 其實當 iRule 在裝載到一個指定的 Virtual Server 中 系統端存儲一個事件的名稱還有優先等級(預設500,範圍為0~1000) 而當一個特色的情況觸發以後,系統會按優先等級行低到歸的傳送控制權 如果優先等級相同的話,會按照他們插入表格的順序來執行 簡單的 HTTP 的 EVEN_NAME 介紹
HTTP_REQUEST
#系統完全解析 client 的 request 時 觸發,這裡所說的 header 是 method、URI,不包含本文
HTTP_REQUEST_DATA
#請求接收到新的 HTTP 內容數據時觸發
HTTP_RESPONSE
#系統解析 SERVER 回應中的所有回應狀態和標頭時觸發
HTTP_RESPONSE_DATA
#系統從回應中接收到新的 HTTP 內容時觸發
HTTP_RESPONSE_CONTINUE
#系統從 Sserver 接收到 100 Continue 回應時觸發
於是後來我參考了網路的資料 就這樣寫我的 iRule
#HTTP log
when HTTP_REQUEST {
set url [HTTP::host][HTTP::uri]
set vip [IP::local_addr]:[TCP::local_port]
set path [HTTP::path]
set request [HTTP::request]
set method [HTTP::method]
}
when HTTP_RESPONSE {
set client [IP::client_addr]:[TCP::client_port]
set node [IP::server_addr]:[TCP::server_port]
set nodeResp [HTTP::status]
log LogServerIP local0.info "Client: $client ->; VIP:$vip,$url ->; Node: $node with response $nodeResp, Method:$method, Path:$path, Request:$request"
}
#TCP log
when CLIENT_ACCEPTED {
set vip [IP::local_addr]:[TCP::local_port]
}
when SERVER_CONNECTED {
set client "[IP::client_addr]:[TCP::client_port]"
set node "[IP::server_addr]:[TCP::server_port]"
}
when CLIENT_CLOSED {
log LogServerIP local0.info "Client $client ->; VIP: $vip ->; Node: $node"
}
HTTP:uri 是這樣的
例如 client request 的網址是 http://www.example.com:8080/main/index.jsp?user=test&login=check
那它的 HTTP:uri 就是 /main/index.jsp?user=test&login=check
IP::local_addr 就是那台 F5 的 IP
IP::server_addr 就是 那台 vm 的 ip 囉~