我的接口(interface) eth0 设置为 168.152.32.222,网络掩码为 255.255.255.0。
我的服务器应用程序现在想要接收 eth0 上具有以下目标地址的 UDP 数据报:
- 168.152.32.222
- 168.152.32.255
- 255.255.255.255
这似乎是一个相当合理的请求,但我无法正确绑定(bind)套接字。
- 如果我绑定(bind)到 168.152.32.222,我将不会收到广播。
- 如果我绑定(bind)到 INADDR_ANY,我会从所有接口(interface)获取数据报。
- 如果我绑定(bind)到 INADDR_ANY 和 SO_BINDTODEVICE,我会收到到达不同子网 eth0 的数据包,例如 168.152.47.x。
理论上,我可以接受数据报,然后再次使用网络掩码自行过滤掉所有错误的数据包 - 但认真地说,某些较低层应该这样做,这在某种程度上就是网络掩码的要点。
如何不接收错误子网的 UDP 数据报但仍然广播?
服务器应用程序之外的解决方案也是可以接受的。我正在考虑使用 iptables 过滤数据包,但不确定这是否可行,这将是最后的手段。
最佳答案
在你的应用服务器上,如果你不关心其他udp数据包,你可以像这样设置iptables规则:
iptables -F # flush filter rules
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 162.152.32.222/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 162.152.32.222 host
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 255.255.255.255/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 255.255.255.255/32 broadcast address
iptables -A INPUT -p udp -s 168.152.32.0/24 -d 168.152.32.255/32 -j ACCEPT # accept udp packets from 168.152.32.0/24 network to 168.152.32.255/32 broadcast address
iptables -A INPUT -p udp -j DROP # drop all other incoming udp packets
或者您应该考虑接受所有广播的数据包,然后在代码中手动过滤网络的 src 地址。您的网络规模较小,可能使用 IP_ADD_SOURCE_MEMBERSHIP 过滤 setsockopt 选项就足够了。
关于c - 如何不接收错误子网的 UDP 数据报但仍然广播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863475/