1.背景
F5負載均衡設備,很多場景下需要采用旁掛的方式部署。為了保證訪問到源站的數據流的request和response的TCP路徑一致,f5采用了snat機制。但是這樣導致源站上看到的來源IP都是snat地址,而看不到真實的訪問源地址。
2.http訪問
對於HTTP應用可以直接在VS中開啟X-Forwarded規則
3.https訪問
由於HTTPS應用到達F5的數據都是密文,F5只能看到網絡層的地址,4—7層的內容無法看到,所以F5也無法像http應用一樣將客戶端地址插入到X_forward_for字段;
目前HTTPS應用的加解密工作都是由服務器自身完成的,為了保證F5能夠看到4—7層的數據,需要將加解密工作交給F5來做:
1)根證書和KEY文件導入F5設備,F5代替服務器同用戶端建立SSL通道;
2)F5將加密數據解密后通過X_forward_for功能插入用戶端源IP
3)業務部門將服務器上的443端口更改為80端口即取消證書加解密工作
此過程在原有服務器上進行證書撤銷操作,會影響到應用中斷,建議重新搭建2台提供相同業務的80端口服務器;
4)F5設備上配置一個測試VS關聯新搭建的80服務器及SSL策略,驗證F5是否可以成功發布HTTPS業務、HTTPS業務插入源地址等功能。即新建測試的vip,訪問端口為443,關聯SSL加解密策略,后端關聯80的POOL。
VS中
4.非http/https
對於TCP協議則需要通過TCP OPTION來實現客戶需求
TCP Options需要配合IRULSE+TCP Profile來實現。
Irulse(當服務建立起連接時,轉換客戶端的ip地址並以點”.”划分為四個部分,在TCP報頭中插入kind為29類型的字段。設置變量,輸出log信息。
當服務建立起連接時,轉換客戶端的ip地址並以點”.”划分為四個部分,在TCP報頭中插入kind為29類型的字段。設置變量,輸出log信息):
1)irule
when SERVER_CONNECTED { scan [IP::client_addr] {%d.%d.%d.%d} a b c d TCP::option set 29 [binary format cccc $a $b $c $d] all set a [binary format cccc $a $b $c $d] log "insert ip to tcp option $a" }
2)Tcp Profile案例(需要在tmsh下運行,其中tcplh3為手動創建的tcp profile名稱):
create ltm profile tcp tcplh3 tcp-options “{8 first} {28 last}”
步驟:
1)模擬業務環境,在F5中建立Pool,建立VS,VS關聯特定的pool,關聯上述指定的iRule腳本和profile;
3)用SshClient登錄F5的命令行,運行tcpdump抓取數據包,同時用客戶端多次訪問VS地址。
抓包命令:tcpdump -s0 -ni 0.0:nnnp host 10.160.100.49 and port 25 -w /var/tmp/test_0907.pcap
即,需要抓10.160.100.49的25端口,保存目錄為/var/tmp/,保存文件為test.pcap。
抓包結果如下:
其中1d=29,表示tcp類型為29;06表示字節數
后邊的十六進制轉換為十進制后即為真實源地址
此時即表明f5已經成功將真實源地址插入到option字段,具體如何讀取需服務器端配置。
TCP三次握手
注:option是在傳輸層,業務服務器默認只讀網絡層