web-dev-qa-db-ja.com

PIDごとにネットワークパケットをキャプチャするにはどうすればよいですか?

Linuxに「google chromeへ/からのすべてのインターネットパケットを表示する」または「PID 10275でtelnetプロセスとの間ですべてのインターネットパケットを表示する」ように依頼する簡単な方法を知っている人はいますか?

私はWiresharkまたはtcpdumpを使用して、すべてのTCPポート23に関連する会話を表示できます。これ以上誰もtelnetを使用しなくなりました。しかし、複雑なアプリケーションとの間のすべてのパケットをスニッフィングします。多くのポートを使用するのは便利なようです。

ポートやPID(またはプログラム名)などを確認するためのさまざまな方法を探るいくつかの関連する回答を見つけましたが、パケットについては何もしませんでした

しばらく前に誰かがこの回答に喜んでお金を払っていたようです:

NetHogs は、インターフェイスを介してトラフィックを作成しているプログラムをすばやく確認するのに役立ちますが、パケットをキャプチャする方法がありません。

21
Adam Monsen

直接tcpdumpではありませんが、ネットワークトラフィックに関する情報を提供できます。確認 https://bytefreaks.net/gnulinux/how-to-capture-all-network-traffic-of-a-single-process

strace -f -e trace=network -s 10000 <PROCESS WITH ARGUMENTS>;

プロセスが既に開始されていて、そのPIDがわかっている場合は、次のコードを使用できます1

strace -f -e trace=network -s 10000 -p <PID>;

別の代替案はより複雑で、ネットワーク名前空間を使用し、上記のリンクを確認するか、ツール nsntrace を使用しますが、どちらかは新しいプロセスでのみ機能し、既存のプロセスネットワーク名前空間を変更することはできません(AFAIK)

1
higuita

私は使うだろう lsof -iは、必要なアプリケーションに関連付けられているポート番号を取得します。コードは次のようになります。

 process = firefox 
 for _port in `lsof -i | grep $ process |カット-d '' -f18 |カット-d:-f2 |カット-d'- '-f1` 
 do 
 port = $ _ port 
 [["$ _port" == +([a-zA-Z])]] && port = `cat/etc/services | grep '^ $ _ port' |カット-d '' -f12 |カット-d '/' -f1 | uniq | head -n 1` 
 
 echo "tcpdump -w $ {port} .pcap port $ port&" 
 tcpdump -w $ {port} .pcap port $ port&
完了

コマンドの出力は、バージョン/ディストリビューションによって異なる場合があることに注意してください。したがって、スクリプトを使用する前に、適切なフィールドがカットされていることを確認することをお勧めします。

また、このスクリプトは後で開かれるポートを監視しません。そのため、定期的にポートをチェックする(watchのようなものを使用する)より複雑なスクリプトを検討します。

その後、tcpdumpプロセスをすべて強制終了することを忘れないでください。

1
Shayan Pooya

私の場合、syslogトラフィックをキャプチャしたかったのですが、rsyslogからのみです。 lsof -p $(pidof rsyslog)の下にはリスニングポートが1つしかなく、常にそれをソースポートとして使用していたため、次のコマンドを使用してパケットを取得できました。

tcpdump -i eth0 -A "Host 10.0.0.100 and dst port 514 and src port $(lsof -i 4 -a -p `pidof rsyslogd` | grep -Po '(?<=\*:)[0-9]*') and udp"

grepは肯定後読みアサーション を使用して、*:ポート番号をポート番号だけに変換します。

1
Greg Bray