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


93

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

回答:


21

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

まず、プロセスで使用されているプロトコルとポートを把握する必要があります(前のコメントのnetstatコマンドはうまく機能します)。

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


6
簡単な接続の場合、これは可能ですが、DNS、HTTPなどを追跡する必要があります。これらはすべて急いでいるため、使用netstat中のマシンで単純なネットワークキャプチャフィルタを使用するだけの簡単な方法はありません。
キーズクック

OK、HTTPおよびDNSパブリックポートは多くのアプリケーションで使用されていますが、対応するプライベートポートは一意です。では、なぜプライベートポートでフィルタリングしてみませんか?
OpenNingia

なぜなら、急速な小さなリクエストは見られないからnetstatです。存続期間の長い接続のみをキャッチできます。:(
キーズクック

プロセスは、あなたが静的ポートフィルタを使用することができるようにするつもりはない、その後、実行時に動的ポートを使用している場合にどのような
Unixの用務員

残念ながら、ネットワークスニッフィングツールはネットスタックの最下位レベルで動作し、すべてをキャッチしようとしますが、OS上で実行されているプロセスをまったく認識していません。特定のコールの発信元を見つけることは非常に困難です。パケットスニファーは最終的に(ポート番号を介して)プロセスIDを把握できますが、どのプロセスがDNSルックアップを行ったのかは完全に独立しているためわかりません(これはおそらく、呼び出しをトリガーしたカーネルネットスタックです)。しかし、他のプロセスをフィルタリングして停止すると、目標を達成できるはずです。
ホイヘンス

135

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

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を取得します

2
これは、rootアクセスや特別な許可なしで使用できるため便利です(とにかく、一部のLinuxディストリビューションでは、Ubuntuでは特別な許可が必要な場合があります)。
ロビングリーン

1
これは、すでに起動されているプロセスに対して実行でき、事実上すべてのLinuxボックスで使用できるため、便利です。
zakmck

53

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

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


4
素晴らしいアイデアですが、「制限」に注意してください。これは別のネームスペースであるため、ループバックアドレスまたはUNIXドメインソケットを使用してデフォルトのネームスペース内のローカルプロセスと通信することはできません。後者は、D-Busを介した通信に影響します。
-Lekensteyn

@Lekensteynは、ネットワーク名前空間にまたがってUNIXドメインソケットを使用できます。ファイルシステムはそれらによって隔離されていません。
-randunel

1
@randunel私はそれについてもっと正確にすべきでした。私が言いたいのは、「ファイルシステムを使用しない」「抽象ソケット名前空間」内のUnixドメインソケットは、ネットワーク名前空間間で直接アクセスできないということです。回避策として、などのプロキシsocat使用できます
-Lekensteyn

--to-source引数に使用するIPアドレスは何iptablesですか?これは、-oオプションに渡すインターフェイスのIPアドレス、構成するIPアドレス、または???です。私は必要ありませんマスカレードバージョンを試してみました--to-sourceここで説明したように、それは働きました!
NTC2

3
これらはすべて、ルートアクセスを必要とするようです。
-simplegamer

15
netstat -taucp | grep <pid or process name>

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


8
これにより、その瞬間に存在する接続が表示されますが、トラフィック自体のログは提供されません。
キーズクック

1
Kees Cookのコメントについてはわかりません。簡単なnetstatは、接続に関する情報を一瞬表示しますが、フラグ-cを使用すると、その状態のスナップショットを毎秒取得できます(「man netstat」を参照)。たぶん、すべてのトラフィックを持っているわけではありませんが、接続の一意のスナップショットではありません。
tremendows

3
まあ、私は確信しています。これは、プロセスのすべてのネットワークトラフィックをキャプチャするわけではありません
Reinierポスト

これは、内部ファイアウォールによってブロックされているポート番号を把握するのに役立ちました。私が実行していたコマンドによって送信されているTCP SYN(宛先アドレスとポート番号とともに)が示されました。
アンソニーゲゲガン

11

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

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

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

force_bind特定のIPまたはポート、あるいはその両方でバインディングを強制できます。IPv4とIPv6の両方で機能します


ほとんどのアプリケーションはソースIPの指定をサポートしていませんが、実際にはCLONE_NEWNSではなくCLONE_NEWNETでコンテナーを使用することで可能になる場合があります。
キーズクック

または、ネットワーク名前空間を作成し、その中でアプリを実行できますwww.evolware.org/?p=293
Flint

9

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

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


6

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

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


それはクールですが、それを取得して使用する方法の詳細を含めるといいと思います:)
Zanna

ありがとう!使用方法と例、およびダウンロード手順が記載されたREADME.mdファイルを保持するgithubリポジトリへのリンクを提供しました!
ジョナスダニエルソン

5

これは汚いハックですが、特定の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ターゲットは、パケットにフラグを立てて、特定のタグ付きパケットをnetlinkソケットを介して選択したプロセスに送信する場合に便利です。それがwiresharkと特定のユーザーとして実行されている特定のアプリケーションで何かをハッキングするのに役立つのだろうか?


ただし、これは発信に対してのみ機能します。着信についてはどうでしょうか。
resultsway

5

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

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


1
すてきなプロジェクトですが、...「Tracedumpは現在32ビットLinuxホストでのみ実行されます」が残念ながらそれを殺します。
gertvdijk 14

4

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

strace ping www.askubuntu.com

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

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


「-e trace = network」を追加すると、実際にネットワークに書き込まれたデータを失うことを犠牲にして、出力の一部が削除されます。「開いているソケットの数」などにだけ気をつければ、これは物事を簡単にします。
ダニーザウアー

3

上のビルのioerrorによって答え私はあなたが使用することができます疑うiptables --uid-ownerトラフィック上のマーカーを設定し、その後、あなたはそのマーカーでのみトラフィックをキャプチャするのwiresharkを求めることができます。DSCP(差分サービスマーカー)、フローID、またはQoSマーカーを使用できる場合があります。

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



-1

おそらくiptablesとulogは機能しますか?私は、正確なレシピがありますが、私はないということだと思う iptablesのは、かつてあなたがULOG使用することができます一致、プロセスを一致させることができます。


3
残念ながら、iptables -m owner --pid-owner $PIDLinux 2.6.14で削除されました:ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook

-1

netstatの実行とテキストファイルへのログ記録をループするシェルスクリプトを作成できると思います。次のようなもの(非常に大まかな手順):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

私はプログラマーではないので、これを改良することはできません。しかし、ここで誰かが私が中断したところから始めて、あなたのために動くスクリプトを作成することができます。


十分じゃない。問題は、チェックするときにアクティブになっているものだけでなく、すべてのネットワークトラフィックをキャプチャすることです。
Reinierポスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.