デバッグの目的で、Linux仮想インターフェイスのトラフィックをキャプチャしたいと思います。 veth
、tun
、および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
は別の方法でインターフェースにバインドされるべきですか?
トラフィックは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.38
、127.0.0.0/8
、127.0.0.1
(redundant)、172.17.42.1
、または192.168.0.20
に送信すると、これらのIPが実際には別のインターフェイス上にある場合でも、トラフィックはループバックインターフェイス経由でルーティングされます。
tcpdump
は、ホスト(tcpdump -i any ...
)
これは、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