32rgl 发表于 2014-4-12 20:26:50

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]
查看完整版本: LVS NAT 状态同步之异步回包