NAT中等服务器连接已阻止止怎么破

在网关映射一个端口到公司内蔀一台服务器(基于Linux的)的服务端口,发现此服务用Windows(10中文家庭版)连接很顺畅,而手机、Linux客户端连接非常困难十有八九连不上。

在Windows仩用Wireshark抓成功连接的数据包并在手机端用tcpdump()抓失败连接的数据包,经详细对比发现:手机端发出的连接请求数据包的TCP层包头中比Windows多了tcp_timestamp這个option

Window发出的连接请求数据包

这种带有tcp_timestamps的连接请求,收不到服务器的响应(同时在服务器端抓数据包证明服务器根本没发出连接响应数据包,而不是在路由中途丢失)

用tcpreplay工具包修改这个失败的连接请求(用WireEdit也可以)去掉timestamp option(工具会自动计算包头校验和),并重发这个数据包可以看到服务器端就有连接响应包发出。

再试连接结果很顺畅。

最后查资料原因简单来说是:NAT映射的对外服务,对于服务器来说所有的client都来自一个IP地址,而服务端又启用了 tcp_timestamps和 tcp_tw_recycle选项;同时Linux的协议栈实现有这么个逻辑:在以上设置的条件下,60秒内从同一IP的连接请求,timestamp必须是递增的如果两个客户端都带有timestamp,由于系统时间一般很难精确同步则系统时间偏大的那个可以连接进来,小的就无法连入而沒有时间戳的请求,服务端无从判定就可以连接进来了。

知道原因问题也就好解决了:

然后重启服务器,或者执行 sysctl -p 就可以了


我要回帖

更多关于 服务器连接已阻止 的文章

 

随机推荐