次のNetcatコマンドを実行して Wireshark でパケットを表示すると、UDPパケットの形式が正しくないと表示されます。
$ echo "this is a test" | nc -u 127.0.0.1 53
同様に、$ echo "this is a test" > /dev/udp/127.0.0.1/53
などのコマンドを使用すると、Wiresharkで「不正な形式のパケット」エラーが発生します。
Echoコマンドは、エラーなしでNetcatサーバーに送信/配信されます。しかし、これは私に不思議に思いました:エコーまたは他のいくつかのネイティブUnixツールを使用して適切なUDPパケットを手動で構築することは可能ですか?
私はDebianとmacOSを使用しています。
IPおよびUDPの観点から、パケットは完全に有効です。 Wiresharkの下部ペインでイーサネット/ IP/UDPのプロトコル詳細を展開すると、パケットが正常に解析されていることがわかります。
ただし、それがポート53に宛てられているため、WiresharkはそれをDNSパケットとして解析しようとしますが、実行できません(「this is a test」という文字列は RFC 1035 による有効なDNSリクエストではないため) =スペック)。
そのリンクの仕様に従うと、DNS要求として解析されたときに有効なパケットを構築できます。パケットを別のポートに送信すると、WiresharkはそれをDNS要求として解析しなくなり、そのため、その警告は表示されなくなります。
リダイレクションを使用して、それらをBashの特殊なエイリアスに送信できます。
Bashのマンページから:
/ dev/tcp/Host/port Hostが有効なホスト名またはインターネットアドレスであり、portが整数のポート番号またはサービス名である場合、bashは対応するTCPソケットを開こうとします。
/ dev/udp/Host/port Hostが有効なホスト名またはインターネットアドレスであり、portが整数のポート番号またはサービス名である場合、bashは対応するUDPソケットを開こうとします。
これにより、UDPパケットがポート8080の192.168.2.11に送信されます。
echo "This is a test" > /dev/udp/192.168.2.11/8080