web-dev-qa-db-ja.com

仮想インターフェイスでトラフィックをキャプチャするにはどうすればよいですか?

デバッグの目的で、Linux仮想インターフェイスのトラフィックをキャプチャしたいと思います。 vethtun、およびdummyインターフェースタイプを実験しています。 3つすべてで、tcpdumpが何かを表示するのに問題があります。

ここに私がダミーのインターフェースを設定する方法があります:

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up

1つのターミナルで、tcpdumpを使用して監視します。

tcpdump -i dummy10

すぐに、ncでそれをリッスンします:

nc -l 99.99.99.1 2048

3番目に、curlを使用してHTTPリクエストを作成します。

curl http://99.99.99.1:2048/

ターミナル2ではcurlリクエストからのデータを表示できますが、tcpdumpからは何も表示されません。

A Tun/Tap tutorial は、ローカルインターフェイスで動作しているときにカーネルが実際にパケットを送信しない場合がある状況を明確にします。

Tsharkの出力を見ると、何もわかりません。インターフェイスを通過するトラフィックはありません。これは正解です。インターフェイスのIPアドレスにpingを実行しているため、オペレーティングシステムは、パケットを「ネットワーク上」に送信する必要がないと正しく判断し、カーネル自体がこれらのpingに応答しています。考えてみれば、別のインターフェースのIPアドレス(たとえばeth0)にpingを実行した場合に何が起こるかということです。パケットは送信されません。これは当たり前のように聞こえるかもしれませんが、最初は混乱の元になるかもしれません(私にとっては)。

ただし、これがTCPデータパケットにどのように適用されるかを確認するのは困難です。

多分tcpdumpは別の方法でインターフェースにバインドされるべきですか?

12
solidsnack

トラフィックはloインターフェイスを経由します。

IPがボックスに追加されると、そのアドレスのルートが「ローカル」テーブルに追加されます。このテーブルのすべてのルートは、ループバックインターフェイスを介してトラフィックをルーティングします。

「ローカル」テーブルの内容は、次のようにして表示できます。

ip route show table local

私のシステムではこれは次のようになります:

local 10.230.134.38 dev tun0  proto kernel  scope Host  src 10.230.134.38 
broadcast 10.230.134.38 dev tun0  proto kernel  scope link  src 10.230.134.38 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope Host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope Host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.42.1 
local 172.17.42.1 dev docker0  proto kernel  scope Host  src 172.17.42.1 
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.42.1 
broadcast 192.168.0.0 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
local 192.168.0.20 dev enp6s0  proto kernel  scope Host  src 192.168.0.20 
broadcast 192.168.0.255 dev enp6s0  proto kernel  scope link  src 192.168.0.20 

基本的に、トラフィックを10.230.134.38127.0.0.0/8127.0.0.1(redundant)172.17.42.1、または192.168.0.20に送信すると、これらのIPが実際には別のインターフェイス上にある場合でも、トラフィックはループバックインターフェイス経由でルーティングされます。

8
Patrick

tcpdumpは、ホスト(tcpdump -i any ...

1
Charles nakhel

これは、2番目のシステム(VM)でもかまいません)を呼び出すことで可能になります。

DNATテーブルのOUTGOINGチェーンでnatを使用して、カーネルが制御しないインターフェイスにパケットをリダイレクトできます。それらをそこで反映する必要があります:

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
0
Hauke Laging