需求:
使用iRule 根據不一樣目的地址或端口,來選擇SNAT 地址 ,實現相同的後臺節點,訪問不一樣目的地址或者目的端口時,源地址也會不一樣;算法網絡概況:
內網:
後臺節點server:192.168.10.71
對應VLAN: Internal-selfIP: 192.168.10.1
外網:
客戶端client: 172.16.10.172
對應VLAN: external-selfIP: 172.16.10.1網絡
新建virtual server :http_VS: 172.16.10.100:80 VS關聯一個負載均衡pool: Pool member: 192.168.10.71:80
新建SNAT :out_snat: 172.16.10.71 snat out_snat { translation 172.16.10.71 origin 192.168.10.71 //只容許一臺機器出向訪問 }
snat out_snat2 { translation 172.16.10.250 origin 0.0.0.0 mask 0.0.0.0 //容許全部的機器出向訪問 }
snat out_snat3 { translation 172.16.10.188 origin 0.0.0.0 mask 0.0.0.0 vlan internal enable //僅限於vlan --internal 的流量命中 }
新建必要的出向的pool(將訪問的目的地址+端口 作成pool形式,以便iRule調用): pool http_pool { member 172.16.10.71:80 } pool ftp_pool { member 172.16.10.71:21 } 新建必要的snatpool: snatpool SNATPool_21 { member 172.16.10.21 } snatpool SNATPool_80 { member 172.16.10.80 } snatpool Internal_SNAT_Pool { member 172.16.10.250 } 新建virtual server :snat_VS: 0.0.0.0:0 VS關聯一個iRule :iSNAT_Rule,內容以下: rule iSNAT_Rule { when CLIENT_ACCEPTED { /* 定義事件 */ set MYPORT [TCP::local_port] /* 定義目的端口 */ set S_IP [IP::client_addr] /* 定義發起訪問的源地址 */ log local0. "Port is $MYPORT" /* 記錄日誌,打印在/var/log/ltm */ log local0. " S_IP is $S_IP" if {[IP::addr [IP::client_addr] equals 192.168.10.71]} /* 設置源地址過濾條件 */ { switch $MYPORT { /* 根據不一樣目的端口,選擇不一樣SNAT地址 */ 80 { snatpool SNATPool_80 pool http_pool /* 最終選擇訪問目的地 */ } 21 { snatpool SNATPool_21 pool ftp_pool } default { snatpool Internal_SNAT_Pool pool other_pool } } } else { /* 若是是其餘後臺節點,可根據需求自由配置*/ snatpool Internal_SNAT_Pool pool http_pool } } } //其實整個實現需求的核心在於iRule
此方案配置完成後,BIG-IP系統會作以下動做:
(如從server 訪問client 的http服務)
一個HTTP請求從server端到達BIG-IP系統,命中VS 0.0.0.0:0;
iSNAT_Rule被引用,檢查請求數據包,BIG-IP系統選中SNATPool_80和負載均衡pool http_pool;
採用round robin負載均衡算法,BIG-IP系統從http_pool中選中下一跳地址172.16.10.71;
SNATPool_80中有一個翻譯地址172.16.10.80 ;
BIG-IP系統從這翻譯地址池中隨機地選取一個地址 172.16.10.80 (本例爲固定源地址翻譯,故翻譯地址池中只有一個供選擇);
最後,BIG-IP系統將客戶端源IP地址翻譯成地址172.16.10.80,並將請求包轉發至172.16.10.71:80;負載均衡
此方案,切忌原有的SNAT 會失效,由於優先級是以7層爲先,依次遞減,故0.0.0.0的virtual server 優先級高於普通的SNAT, 因此要在iRule 中考慮詳盡狀況;ide
新建必要的出向的pool(將訪問的目的地址+端口 作成pool形式,以便iRule調用): pool http_pool { member 172.16.10.71:80 } 新建virtual server :client_VS: 192.168.10.237:0 VS關聯一個iRule :iSNAT_Rule2,內容以下: rule iSNAT_Rule2 { when CLIENT_ACCEPTED { set MYPORT [TCP::local_port] log local0. "Port is $MYPORT" switch $MYPORT { 80 { snatpool SNATPool_80 pool http } 21 { snatpool SNATPool_21 pool ftp_pool } default { snatpool Internal_SNAT_Pool pool http } } } }
此方案適合內網段中 出向訪問需求不少的狀況;
此方案採用將virtual server 創建在相對的內網段,使得訪問client 變成了訪問內網段的virtual server ,在通過BIGIP的處理後,命中 iRule 中的某一個SNATpool,源地址就變成SNATpool中可供選擇的地址 ,目的地址轉化爲出向pool 中的172.16.10.71,並將請求包轉發至172.16.10.71:80;翻譯
若是內網段中的其餘節點也須要訪問外網,而沒有一對多的源地址轉換需求,便可徹底按照正常的SNAT方式進行,互不衝突;日誌