抓包分析LVS-NAT中出现的SYN_RECV

CIP:192.168.10.193

VIP:192.168.10.152:8000

DIP:100.10.8.152:8000

RIP:100.10.8.101:8000 和 100.10.8.102:8000

 

从CIP到RIP的TCP连接,总是超时。

在Director上看到,lvs已经把来着client的消息转发,但状态是SYN_RECV

===================

# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:58 SYN_RECV 192.168.10.193:45346 192.168.10.152:8000 100.10.8.102:8000

==================

抓包分析一下:

realserver抓包,看到realserver已经收到了director转发的syn,而且在第一时间返回了syn ack。这是没有问题的。

client抓包,看到client收到了syn ack,但是地址却是RIP。按照LVS-NAT的原理,在经过director之后,应该把RIP转换为VIP才对。

所以clinet虽然收到了syn ack,但无法和之前发送给VIP的syn配对起来,因此client一直处在等待VIP回复syn ack的状态。

之后检查了网络,发现从RIP到CIP存在多条路由,syn ack没有经过director就路由到了CIP。

解决方案:删除多条路由,将dip作为realserver的网关。

 

完成上述操作之后,发现lvs状态仍然是SYN_RECV。抓包后的pcap文件中,没有syn ack。于是想到是不是在什么地方丢掉了。

看到官方文档中有描述要设置re_ filter。

查了一下这个参数的解释

======================================

rp_filter参数有三个值,0、1、2,具体含义:

  • 0:不开启源地址校验。
  • 1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
  • 2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

=======================================

default的值是1,这里改为2

echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter

echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter

systemctl restart network.service

 

再次尝试,succeed

 

posted @ 2018-05-22 15:08  他山之小石头  阅读(3452)  评论(0编辑  收藏  举报