Вот конфигурация интерфейса:

# 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: [email protected]:  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. Однако исходный вопрос все еще остается в силе.

answer

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