我在我的 Raspberry Pi 上接收到 UDP 广播包wlan0
,我想将其转发到我的桌面进行分析eth0
。
我在跑修改后的 WiFi 固件在 上发送 UDP 数据包的 raspberrypi 上。我可以在 raspberrypi 上wlan0
使用以下方法捕获它们:tcpdump
root@raspberrypi:/home/pi# tcpdump -i wlan0 dst port 5500 -vv
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
07:13:15.368931 IP (tos 0x0, ttl 1, id 1, offset 0, flags [none], proto UDP (17), length 1070)
10.10.10.10.5500 > 255.255.255.255.5500: [no cksum] UDP, length 1042
07:13:15.470352 IP (tos 0x0, ttl 1, id 1, offset 0, flags [none], proto UDP (17), length 1070)
10.10.10.10.5500 > 255.255.255.255.5500: [no cksum] UDP, length 1042
07:13:15.573735 IP (tos 0x0, ttl 1, id 1, offset 0, flags [none], proto UDP (17), length 1070)
10.10.10.10.5500 > 255.255.255.255.5500: [no cksum] UDP, length 1042
07:13:15.675052 IP (tos 0x0, ttl 1, id 1, offset 0, flags [none], proto UDP (17), length 1070)
如您所见,它们是10.10.10.10:5500
发往 的UDP 数据包255.255.255.255:5500
。为了转发它们,我尝试使用 netfilter:
table ip nexmoncsi {
chain PRERT {
type nat hook prerouting priority dstnat; policy accept;
ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 dnat to IP-Desktop
}
chain POSTRT {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 snat to IP-Raspberrypi
}
}
我已经使用 sysctl 启用了 forarding
sysctl net.ipv4.ip_forward=1
sysctl net.ipv4.conf.eth0.forwarding=1
sysctl net.ipv4.conf.wlan0.forwarding=1
sysctl net.ipv4.conf.eth0.bc_forwarding=1
sysctl net.ipv4.conf.wlan0.bc_forwarding=1
我在桌面上运行了相同的tcpdump
命令来获取数据包,但是没有。tcpdump
在 pi 上仍然报告数据包,我猜如果它们被转发的话就不会发生这种情况。
我已经验证了匹配是正确的,并且 netfilter 可以count
在过滤器链中看到数据包。顺便说一句,当添加预路由和后路由链时,过滤器链中的计数将停止工作。
ufw
在桌面上已禁用,并且其上的 nft 规则集有空链且没有规则。是什么导致转发不起作用?
答案1
转发时忽略广播数据包。
它们被发送到路由器,然后路由器将它们广播到它知道的设备,但它们并不是为了被转发,尤其是不能跨子网/设备。
因此dnat
忽略了广播数据包。如果您的路由器将网络中的广播转发到互联网,互联网将充满来自世界各地的随机广播。
现在,要发送广播数据包,请复制数据包,并告诉它们您的设备是路由器。它们到达目标设备,目的是在子网内广播。
iptables -t mangle -A INPUT -i wlan0 -d 255.255.255.255 -j TEE --gateway IP-desktop
也可以使用目标网络的广播 IP 再次广播转发的数据包。更多信息请见此处:https://odi.ch/weblog/posting.php?posting=731
使用将其转换为 nftables iptables-restore-translate
,最终得到的结果如下:
sudo nft add table ip mangle
sudo nft 'add chain ip mangle INPUT { type filter hook input priority -150; policy accept; }'
sudo nft add rule ip mangle INPUT iifname "wlan0" ip protocol udp ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 counter dup to IP-desktop
我的 nftables 规则集是:
# sudo nft list ruleset
table ip mangle {
chain INPUT {
type filter hook input priority mangle; policy accept;
iifname "wlan0" ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 counter packets 4343 bytes 4647010 dup to IP-desktop
}
}
注意,目标 IP 地址仍为255.255.255.255
。可以更改此地址。mark
广播数据包,并在output
钩子中,用 标记破坏数据包的 IP 标头。
nft add table ip mangle
nft 'add chain ip mangle input { type filter hook input priority -150; policy accept; }'
nft 'add chain ip mangle output { type filter hook output priority 150; policy accept; }'
nft add rule ip mangle input iifname "wlan0" ip protocol udp ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 counter mark set 900 dup to IP-desktop device "eth0"
nft add rule ip mangle output oifname "eth0" meta mark 900 counter ip saddr set IP-source ip daddr set IP-desktop
# sudo nft list ruleset
table ip mangle {
chain input {
type filter hook input priority mangle; policy accept;
iifname "wlan0" ip saddr 10.10.10.10 ip daddr 255.255.255.255 udp sport 5500 udp dport 5500 counter packets 192445194 bytes 107384418252 meta mark set 0x00000384 dup to IP-desktop device "eth0"
}
chain output {
type filter hook output priority 150; policy accept;
oifname "eth0" meta mark 0x00000384 counter packets 192445135 bytes 107384385330 ip daddr set IP-desktop ip saddr set IP-source
}
}
其他资源: