我的服务器(linode VPS)昨天突然开始对每个请求超时。
我对网络方面相当缺乏经验,并且很想学习调试这些连接问题的过程。
让我困惑的是,昨天,一些人(我的手机、我在家、朋友在家)可以持续访问该网站,并且我看到netstat
已建立连接。我禁用了防火墙,并将 iptables 设置为接受所有连接,以排除任何将我们的 IP 列入黑名单的奇怪自动规则。我不确定这是否相关,但来自本地网络的跟踪路由超时 - 来自外部某些机器的跟踪路由找到了我的服务器。
通过与正常运行的开发服务器上的设置进行比较,我确认各种设置都是正确的。
以下文件与我的开发环境匹配(除了各自的 IP 地址):
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/networking/interfaces
ifconfig
Apache 正在监听端口 80,并且设置看起来与我正在运行的服务器完全相同。
# server that doesn't work:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22008/apache2
tcp 0 0 69.164.201.172:80 71.56.137.10:57487 SYN_RECV -
# server that does work
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3334/apache2
tcp 0 0 72.14.189.46:80 71.56.137.10:57490 ESTABLISHED 20931/apache2
我尝试去理解
每次我加载页面一次,netstat -an | grep :80
就会显示所有处于 SYN_RECV 状态的连接。
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 69.164.201.172:80 71.56.137.10:56657 SYN_RECV
tcp 0 0 69.164.201.172:80 71.56.137.10:56669 SYN_RECV
tcp 0 0 69.164.201.172:80 71.56.137.10:56671 SYN_RECV
因此,这SYN_RECV
意味着服务器正在等待ACK
客户端发回。
如何调试是否发回了 ACK?如何调试此通信失败的位置?
当我尝试加载页面时,tcpdump 看起来是这样的。
在下面的粘贴中,我的服务器不断向客户端发送数据包,但没有得到响应。
这是什么意思?客户端没有收到响应?或者我在服务器的某个地方吞下了响应?我如何才能进一步缩小罪魁祸首的范围?
tcpdump -i eth0 -n -tttt port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2011-05-25 20:12:54.627417 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
2011-05-25 20:12:54.627512 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:54.814463 IP 69.164.201.172.80 > 71.56.137.10.57157: Flags [S.], seq 604630211, ack 496040070, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:55.214482 IP 69.164.201.172.80 > 71.56.137.10.57158: Flags [S.], seq 998358186, ack 2224730755, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:57.624737 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
2011-05-25 20:12:57.624793 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:59.014477 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:03.618790 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,nop,sackOK], length 0
2011-05-25 20:13:03.618866 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:05.014514 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:17.014504 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
tcpdump 用于功能服务器
查看我的功能服务器的 tcpdump 后,我确实看到服务器和客户端之间来回通信。
00:00:00.000000 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [S], seq 34114118s [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
00:00:00.000110 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [S.], seq 2454858 win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 5], length 0
00:00:00.061827 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [.], ack 1, win 100:00:00.004292 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [P.], seq 1:597, ngth 596
00:00:00.000074 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], ack 597, win00:00:00.493990 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], seq 1:2921, ngth 2920
00:00:00.000024 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [P.], seq 2921:30, length 98
00:00:00.065135 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [.], ack 3019, wi00:00:00.034766 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [P.], seq 597:12925, length 699
00:00:00.000035 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], ack 1296, wi00:00:00.000457 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [P.], seq 3019:328, length 211
00:00:00.019196 IP 71.56.137.10.57262 > 72.14.189.46.80: Flags [S], seq 10674886s [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
任何建议、解释或评论都将不胜感激,这样我就可以更多地了解 TCP,并希望下次我需要调试这样的问题时能更有用一些。
谢谢你!
答案1
在我这双疲惫的眼睛看来,问题服务器附近似乎存在某种路由问题。数据包沿着一条路径进入,但似乎从另一条路径离开,并且该路径上有某种有状态的东西,并丢弃了奇怪的“无 SYN 的 ACK”数据包。
我曾经遇到过这种情况。最终的结果是,服务器的网络掩码不正确,因此当来自子网外的流量进入时,它会发出 ARP 请求以获取节点的 MAC 地址。不幸的是,路由器和我们的负载均衡器都启用了 Proxy-ARP,并且负载均衡器的触发速度比路由器快一点。因此,SYN 数据包通过路由器进入,但试图通过负载均衡器离开子网。由于 LB 没有该 ACk 数据包的连接,因此它将其丢弃在地板上。
在您的情况下,一些明智的跟踪路由可能会阐明网络路径问题。从受影响的服务器,尝试跟踪路由到导致问题的 IP,并从相同的 IP 执行相同操作。如果您获得不同的路径,则可能就是问题所在。
答案2
我在使用 Javalin 作为服务器时遇到过类似的情况。
我没有使用任何防火墙,netstat 显示本地设备尝试以 SYN RECV 状态访问本地服务器,ping 无法到达本地服务器。
我已在本地机器上手动设置了 IPv4,取消该设置并将 IPv4 方法再次设置为自动 (DHCP) 即可。之后,我就能够从其他本地设备访问本地服务器了。
答案3
刚刚遇到了同样的问题。
就我而言,这是网络配置错误。
服务器配置为 10.0.1.111 255.255.254.0,客户端配置为 10.0.0.15 255.255.255.0。将客户端的网络掩码更改为 /23 解决了我的问题。
希望这能有所帮助。
关注 tcpdump