一个很诡异的网络问题,我完全没有排查思路了

2023-05-12 12:34:15 +08:00
 jack778

环境(在 window server 上用 vmware 虚拟了 3 台服务器):

问题:

B 服务器可以正常访问 A 服务器上的 ningx 服务,宿主机也可以正常访问; C 服务器上虽可以 ping 通服务器 A ,但是 telnet A 服务器的 80 及所有已监听的端口都不通,在 A 服务器上通过 tcpdump 抓包也发现一直没有响应 C 服务器的 tcp 握手请求,C 服务器重试两次后放弃, 诡异的是在 A 服务器上可以正常访问 C 服务器上的服务,而且 A 服务器在重启后有几分钟是可以被 C 服务器访问的。

请问上面的问题如何排查原因,我想要知道为什么 A 服务器偏偏不响应 C 服务器的 tcp 握手请求,系统日志也没有异常,但是宿主机和 B 服务器是可以正常访问的,而且防火墙也关了。请各位大佬帮我分析分析大概是什么原因,并给出排查方法,谢谢了。

以下是 gpt4 给出的回复:

在这种情况下,我们需要检查多个可能导致此问题的因素。以下是一些建议:

1. **虚拟网络设置**: 检查 VMware 中的网络设置,确保服务器 C 的网络接口设置与服务器 A 和 B 的设置相同。VMware 有几种不同的网络选项,如 NAT ,桥接和主机模式,它们可能会导致不同的行为。

2. **IP 配置**: 检查服务器 A 、B 和 C 的 IP 地址设置,包括 IP 地址、子网掩码和网关,确保它们在同一网络段中。

3. **网络路由**: 在服务器 C 上运行`tracert`或`tracepath`命令( Windows 下为`tracert`,Linux 下为`tracepath`),看看数据包是如何从服务器 C 到服务器 A 的。这可能会揭示网络路由问题。

4. **防火墙设置**: 尽管你提到服务器 A 的防火墙已关闭,但还需要检查服务器 C 的防火墙设置,以及任何可能存在的网络级别的防火墙或安全组设置。

5. **服务监听**: 确认 Nginx 确实在监听来自所有 IP 地址的连接,而不仅仅是来自特定 IP 地址或网络接口的连接。你可以在服务器 A 上运行`netstat -tuln | grep 80`命令来查看。

6. **操作系统安全策略**: 检查服务器 A 和 C 的操作系统级别的安全策略,如 SELinux 或 AppArmor 等,确保它们没有阻止这种类型的连接。

7. **VMware 的安全策略**: VMware 也可能有一些安全策略可能阻止虚拟机之间的某些连接,这个也可以检查。

8. **网络硬件问题**: 虽然这种可能性较小,但也不能完全排除网络硬件或驱动问题。

希望这些步骤能帮助你诊断问题。如果上述所有步骤都无法解决问题,可能需要进一步深入研究网络配置和虚拟机设置。

4413 次点击
所在节点    Linux
35 条回复
zhangsanfeng2012
2023-05-12 13:44:03 +08:00
ip 和路由表贴出来,网络问题不能靠猜
fuis
2023-05-12 13:44:08 +08:00
@jack778 那你应该把 net.ipv4.tcp_tw_recycle 关掉
jack778
2023-05-12 13:44:31 +08:00
@xyjincan 怎么检查 A 服务器的 mac 地址和 ip 地址是否有冲突呢,如果是这个问题的话,为什么偏偏就是 C 不能访问 A ,其他一切正常,感觉还是有点想不通,因为 tcp 握手请求已经到达 A 服务器了,只是没有响应而已。
zbinlin
2023-05-12 13:53:55 +08:00
你都没列出它们的网络设置是怎样的
jack778
2023-05-12 13:56:04 +08:00
@fuis 关掉就好了,当初手贱设置了 linux 优化参数将其设置 1 了,哈哈
jack778
2023-05-12 13:57:40 +08:00
@iminto 谢谢,问题解决了
jack778
2023-05-12 14:03:41 +08:00
@zhangsanfeng2012 谢谢,解决了
jack778
2023-05-12 14:05:08 +08:00
下面是 gpt 的回复:
```
是的,将 `net.ipv4.tcp_tw_recycle` 设置为 1 可能会导致一些问题,尤其是在网络地址转换( NAT )环境中。这主要是因为`net.ipv4.tcp_tw_recycle`选项会启用一种快速 TIME-WAIT 套接字回收策略,这会影响 TCP 的时间戳。

当服务器和客户端之间的时间戳(这是 TCP 连接中的一部分)差距过大时(比如你提到的客户端时间慢了),如果开启了`net.ipv4.tcp_tw_recycle`,新的连接可能会被服务器错误地识别为旧的、已经关闭的连接的一部分,导致连接失败。

另外,对于来自同一 NAT 设备的多个客户端,由于它们从服务器看来都拥有相同的 IP 地址,所以在`net.ipv4.tcp_tw_recycle`启用的情况下,这些客户端可能会面临连接问题。这是因为这个设置会使服务器对同一 IP 地址的多个连接产生混淆,可能导致一些连接被提前关闭。

因此,尽管`net.ipv4.tcp_tw_recycle`可以提高服务器的性能,但在很多情况下,都不建议启用这个选项,以免引发上述的问题。
```
cxxlxx
2023-05-12 14:06:05 +08:00
和我之前遇到的一样,tcp_tw_recycle
fuis
2023-05-12 14:06:56 +08:00
jack778
2023-05-12 14:13:40 +08:00
@fuis 谢谢
yinmin
2023-05-12 15:18:06 +08:00
大概率:mac 地址冲突,或者局域网有 arp 欺骗。vmware 的虚拟机网卡配置里能看到 mac 地址。
liu1297528606
2023-05-13 22:22:34 +08:00
把机器的防火墙之类都卸载掉,分别去机器上抓包,对比正常和不正常的报文,所有网络问题,报文肯定会有差异,网络不通无非就是数据包在某个环节丢掉了
bjfane
2023-05-14 00:16:24 +08:00
@fuis 高手啊,牛 x
jack778
2023-05-14 01:11:47 +08:00
@liu1297528606 抓包可以,但是要查出原因还是有点麻烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/939473

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX