我遇到了一个奇怪的情况,其中 TCP 连接似乎没有到达监听套接字,这取决于源接口。
上下文:我正在尝试在特定主机 (AGENTIP) 上配置 Zabbix 代理。这涉及连接到 AGENTIP:10050 (tcp) 的 Zabbix 服务器 (SERVERIP)。在telnet AGENTIP 10050
AGENTIP 主机上运行时,tcp 连接似乎可以正常工作。但是,每当我从 Zabbix 服务器执行相同的命令时,连接都不会到达 zabbix-agent2 进程。我已经使用 strace 建立了这一点。tcpdump
显示数据包几乎相同:
工作(AGENTIP 连接到 AGENTIP:10050):
12:47:09.368585 lo In IP AGENTIP.36870 > AGENTIP.10050: Flags [S], seq 2114873310, win 65495, options [mss 65495,sackOK,TS val 973877732 ecr 0,nop,wscale 7], length 0
[pid 2456233] accept4(9, {sa_family=AF_INET, sin_port=htons(36870), sin_addr=inet_addr("AGENTIP")}, [112 => 16], SOCK_CLOEXEC|SOCK_NONBLOCK) = 11
不工作(SERVERIP 连接到 AGENTIP:10050):
12:48:05.298526 eth0 In IP SERVERIP.41580 > AGENTIP.10050: Flags [S], seq 2687217389, win 64240, options [mss 1460 ,sackOK,TS val 2072822359 ecr 0,nop,wscale 7], length 0
(nothing)
我看到的唯一显著差异是数据包到达的接口。但我不知道进程如何根据这个接口来选择它想要的数据包。
我已禁用 AGENTIP 上的防火墙 (ufw)。我尝试强制进程在 0.0.0.0 和 AGENTIP 上进行监听,但行为保持不变。
我不知道 tcp 连接到达(根据 tcpdump)和打开套接字(strace 提供有关该信息)之间是否有额外的步骤。我是否遗漏了什么?
答案1
该问题已通过在停机期间重新启动服务器得到解决。