AとBの間のUDPは、Bが最初にパケットを送信した場合にのみ機能します。

AとBの間のUDPは、Bが最初にパケットを送信した場合にのみ機能します。

私には 2 台の 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

上記の場合、2 つは netcat 経由で「接続」され、双方向でデータを送受信できます。このことから、これはポート転送やルーティングの問題ではないと考えられます。

壊れたケース:

# Computer B Listens (IP 5.6.7.8)
netcat -ul 3000

# Computer A Initiates
netcat -u 5.6.7.8 3000

この壊れたケースでは、2 つは 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 

UDP の anywhere:3000 から 192.168.3.2:3000 への適切な転送のために、iptables 構成で何かが欠けているのでしょうか?

関連情報