我的接口eth0设置为168.152.32.222,网络掩码为255.255.255.0。
我的服务器应用程序想要在eth0上使用以下目标地址接收UDP数据报:
这似乎是一个相当合理的请求,但我无法正确绑定套接字。
理论上,我可以接受数据报,然后再次使用网络掩码自行过滤掉所有错误的数据包 - 但严重的是,某些较低层应该这样做,这在某种程度上是网络掩码的重点。
如何不接收错误子网的UDP数据报但仍然广播?
服务器应用程序之外的解决方案也是可以接受的。我正在考虑使用iptables过滤数据包,但不确定这是否可行,这将是最后的手段。
答案 0 :(得分:2)
在您的应用程序服务器上,如果您不关心其他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选项就足够了。