F5负载均衡上使用iRule 来选择SNAT pool

网友投稿 676 2022-10-24


F5负载均衡上使用iRule 来选择SNAT pool

需求:使用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

1.需求一: 负载均衡功能(client访问server)

解决方案1、

新建virtual server :172.16.10.100:80 VS关联一个负载均衡pool: Pool member: 192.168.10.71:80

2.需求二: SNAT功能(server访问client),一个或多个内网节点转换成一个源地址;

解决方案1、

新建SNAT :out_snat: 172.16.10.71 snat out_snat { translation 172.16.10.71 origin 192.168.10.71 //只允许一台机器出向访问 }

解决方案2、

snat out_snat2 { translation 172.16.10.250 origin 0.0.0.0 mask 0.0.0.0 //允许所有的机器出向访问 }

解决方案3、

snat out_snat3 { translation 172.16.10.188 origin 0.0.0.0 mask 0.0.0.0 vlan internal enable //仅限于vlan --internal 的流量命中 }

3.需求三: iSNAT功能(server访问client),一个内网节点转换成多个源地址;

解决方案1、

新建必要的出向的pool(将访问的目的地址+端口 做成pool形式,以便iRule调用): 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 /* 最终选择访问目的地 */ } 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 的0.0.0.0:0;iSNAT_Rule被引用,检查请求数据包,BIG-IP系统选中SNATPool_80和负载均衡pool robin负载均衡算法,BIG-IP系统从;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 中考虑详尽情况;

解决方案2、

新建必要的出向的pool(将访问的目的地址+端口 做成pool形式,以便iRule调用): 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方式进行,互不冲突;


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据通信模式
下一篇:浅谈Java ThreadPoolExecutor的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~