NetcatでUDPを使用してOpenVPNサイト間接続をデバッグしています。
パケットを一方向(ホストA->ホストB)に流すことはできますが、逆方向に流すことはできません。
root@hosta:~# nc 10.0.3.2 1234 -u
root@hostb:~# nc -l 1234 -u
奇妙なことに、ホストAでtcpdump
を実行すると、実際にはホストBからUDPパケットが到着します。
root@hosta:~# tcpdump port 1234
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:36:04.695423 IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
17:36:06.484233 IP 10.0.3.2.1234 > hosta.46603: UDP, length 4
ただし、netcatは何も出力しません。 strace
でnc
を試しましたが、ソケットから何も受信されません。
これを診断するために他に何ができますか?
与えられたコマンドだけで、これは簡単だっただろう! NetcatのデフォルトはTCP、UDPの場合は-u
なしです。nc -lp 1234 -u
はポート1234でUDP接続をリッスンしますが、nc 10.0.3.2 1234
はTCP接続。
最終的にsent/rcvd統計が得られるので、両端のNetcatに-v -v
を追加することをお勧めします。この情報を追加し、使用していたコマンドを修正して、デバッグ条件が正しいことを確認してください。
また、tcpdump port 1234 -XX
を使用して、HEXおよびASCIIでこれらのパケットの内容を確認します。
ただし、tcpdump port 1234
の出力に基づいて、おそらくまだコマンドは正しいのですが、この間違いを少し試して、それをどのように知ることができるかを見てみましょう。
UDPパケットを受け取ったので
IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
IP 10.0.3.2.1234 > hosta.46603: UDP, length 4
TCPのようなパケットの代わりに
IP hosta.46603 > 10.0.3.2.1234: Flags [S], seq 1384271454, win 14600, options [mss 1460,sackOK,TS val 1969077197 ecr 0,nop,wscale 3], length 0
IP 10.0.3.2.1234 > hosta.46603: Flags [R.], seq 0, ack 1384271455, win 0, length 0
あなたがそれを持っていたと仮定しましょう:
root@hosta:~# nc 10.0.3.2 1234 -u
root@hostb:~# nc -lp 1234
しかし、この場合、あなたは最初のものだけを見たでしょう
IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
そして、他の方向へのUDPパケットはありませんでした!
次に、誤って両端で同じnc <IP> 1234 -u
を使用した場合、両方の回線がありますが、ポートは同じではありませんが、次のようになります。
IP hosta.46603 > 10.0.3.2.1234: UDP, length 4
IP 10.0.3.2.73644 > hosta.1234: UDP, length 4
また、ハードコードされたIPv4ヘッダーでチェックサムが間違っていたため、受信側で、tpcdumpとwiresharkがUDPパケットを報告したにもかかわらず、netcatがUDPパケットを無視していました。 tcpdumpは間違ったチェックサムにフラグを立て、wiresharkはそれを無視しました
応答は、この質問の応答と似ている可能性があります。 転送されたパケットはtcpdumpで表示されますが、アプリケーションでは受信されません
HostAはhostBとは異なるネットワークにありますか? hostBはhostAに戻りますか(hostAへのルートはありますか?ない場合は、net.ipv4.conf.*.rp_filter
が無効になっていますか?
HostBがhostAにルーティングしていない場合の解決策は、ルートを追加するか、rp_filter
(リバースパスフィルター)を無効にすることです。