如何不接收错误子网的 UDP 数据报但仍然广播?

How to not receive UDP datagrams for the wrong subnet but still broadcasts?

我将接口 eth0 设置为 168.152.32.222,网络掩码为 255.255.255.0。

我的服务器应用程序现在想在 eth0 上接收具有以下目标地址的 UDP 数据报:

  1. 168.152.32.222
  2. 168.152.32.255
  3. 255.255.255.255

这似乎是一个相当合理的要求,但我无法正确绑定套接字。

理论上,我可以只接受数据报,然后再次使用网络掩码自行过滤掉所有错误的数据包 - 但说真的,一些较低的层应该这样做,这就是网络掩码的意义所在。

如何不接收错误子网的 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 选项进行过滤就足够了。