LVS NAT 状态同步之异步回包
前言:此前跟同事做分享时,谈论到一个技术细节。
场景如下:
【客户端】
【LVS NAT Director A】 【LVS NAT Director B】
【RealServer1】【RealServer2】【RealServer3】【RealServer4】
Client: 172.16.159.100
DirectorA: 172.16.159.101\192.168.0.254
DirectorB: 172.16.159.102\192.168.0.253
RealServer1: 192.168.0.1
RealServer2: 192.168.0.2
RealServer3: 192.168.0.3
RealServer4: 192.168.0.4
正常情况下,LVS NAT 框架下,Realserver的默认路由通常指向Director的DIP地址。
原因是Director有lvs的地址转换表,/proc/net/ip_vs_conn ,所以回包时要通过此表才能还原地址和端口,发送客户端。
那么如果可以同步这个转换表数据到其他服务器,是否可以回包无需原路返回。换句话说,
Client -> DirectorA ->RealServer1
RealServer1->DirectorB->Client
如果可行,那么NAT方式的瓶颈问题也可以变相解决。
根据上述猜想我做了一些实验,把实验结果记录一下。
实验场景如下:
1. 部署LVS NAT实验环境,部署方法参考我之前分享的脚本。
2. 开启LVS状态同步,部署方法参考我之前分享的文档。
测试方案一:(短连接)
a. 客户端访问VIP,输出正常。
b. 修改RealServer的默认路由,指向DirectorB的DIP。
c. 客户端访问VIP,访问异常。
总结:
行不通原因是,首包的状态条目信息,没有同步到另外一台设备。导致回包时必然失败。
LVS状态同步是有选择的,仅ESTABLISHED以后的其他状态。我猜想当初设计者做此舍取,也是道理的,
若一定要所有状态同步,还要修改ip_vs_code.c内核源码才行哦。
测试方案二:(长连接)
a. 客户端访问VIP,输出正常。
b. 修改RealServer的默认路由,指向DirectorB的DIP。
c. 客户端访问VIP,输出正常。
总结:
有了上一场景的经验,此次考虑已存在状态的连接。
1) Realserver 启动守护进程
nc -l 80
2) Client 访问
telnet VIP 80
经过上述两步,此时长连接已经建立。随便输入一些字符串,两端都可以看到。
3) RealServer 默认路由修改
route del default gw 192.168.0.254
route add default gw 192.168.0.253
此时在客户端在输入一些字符串,会发现RealServer仍然输出正常。
最后,使用tcpdump抓包确认回路数据包是从另一个网关通过。
注:通过此次验证,可以明确的是,地址转换后,并非一定要原路返回,只要条件成熟是可以异步的。
页:
[1]