A 和 B 之间的 UDP 仅在 B 先发送数据包时才有效

A 和 B 之间的 UDP 仅在 B 先发送数据包时才有效

我有两台独立的 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?

相关内容