我有两台独立的 Linux 计算机 A 和 B,它们需要通过端口 3000 上的 UDP 进行通信。它们各自位于不同的路由器后面,并且我在每个路由器上设置了端口转发规则。
由于某种原因,B 能够从 A 接收 UDP 数据包的唯一方法是 B 先向 A 发送数据包。
工作案例:
# Computer A Listens (IP 1.2.3.4)
netcat -ul 3000
# Computer B Initiates
netcat -u 1.2.3.4 3000
在上述情况下,两者通过 netcat“连接”,我可以双向发送和接收数据。这使我相信这不是端口转发或路由问题。
破损案例:
# Computer B Listens (IP 5.6.7.8)
netcat -ul 3000
# Computer A Initiates
netcat -u 5.6.7.8 3000
在这种不正常的情况下,两者无法通过 netcat “连接”,并且我无法在任一端点之间发送任何数据。
我也尝试过使用直接数据包发送工具在 A 和 B 之间发送 UDP 数据包。发生了同样的事情,B 无法从 A 接收任何内容,直到 B 向 A 发送数据包之后。
我不知道为什么会发生这样的事情,尤其是使用 UDP 时。您知道是什么原因导致此问题吗?
编辑
检查了 B 上的端口转发。这是当前的 iptables 配置:
$iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT udp -- anywhere anywhere udp dpt:3000 to:192.168.3.2:3000
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE 0 -- anywhere anywhere
$iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT 0 -- anywhere anywhere
ACCEPT udp -- anywhere 192.168.3.2 udp dpt:3000
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的 iptables 配置中是否缺少某些内容,无法正确将 anywhere:3000 转发到 UDP 的 192.168.3.2:3000?