web-dev-qa-db-ja.com

tcpdumpに応答が表示されるのに、netcatには表示されないのはなぜですか

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は何も出力しません。 stracencを試しましたが、ソケットから何も受信されません。

これを診断するために他に何ができますか?

1
user410784

与えられたコマンドだけで、これは簡単だっただろう! 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
3
Esa Jokinen

また、ハードコードされたIPv4ヘッダーでチェックサムが間違っていたため、受信側で、tpcdumpとwiresharkがUDPパケットを報告したにもかかわらず、netcatがUDPパケットを無視していました。 tcpdumpは間違ったチェックサムにフラグを立て、wiresharkはそれを無視しました

0
whennig

応答は、この質問の応答と似ている可能性があります。 転送されたパケットはtcpdumpで表示されますが、アプリケーションでは受信されません

HostAはhostBとは異なるネットワークにありますか? hostBはhostAに戻りますか(hostAへのルートはありますか?ない場合は、net.ipv4.conf.*.rp_filterが無効になっていますか?

HostBがhostAにルーティングしていない場合の解決策は、ルートを追加するか、rp_filter(リバースパスフィルター)を無効にすることです。

0
i5513