一、问题描述
某次Horizon环境中,某租户内网需要与某业务主机集成,租户内网主机A访问业务主机B,端口5703和http都正常,但外网telnet和http访问均异常,抓包分析,发现只有SYNSENT 请求可达,但无ACk+SYN确认连接响应。
案例参考:linux系统收到SYN但不回SYN+ACK。
二、问题分析:
1)NSX-edge上测试NAT映射有效性,排除映射端口策略不生效问题;
2)内网地址telnet 内网IP 5703 ,确认端口可达,即目标主机网络可访问,应该不会出现防火墙问题,结合本机检查iptables和firewalld和selinux状态,均正常,排除本地安全因素干扰;
3)NSX-V 上抓包业务主机B网络接口,流量分析发现如下所示:
内网测试如下:
4)当然也可以server端使用:tcpdump -n -vv -i eth0 tcp port 5703进行抓包而后wireshark分析。同时确认当前SYN_RECV连接数是否超限;
5)server端执行:netstat -s |grep reject,查看是否有连接拒绝情况;确认访问的系统的文件描述符等资源是否正常;
6)查看系统内核参数:
确认net.ipv4.tcp_timestamps和net.ipv4.tcp_tw_recycle是否为0,即禁用。否知执行:
sysctl -w net.ipv4.tcp_timestamps=0 //tcp_timestamps的本质是记录数据包的发送时间
sysctl -w net.ipv4.tcp_tw_recycle=0或echo “0” > /proc/sys/net/ipv4/tcp_tw_recycle
现场检查正常。
说明:在linux kernel中cp_tw_recycle/tcp_timestamps都开启的条件下,60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。在tcp_tw_recycle和tcp_timestamps同时开启的条件下,timestamp大的主机访问serverN成功,而timestmap小的主机访问失败。timestamp时间为系统启动到当前的时间,外部访问进来时会因timestamp不同导致访问拒绝。timestamps一个双向的选项,当一方不开启时,两方都将停用timestamps。比如client端发送的SYN包中带有timestamp选项,但server端并没有开启该选项。则回复的SYN-ACK将不带timestamp选项,同时client后续回复的