私には 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 構成で何かが欠けているのでしょうか?