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. **网络硬件问题**: 虽然这种可能性较小,但也不能完全排除网络硬件或驱动问题。
希望这些步骤能帮助你诊断问题。如果上述所有步骤都无法解决问题,可能需要进一步深入研究网络配置和虚拟机设置。
1
cdoe 2023-05-12 12:53:41 +08:00 via Android
网卡 ip 有没有冲突
|
2
Pil0tXia 2023-05-12 13:05:51 +08:00
是 NAT 模式就换桥接模式试试,是桥接模式就换 NAT 模式试试。通过把服务器 A 复制成服务器 D 再测试的方式排除网关因素。
问题应该出在“A 服务器在重启后有几分钟是可以被 C 服务器访问的”,如果你不清楚具体原因,直接重新部署一个服务器 D 试试。 |
3
tony1016 2023-05-12 13:11:01 +08:00
那就去 C 服务器抓包啊
|
4
fuis 2023-05-12 13:16:00 +08:00
@jack778
看看是不是 A 的半连接队列满了 ``` netstat -s | grep -i "listen" ``` 另外请回帖打出来这两个参数的值 ``` sysctl net.ipv4.tcp_max_syn_backlog sysctl net.ipv4.tcp_syncookies ``` |
7
JamesR 2023-05-12 13:20:32 +08:00
需要楼主贴出宿主机,A ,B ,C 的 IP 地址,子网掩码,网关。
1.可能 A 或 C 的 IP 地址配置不正确。 2.可能宿主机有专门防火墙,需要配置宿主机上的防火墙,对虚拟机所有的 IP 地址放行。 3.C 有防火墙没有关闭或配置不正确。 |
8
MrGba2z 2023-05-12 13:21:43 +08:00
> A 服务器偏偏不响应 C 服务器的 tcp 握手请求,系统日志也没有异常
Nginx 有 C 无法访问时的 log 吗? |
9
fuis 2023-05-12 13:22:07 +08:00
然后还需要检查 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) |
10
jack778 OP @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 |
12
fuis 2023-05-12 13:29:48 +08:00
还有就是没开 tcp_tw_recycle 吧?
A 上运行 sysctl net.ipv4.tcp_tw_recycle 看看 |
14
iminto 2023-05-12 13:36:31 +08:00 1
看下两台服务器时间是否一致,不一致的话会受 tcp_tw_recycle 影响
|
15
jack778 OP @fuis
SyncDomainWithMembership = 1 ForwardBroadcasts = 0 IPEnableRouter = 0 UseDomainNameDevolution = 1 EnableICMPRedirect = 1 DeadGWDetectDefault = 1 DontAddDefaultGatewayDefault = 0 |
17
jack778 OP |
18
xyjincan 2023-05-12 13:41:05 +08:00
A 的 MAC 地址,IP 和网络内其他设备有冲突吧,检查一些这些设备 MAC,地址,扫描一下局域网
|
19
jack778 OP @JamesR 如果是防火墙或者 ip 问题就很奇怪,就偏偏 C 服务器不能访问 A 服务器,其他一切都正常呀。我也没有设置黑名单,防火墙都关了。
|
21
zhangsanfeng2012 2023-05-12 13:44:03 +08:00
ip 和路由表贴出来,网络问题不能靠猜
|
23
jack778 OP @xyjincan 怎么检查 A 服务器的 mac 地址和 ip 地址是否有冲突呢,如果是这个问题的话,为什么偏偏就是 C 不能访问 A ,其他一切正常,感觉还是有点想不通,因为 tcp 握手请求已经到达 A 服务器了,只是没有响应而已。
|
24
zbinlin 2023-05-12 13:53:55 +08:00 1
你都没列出它们的网络设置是怎样的
|
27
jack778 OP @zhangsanfeng2012 谢谢,解决了
|
28
jack778 OP 下面是 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`可以提高服务器的性能,但在很多情况下,都不建议启用这个选项,以免引发上述的问题。 ``` |
29
cxxlxx 2023-05-12 14:06:05 +08:00
和我之前遇到的一样,tcp_tw_recycle
|
30
fuis 2023-05-12 14:06:56 +08:00
|
32
yinmin 2023-05-12 15:18:06 +08:00
大概率:mac 地址冲突,或者局域网有 arp 欺骗。vmware 的虚拟机网卡配置里能看到 mac 地址。
|
33
liu1297528606 2023-05-13 22:22:34 +08:00 via Android
把机器的防火墙之类都卸载掉,分别去机器上抓包,对比正常和不正常的报文,所有网络问题,报文肯定会有差异,网络不通无非就是数据包在某个环节丢掉了
|
35
jack778 OP @liu1297528606 抓包可以,但是要查出原因还是有点麻烦
|