同一个网站,有同事反映说打不开,他们用的有windows,mac,ubantu系统的,后面自己在虚机上装了个ubantu 16.04 LTS,发现访问这个网站也是不成功,用telnet 端口的方式测试也是超时,还以为是ubantu的系统设置的问题,改了网卡MTU,内核参数,DNS啥的,异常还是存在,此时是陷入了迷惑之中:
疑惑一:我物理本机可以正常访问,而虚拟机却不可以,也用centos(公网上的)测试过,没问题
疑惑二:我们周围几个都是可以的,其他的都是不行的
疑惑三:对网站的IP可以ping通,但是telnet,wget,curl等方式却超时
对于疑惑一,这让我感觉是不是ubantu的系统有问题,还是谷歌了好久,一无所获,直到我发现我一台centos的虚机也是访问不了,此时我从ubantu系统的方向转向了可以ping通但是telnet超时这个方向上,找到了这个帖子
https://2sitebbs.com/thread-1544-1-1.html
改了一下服务端的内核参数
在文件/etc/sysctl.conf增加
net.ipv4.tcp_timestamps = 0
sysctl -p
让内核参数立即生效!
问题马上解决了
原理:
问题出在了 tcp 三次握手,ping 的通 icmp ok ,http ssh mysql 都不 ok
经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开 web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。
只有客户端和服务端都开启时间戳的情况下,才会出现能ping通不能建立tcp三次握手的情况
在同一个内网的环境下,多人使用同一个公网IP进行上网,这样nat之后是大大增加了端口重复使用的概率,centos默认是开启了TCP/IP建立的timestamps,所以忽略syn导致TCP三次握手失败。