amy_888 发表于 2015-9-5 10:47:18

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 状态同步之异步回包