web-dev-qa-db-ja.com

ブリッジインターフェイス(virbr)のtcpdumpは、そのアドレスの1つ宛てのパケットを受信しません

インターフェイスの構成は次のとおりです。

#ifconfig virbr0 
 virbr0:flags = 4355 mtu 1500 
 inet192.168.11.1ネットマスク255.255.255.255ブロードキャスト255.255.255.255 
イーサネット52:54:00:99 :e3:0d txqueuelen 0(イーサネット)
 RXパケット0バイト0(0.0 B)
 RXエラー0ドロップ0オーバーラン0フレーム0 
 TXパケット0バイト0(0.0 B )
 TXエラー0ドロップ0オーバーラン0キャリア0コリジョン0 
#ip link show virbr0 
 13:virbr0 @ NONE:mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT 
 link/ether 52:54:00:99:e3:0d brd ff:ff:ff:ff:ff:ff [.____]

192.168.11.1へのping、TCP接続など)を確立できますが、tcpdumpは報告します

 0パケットがキャプチャされました
 0パケットがフィルタによって受信されました
 0パケットがカーネルによってドロップされました

[〜#〜] update [〜#〜]

アドレスをvethインターフェイスに割り当て、それをネットワーク名前空間に配置してから、vethペアのもう一方の端をvirbrインターフェイスに接続すると、すべてのパケットがvirbrインターフェイスのtcpdumpに表示されることがわかりました。ただし、元の質問はまだ残っています。

2
A__A__0

tcpdumpは、パケットソケット[1]を開くことによってリンクレベルで動作します。インターフェイスの真下にあるため、ハードウェアからのインバウンドパケットと、インターフェイスからのアウトバウンドパケットをインターセプトします。カーネル内のそのインターフェイスにパケットを送信すると、パケットは宛先に到達し、インターフェイスを介して送信されません。好奇心旺盛な方のために、ここに関連するコードがあります[2]。

[1] http://man7.org/linux/man-pages/man7/packet.7.html
[2] https://github.com/the-tcpdump-group/libpcap/blob/master/pcap-linux.c#L3281

1
cdosborn