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

时间:2015-09-30 10:13:19

标签: c linux sockets udp posix

我的接口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
  4. 这似乎是一个相当合理的请求,但我无法正确绑定套接字。

    • 如果我绑定到168.152.32.222,我就不会收到广播。
    • 如果我绑定到INADDR_ANY,我会从所有接口获取数据报。
    • 如果我绑定到INADDR_ANY和SO_BINDTODEVICE,我会收到针对不同子网的eth0的数据包,例如168.152.47.x。

    理论上,我可以接受数据报,然后再次使用网络掩码自行过滤掉所有错误的数据包 - 但严重的是,某些较低层应该这样做,这在某种程度上是网络掩码的重点。

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

    服务器应用程序之外的解决方案也是可以接受的。我正在考虑使用iptables过滤数据包,但不确定这是否可行,这将是最后的手段。

1 个答案:

答案 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选项就足够了。