启用时间戳后,对某些SYN数据包无响应


9

我有一个TCP服务器正在运行Ubuntu 12.04.3(内核3.8.0-31-通用)的机器(“服务器”)上侦听。它从2个不同的客户端计算机接收连接。机器A运行Ubuntu 12.04.4(3.11.0-17-generic),机器B运行Ubuntu 11.10(3.0.0-32-server)。

如果在服务器上启用了TCP时间戳(sysctl net.ipv4.tcp_timestamps = 1),则有时会“忽略”来自计算机A的SYN数据包。在服务器上使用tcpdump(处于非混杂模式),我可以看到SYN到达OK并具有正确的校验和-没有响应-没有SYN / ACK和RST。机器A在放弃前多次重传SYN。在计算机A(在本例中为wget)上运行的客户端软件会立即通过新连接重试并成功,并获得即时SYN / ACK。

机器B在同一台服务器上没有问题,并且流量看起来很正常-它也使用了与机器A相同的TCP选项(从捕获文件中可以看到)。在服务器上禁用TCP时间戳可使一切正常运行。

但是,对我来说,被忽略的SYN数据包中的时间戳似乎是有效的,因此我不确定它们为什么会引起问题,或者根本不是它们的根本原因。

我在这里放了一个匿名的pcap https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap。它在服务器(10.76.0.74)上显示机器A(10.4.0.76)成功执行HTTP GET(数据包1至10),然后在1秒后尝试再次获取同一URL(数据包11至17),但取而代之忽略了其SYN。数据包18到27是另一个成功。

我怀疑这与“ 为什么服务器不发送SYN / ACK数据包来响应SYN数据包 ” 中描述的问题类似,并且禁用时间戳是一种解决方法,我想了解发生了什么。这只是一个错误吗?

没有运行本地防火墙。该服务器可处理许多TCP连接(任何时候大约32K),但具有大量的可用内存/ CPU。在pcap中显示的测试时,机器A与服务器之间没有其他TCP连接。没有迹象表明服务器应用程序的接受队列突然装满了(这可能会影响我假定的两个客户端)。由于数据包在服务器上的pcap中看起来不错,因此似乎没有中间的网络设备在破坏事物。

我最初将其发布在ubuntu论坛上,但事后看来,这可能是一个更合适的位置。希望借到一个线索。

Answers:


5

就我而言,以下命令解决了Linux服务器缺少SYN / ACK答复的问题:

sysctl -w net.ipv4.tcp_tw_recycle=0

我认为这比禁用TCP时间戳更为正确,因为TCP时间戳毕竟很有用(PAWS,窗口缩放等)。

该文档上tcp_tw_recycle明确指出不建议启用它,因为许多NAT路由器会保留时间戳,因此PAWS也将启动,因为来自同一IP的时间戳不一致。

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.

有问题的机器都已升级,我相信问题不再发生,所以我现在不能尝试。但是,在这种情况下,客户端和服务器之间不涉及NAT。在我看来还是可疑的虫子。
user133831
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.