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

351 天前
 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. **网络硬件问题**: 虽然这种可能性较小,但也不能完全排除网络硬件或驱动问题。

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

4075 次点击
所在节点    Linux
35 条回复
cdoe
351 天前
网卡 ip 有没有冲突
Pil0tXia
351 天前
是 NAT 模式就换桥接模式试试,是桥接模式就换 NAT 模式试试。通过把服务器 A 复制成服务器 D 再测试的方式排除网关因素。
问题应该出在“A 服务器在重启后有几分钟是可以被 C 服务器访问的”,如果你不清楚具体原因,直接重新部署一个服务器 D 试试。
tony1016
351 天前
那就去 C 服务器抓包啊
fuis
351 天前
@jack778

看看是不是 A 的半连接队列满了

```
netstat -s | grep -i "listen"
```

另外请回帖打出来这两个参数的值

```
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_syncookies
```
jack778
351 天前
@tony1016 c 服务器抓包也是显示没有响应握手链接
jack778
351 天前
@cdoe 如果 ip 冲突了为啥其他服务器能正常访问,感觉应该不是
JamesR
351 天前
需要楼主贴出宿主机,A ,B ,C 的 IP 地址,子网掩码,网关。
1.可能 A 或 C 的 IP 地址配置不正确。
2.可能宿主机有专门防火墙,需要配置宿主机上的防火墙,对虚拟机所有的 IP 地址放行。
3.C 有防火墙没有关闭或配置不正确。
MrGba2z
351 天前
> A 服务器偏偏不响应 C 服务器的 tcp 握手请求,系统日志也没有异常

Nginx 有 C 无法访问时的 log 吗?
fuis
351 天前
然后还需要检查 Windows Server 上的这个值

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc938202(v=technet.10)
jack778
351 天前
@fuis
执行:netstat -s | grep -i "listen"
输出:187 SYNs to LISTEN sockets dropped

[root@localhost ~]# sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 262144
[root@localhost ~]# sysctl net.ipv4.tcp_syncookies
net.ipv4.tcp_syncookies = 1
jack778
351 天前
@MrGba2z 没有,还没有到 nginx
fuis
351 天前
还有就是没开 tcp_tw_recycle 吧?
A 上运行 sysctl net.ipv4.tcp_tw_recycle 看看
MrGba2z
351 天前
@jack778

> 宿主机和 B 服务器是可以正常访问的

也是用 telnet 的方式么?
iminto
351 天前
看下两台服务器时间是否一致,不一致的话会受 tcp_tw_recycle 影响
jack778
351 天前
@fuis
SyncDomainWithMembership = 1
ForwardBroadcasts = 0
IPEnableRouter = 0
UseDomainNameDevolution = 1
EnableICMPRedirect = 1
DeadGWDetectDefault = 1
DontAddDefaultGatewayDefault = 0
jack778
351 天前
@MrGba2z 是的,用 postman 可以联通接口
jack778
351 天前
@fuis net.ipv4.tcp_tw_recycle = 1 开了
B 服务器的时间比 A 服务器慢了 1 分钟,这个有影响吗
@iminto
xyjincan
351 天前
A 的 MAC 地址,IP 和网络内其他设备有冲突吧,检查一些这些设备 MAC,地址,扫描一下局域网
jack778
351 天前
@JamesR 如果是防火墙或者 ip 问题就很奇怪,就偏偏 C 服务器不能访问 A 服务器,其他一切都正常呀。我也没有设置黑名单,防火墙都关了。
iminto
351 天前
@jack778 有影响,要么关了 tcp_tw_recycle ,要么保证时间一致。

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

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

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

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

© 2021 V2EX