web-dev-qa-db-ja.com

単一プロセスのネットワークトラフィックをキャプチャするにはどうすればよいですか?

単一のプロセスで処理されているネットワークトラフィックを調べたいのですが、このようなビジーなシステム(他の多くのトラフィックが同時に発生している)を扱っているため、単純なネットワークキャプチャは機能しません。 tcpdumpまたはwiresharkキャプチャを特定の単一プロセスのネットワークトラフィックに分離する方法はありますか? (netstatを使用するだけでは不十分です。)

88
Kees Cook

実際、 Wireshark フィルターを使用する方法があります。ただし、プロセス名またはPIDで直接フィルタリングすることはできません(ネットワーク数量ではないため)。

最初に、プロセスで使用されるプロトコルとポートを把握する必要があります(前のコメントの netstat コマンドが適切に機能します)。

次に、Wiresharkを使用して、受信(または送信)ポートを取得したポートでフィルタリングします。これにより、プロセスの着信トラフィックと発信トラフィックが分離されます。

20
OpenNingia

新しいプロセスを開始して監視するには:

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を受け取ります
127
Clausi

私はこのスレッドが少し古いことを知っていますが、これはあなたの一部を助けるかもしれないと思います:

カーネルで許可されている場合、単一のプロセスのネットワークトラフィックのキャプチャは、分離されたネットワーク名前空間で上記のプロセスを実行し、上記の名前空間でも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インターフェイスを監視する必要があります。

52
felahdab
netstat -taucp | grep <pid or process name>

使用されているポートを含め、アプリケーションが確立している接続が表示されます。

15
Oli

アイデア:アプリケーションを別のIPアドレスにバインドすることは可能ですか?その場合、通常の容疑者を使用できます( tcpdump など)

別のIPアドレスにバインドできないアプリケーション用のツール:

http://freshmeat.net/projects/fixsrcip

fixsrcipは、発信TCPおよびUDPクライアントソケット( IPv4 )をマルチホームホストの特定のソースIPアドレスにバインドするためのツールです

http://freshmeat.net/projects/force_bind

force_bindを使用すると、特定のIPやポートに強制的にバインドできます。 IPv4と IPv6 の両方で動作します。

10
Clausi

私は同様の問題に遭遇し、 ここで -に記載されているように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つのプロセスからトラフィックを分離してキャプチャしました。

誰にでも役立つ場合に備えて、ただ投稿したかっただけです。

9
szymon

Felahdabによる上記のすばらしい回答で説明されていることを行うCアプリケーションを作成しました。

こちらをご覧ください: nsntrace github repo

6

Tracedumpを試すことができます- http://mutrics.iitis.pl/tracedump

それはまさにあなたが望むことをします、あなたはそれにプロセスIDまたは実行するプログラムを与えることができます。

5
pjf

これは汚いハックですが、特定の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と特定のユーザーとして実行されている特定のアプリケーションで何かをハッキングするのに役立つのだろうか?

5
ioerror

興味のあるプロセスを strace の下で実行してみてください:

strace ping www.askubuntu.com

プロセスの実行内容に関する非常に詳細な情報を提供します。プロセスは任意のポートを任意の場所に開くことができるため、事前定義されたフィルターを使用すると、何かを見逃す場合があります。

もう1つのアプローチは、ネットワーク上で機能を削減した仮想マシンまたはテストマシンを使用し、その上でプロセスを分離して配置することです。次に、 Wireshark を使用して、そのマシンからすべてをキャッチできます。キャプチャするトラフィックが関連するものであると確信できます。

4

構築 ioerrorによる答えiptables --uid-ownerを使用してトラフィックにマーカーを設定し、wiresharkにそのマーカーでトラフィックのみをキャプチャするように依頼できると思います。 DSCP(差分サービスマーカー)、フローID、またはQoSマーカーを使用できる場合があります。

または、実際にこれを使用して、これらのパケットを別のインターフェイスに送信し、そのインターフェイスでのみキャプチャできます。

3
poolie

wiresharkバグ#1184 はこの機能です。まだ実装されていません。
ユーザーからコピー ask.wireshark.orgのcmanynard

2