私のLinuxシステムに疑わしいプログラムがあり、DNSパケットの要求と応答を具体的にフィルタリングしたいと思います。
Wiresharkがあることを知っていますが、コマンドラインを好む。ここでは、主にDNSに関連する発信および着信パケットをフィルタリングできます。
この問題をどのように解決できますか?
答え1
tcpdump -i <interface name> -vv port 53
実行中のエントリに応じて、サーバーからすべてのDNSをキャプチャするために試しましたか?
Javaプログラムで使用するインタフェースまたはIPを設定できますか?可能であれば、tcpdumpにフィルタを使用してそのIPのみを制限できます。
インターフェイスに別のIPを追加する必要がある場合は、設定と一致するip add 192.168.55.55/32 dev eth0
ようにIPと開発名を変更してください。
インターフェイスを設定できる場合は、次の方法でプライベートVLANを作成することもできます。
ip link add link eth0 <name of link> type vlan id 10
設定に合わせてIDとインターフェースを変更してください。これにより、プログラムへの外部アクセスが必要な場合は、インターフェイスから現在のセッションを転送できますsysctl net.ipv4.conf.eth0.forwarding
。リンクのIPを/ 32アドレスに設定すると、転送は機能します。
リンクと同様に、Tapデバイスを追加すると、上記ip link add link eth0 <name of tap> type tap
の転送とIPアドレスも適用されます。
独自のIPまたはインターフェイスから取得できる場合は、次の手順を実行します。
独自のインターフェース:tcpdump -i <interface name> -n -p -vv port 53
-nはDNSルックアップを停止し、結果をより速く表示します。 -pはpromiscを停止します(tcpdumpのデフォルトモードでなくても、物理インターフェイスからのすべてのパケットを受信します)。最後に、-vvは詳細情報を表示するため、パケットデータを入力します。
独自のIP:tcpdump -i <interface name> -n -p port 53 host <ip address>
これは、ローカル設定に一致するJavaプログラムとインタフェースのIPです。
答え2
strace
最高の計画だろう。
プロセスがすでに実行されている場合は、ps aux
プロセスのpidを実行してインポートします。
その後実行strace -f -e trace=network -s 1500 -p <pid here>
-s 1500は、mtuが標準1500であると仮定し、パケット全体を印刷することです。大きなUDPパケットがある場合は-s 10000を使用できますが、DNSパケットの場合は1500で十分です。
プロセスが実行されていない場合は、次のようにします。strace -f -e trace=network -s 1500 cmd with arguments;