将 UDP 广播转发到另一个 IP

将 UDP 广播转发到另一个 IP

我在我的 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
    }
}

其他资源:

相关内容