web-dev-qa-db-ja.com

どのプログラムがどのパケットをネットワークに送信したか

ポート番号を取得するだけでなく、特定のパケットを送信したプログラムを表示するtcpdumpのようなプログラムが欲しいのですが。これは、古いtcpdumpファイルがあり、どのプログラムがそのデータを送信していたかを見つける方法がない場合に、私が時々オンとオフを繰り返す一般的な問題です。

LinuxでUDPトラフィックを生成しているプロセスを特定する方法 の解決策は、auditd、dTrace、OProfile、またはSystemTapでこれを解決できることを示していますが、その方法は示していません。つまりbind()を呼び出すプログラムの送信元ポートは表示されません。

私が抱えていた問題は奇妙なUDPパケットでした。これらのポートは非​​常に短命であったため、この問題を解決するのにしばらく時間がかかりました。私はこれを次のような醜いハックを実行することで解決しました:

while true; date +%s.%N;netstat -panut;done

したがって、このハックよりも優れた方法、tcpdumpの代わり、またはカーネルからこの情報を取得してtcpdumpにパッチを適用できる方法のいずれかです。

auditdでこれを解決する

Sudo auditctl -a exit,always -F Arch=b64  -S bind -k BIND

これにより、/ var/log/audit /audit.logが次のような行で埋められます。

type=SYSCALL msg=audit(1292929028.845:3377): Arch=c000003e syscall=49 success=yes exit=0 a0=3 a1=808710 a2=10 a3=7fffab28ea10 items=0 ppid=1564 pid=24442 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="BIND"
type=SOCKADDR msg=audit(1292929028.845:3377): saddr=0200FFFF000000000000000000000000

次に、saddr = 0200xxxx00を解析します。ここで、xxxxはポート番号、0001が最小、FFFFが最大です。

編集:これはスーパーユーザーに尋ねられました 「プログラムがネットに送信するものを追跡する」 、しかし良い解決策はありません。

3
Erik Johansson

パケットを送信するプロセスに関する情報(ローカルマシンから発信された場合でも)は、カーネルのパケットキャプチャインターフェイスによって提供されないため、tcpdumpで利用できません... http:// www .tcpdump.org/pcap3_man.html

これを変更することは確かにかなり複雑なカーネルハッキングタスクです...

ソリューションに最も近いのは、iptableの「所有者」一致モジュールのようです。これは、ユーザーID(someLinuxバージョンのプロセスIDも)によるパケットの一致をサポートします。 、iircその機能は後で削除されました)、およびLOGターゲットの--log-uid(残念ながら--log-pidはありません)オプション。

したがって、次のようなiptablesルールを追加すると、次のようになります。iptables-I OUTPUT -p tcp --syn -j LOG --log-prefix "new tcp connection:" --log-uid

新しく確立されたすべての接続のログ(カーネルログ、別名dmesg)を送信元ポートとユーザーIDで取得するため、netstatをポーリングせずにユーザーへの接続のマップを取得できます...

3
r00t

同じ質問に対して この回答 を見てください。 auditdフレームワークを使用することをお勧めします。

1
Mr Shunz