为什么 tcpdump 可以看到 TAP 接口上的传入数据包,而 iptables 却看不到?

为什么 tcpdump 可以看到 TAP 接口上的传入数据包,而 iptables 却看不到?

程序在 Linux 上注入数据包轻敲接口(这些数据包来自虚拟机)。具体来说,这些是 DHCP 请求(因此它们是 UDP)。我可以看到带有 的数据包,tcpdump但看不到带有 的数据包iptables,并且它们也没有到达本地 DHCP 服务器。为什么不,我该如何解决这个问题?

更新:我尝试将 IP 数据包注入到接口地址tap0。我看到来自虚拟机的 ARP 请求tcpdump -i tap0,但网络层没有回复。如果我向虚拟机发送 ARP 请求,它会看到它们并回复主机(回复会显示,tcpdump但会丢失)。

另一个观察结果:ifconfig tap0显示对于注入到主机的每个数据包,TX 丢弃的数据包计数都会增加。为什么是德克萨斯州?

# ifconfig tap0
          TX packets:0 errors:0 dropped:958 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

长话短说:在 Linux 主机(运行 Ubuntu 10.04)上,我正在运行一个虚拟机,其中模拟以太网卡。它通过与帮助程序通信来实现这一点,该程序负责将以太网数据包注入和捕获到主机的网络堆栈上。虚拟机是一个ARM芯片仿真器,调用帮助程序nicserver;我所知道的就是在ARM 文档

我想在虚拟机和主机之间建立以太网链路,并在其之上建立 IP 链路。 VM 通过 DHCP 获取其 IP 地址。我不希望虚拟机与世界其他地方之间进行任何通信,只与主机进行通信,因此我创建了一个虚拟网络tap0接口

tunctl -u gilles
ifconfig tap0 192.168.56.1 netmask 255.255.255.0 up
nicserver -p 7801 -a tap0 &

现在我启动虚拟机,可以看到它正在发送 DHCP 请求tcpdump -n -i tap0 -vv(DHCP 客户端不会超时,我仅在此处显示一个示例请求):

tcpdump: listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
18:29:23.941574 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 576)
    0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from 02:52:56:47:50:03, length 548, xid 0x238a7979, secs 46, Flags [none] (0x0000)
          Client-Ethernet-Address 02:52:56:47:50:03 [|bootp]

我已在主机上设置 Dnsmasq 来处理请求,但它没有看到任何传入请求。 Dnsmasq 服务器甚至看不到传入的请求(我跟踪了它)。所以我尝试用 Iptables 观察数据包。 (显示所有过滤器/输入规则;没有 mangle 或 nat 规则)。

Chain INPUT (policy ACCEPT 2366K packets, 5334M bytes)
 pkts bytes target     prot opt in     out     source               destination 
  119 39176 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 LOG flags 4 level 4 prefix `[DHCP request] '
  119 39176 DROP       udp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           udp dpt:67
    2   490 LOG        udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0           LOG flags 4 level 4 prefix `[in=tap0] '
   26  6370 ACCEPT     udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
    0     0 ACCEPT     all  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
 3864  457K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0   

所有这些传入的 DHCP 请求都已开启eth1(我小心翼翼地不要忽略这些请求,以免激怒我的同事和网络管理员)。这些 UDP 数据包tap0来自本地 Samba 服务器。我用 tcpdump 看到的 DHCP 请求数据包似乎没有通过数据包过滤器!

tap0为什么我在with上看到传入的广播数据包,tcpdump但在 with 上却看不到iptables(也没有在机器上侦听的程序)?我需要修复什么才能看到这些数据包,就像它们来自以太网接口一样?

答案1

这是进一步的猜测。希望这对您有所帮助,但也可能是错误的。

tap0 有两端,内核网络栈端和程序接口端。在我看来,如果您使用 tap0 提供“nicserver”,它不会使用程序接口按照 Tap 设备的预期方式连接到它。相反,nicserver 只会从网络堆栈端写入,并且没有应用程序从程序接口端读取,最终将导致设备队列溢出。这解释了丢弃的数据包。此外,不会传送任何数据包,这可以解释 iptables 结果。

我想如果你让 tcpdump 在 tap0 上捕获,它实际上会附加到 tap0 的程序接口端,瞧,你会看到数据包。我在互联网上搜索,但没有找到证实这种行为的消息来源。要证伪这个理论,请捕获 tap0 并查看它如何影响数据包丢失和 iptables 日志。

最后,一个解决您最初问题的建议:使用环回设备怎么样?就像这样:

nicserver -p 7801 -a lo

答案2

iptable 桌子你正在打印的是筛选桌子。

筛选检查表匹配仅在做出路由决定后。

检查这个博客中的图: https://www.garron.me/en/linux/iptables-manual.html

检查其他表是否显示当您通过流量时数据包计数增加。

iptables -nvL -t raw;
iptables -nvL -t nat;
iptables -nvL -t mangle;

相关内容