Вот конфигурация интерфейса:
# ifconfig virbr0 virbr0: flags=4355 mtu 1500 inet 192.168.11.1 netmask 255.255.255.255 broadcast 255.255.255.255 ether 52:54:00:99:e3:0d txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 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
Я могу пинговать, устанавливать TCP-соединения и т. Д. На 192.168.11.1, но tcpdump сообщает
0 packets captured 0 packets received by filter 0 packets dropped by kernel
ОБНОВИТЬ
Я обнаружил, что если я назначаю адрес интерфейсу veth, помещаю его в сетевое пространство имен, а затем присоединяю другой конец пары veth к интерфейсу virbr, все пакеты отображаются в tcpdump интерфейса virbr. Однако исходный вопрос все еще остается в силе.
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