程序在 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;