以下是接口的配置:
# ifconfig virbr0 virbr0:标志=4355 mtu 1500 inet 192.168.11.1 网络掩码 255.255.255.255 广播 255.255.255.255 ether 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 显示 virbr0 13:virbr0@NONE:mtu 1500 qdisc 无队列状态 LOWERLAYERDOWN 模式 DEFAULT 链接/以太 52:54:00:99:e3:0d brd ff:ff:ff:ff:ff:ff
我可以 ping 通 192.168.11.1,建立 TCP 连接等,但 tcpdump 报告
捕获 0 个数据包 过滤器收到 0 个数据包 内核丢弃了 0 个数据包
更新
我发现,如果我将地址分配给 veth 接口,将其放在网络命名空间中,然后将 veth 对的另一端连接到 virbr 接口,则所有数据包都会显示在 virbr 接口的 tcpdump 上。然而,最初的问题仍然存在。
答案1
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