単一のプロセスで処理されているネットワークトラフィックを調べたいのですが、このようなビジーなシステム(他の多くのトラフィックが同時に発生している)を扱っているため、単純なネットワークキャプチャは機能しません。 tcpdump
またはwireshark
キャプチャを特定の単一プロセスのネットワークトラフィックに分離する方法はありますか? (netstat
を使用するだけでは不十分です。)
新しいプロセスを開始して監視するには:
strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
既知のPIDで既存のプロセスを監視するには:
strace -p $PID -f -e trace=network -s 10000
-f
は「新しいプロセスに従う」ためのものです-e
はフィルターを定義します-s
は、文字列の制限を32以上に設定します-p
は、接続するプロセスIDを受け取ります私はこのスレッドが少し古いことを知っていますが、これはあなたの一部を助けるかもしれないと思います:
カーネルで許可されている場合、単一のプロセスのネットワークトラフィックのキャプチャは、分離されたネットワーク名前空間で上記のプロセスを実行し、上記の名前空間でもwireshark(または他の標準のネットワークツール)を使用することで非常に簡単に実行できます。
セットアップは少し複雑に見えるかもしれませんが、一度理解して慣れると、作業が非常に楽になります。
そうするために:
テストネットワーク名前空間を作成します。
ip netns add test
一対の仮想ネットワークインターフェイス(veth-aおよびveth-b)を作成します。
ip link add veth-a type veth peer name veth-b
veth-aインターフェイスのアクティブなネームスペースを変更します。
ip link set veth-a netns test
仮想インターフェイスのIPアドレスを構成します。
ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
テスト名前空間でルーティングを構成します。
ip netns exec test route add default gw 192.168.163.254 dev veth-a
ip_forwardをアクティブにし、NATルールを確立して、作成したネームスペースから着信するトラフィックを転送します(ネットワークインターフェイスとSNAT IPアドレスを調整する必要があります)。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
(必要に応じてMASQUERADEルールを使用することもできます)
最後に、分析するプロセスを新しいネームスペースで実行できます。また、wiresharkも実行できます。
ip netns exec test thebinarytotest
ip netns exec test wireshark
Veth-aインターフェイスを監視する必要があります。
netstat -taucp | grep <pid or process name>
使用されているポートを含め、アプリケーションが確立している接続が表示されます。
アイデア:アプリケーションを別のIPアドレスにバインドすることは可能ですか?その場合、通常の容疑者を使用できます( tcpdump など)
別のIPアドレスにバインドできないアプリケーション用のツール:
http://freshmeat.net/projects/fixsrcip
fixsrcip
は、発信TCPおよびUDPクライアントソケット( IPv4 )をマルチホームホストの特定のソースIPアドレスにバインドするためのツールです
http://freshmeat.net/projects/force_bind
force_bind
を使用すると、特定のIPやポートに強制的にバインドできます。 IPv4と IPv6 の両方で動作します。
私は同様の問題に遭遇し、 ここで -に記載されているようにNFLOGを使用して ioerrorによるこの答え に基づいて整理することができました:
# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# dumpcap -i nflog:30 -w uid-1000.pcap
その後、他に何もしないユーザーアカウントから問題のプロセスを実行して作成できます。できれば、1つのプロセスからトラフィックを分離してキャプチャしました。
誰にでも役立つ場合に備えて、ただ投稿したかっただけです。
Felahdabによる上記のすばらしい回答で説明されていることを行うCアプリケーションを作成しました。
こちらをご覧ください: nsntrace github repo
Tracedumpを試すことができます- http://mutrics.iitis.pl/tracedump
それはまさにあなたが望むことをします、あなたはそれにプロセスIDまたは実行するプログラムを与えることができます。
これは汚いハックですが、特定のUIDのiptablesを使用した迂回またはログターゲットをお勧めします。例えば:
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG
また、そのログターゲットの「--log-tcp-sequence」、「-log-tcp-options」、「-log-ip-options」、「-log-uid」などを調べる価値があるかもしれません。それは、他の大量のデータを含むpcapをポストプロセスするのに役立つだけだと思いますが。
NFLOGターゲットは、パケットにフラグを立てて、特定のタグ付きパケットがネットリンクソケットを介して選択したプロセスに送信される場合に役立ちます。それがwiresharkと特定のユーザーとして実行されている特定のアプリケーションで何かをハッキングするのに役立つのだろうか?
構築 ioerrorによる答えiptables --uid-owner
を使用してトラフィックにマーカーを設定し、wiresharkにそのマーカーでトラフィックのみをキャプチャするように依頼できると思います。 DSCP(差分サービスマーカー)、フローID、またはQoSマーカーを使用できる場合があります。
または、実際にこれを使用して、これらのパケットを別のインターフェイスに送信し、そのインターフェイスでのみキャプチャできます。
wiresharkバグ#1184 はこの機能です。まだ実装されていません。
ユーザーからコピー ask.wireshark.orgのcmanynard