Linux-app无法从169.254.x获取UDP消息.X(本地链路)

Linux-app does not get UDP messages from 169.254.x.x (local link)

本文关键字:消息 链路 UDP 获取 Linux-app      更新时间:2023-10-16

我的应用程序(用c++编写,运行在Ubuntu 9.10上)正在监听来自外部设备的UDP套接字广播消息。这些设备可以有任何IP地址,因为其思想是在IP范围之外进行通信。

当设备有IP地址,如99.99.1.2,1.2.3.4,0.0.0.1,192.168.2.77等,它工作正常(PC本身是192.168.1.110)。但是:当设备具有169.254.x时,它不起作用。x(本地链接块),应用程序不会得到消息。没有防火墙运行,且Wireshark 显示提示信息,说明连接正常。我假设问题在IP堆栈的某个地方(我打开设备/dev/eth2并获得套接字,所以没有什么特别的)。

有什么原因或解决方案吗?非常感谢。

确保eth2有一个IP地址和网络掩码,并且该IP地址和网络掩码使其与设备处于同一IP网络中。使用命令ifconfig查看这些详细信息。

看来我找到原因了。无论如何,感谢那些提出解决方案的人。

我没有提到我的Ubuntu是在VM中运行的(这基本上不是问题,因为Wireshark收到了消息)

接口有:eth2是我上面谈到的接口(因此,它通过广播进行外部通信)。它是一个"桥接"。

此外,我已经实现了一个内部"仅主机"网络接口eth4与其他虚拟机通信。

我还为eth2添加了一个"default"路由,否则广播通信根本无法工作。

然而,我没有注意到的是自动插入的"link-local"路由指向eth4。所以我得出结论,系统使用这个来处理所有169.254.x。X消息,我的应用程序不再接收它们。

有两种方法解决了我的问题:

  • 完全禁用eth4或
  • 使用

    删除"link-local"路由

    route del -net 169.254.0.0 netmask 255.255.0.0 dev eth4

下面是删除路由之前的路由表:

Ziel            Router          Genmask         Flags Metric Ref    Use Iface
192.168.230.0   *               255.255.255.0   U     1      0        0 eth4
192.168.1.0     *               255.255.255.0   U     1      0        0 eth2
link-local      *               255.255.0.0     U     1000   0        0 eth4
default         *               0.0.0.0         U     10     0        0 eth2

现在我可以愉快地接收来自我想要的设备的所有数据包。

当你的ip为169.254.x.x时,确保rp_filter在你想接收广播UDP的所有接口上关闭

# sysctl -A | grep '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0

使用

设置rp_filter
# sysctl -w net.ipv4.conf.eth0.rp_filter=0

您需要仔细检查您是否有防火墙阻止它们。在linux上,您可能使用iptables。使用该命令来列出你的规则。许多发行版使用iptables实现防火墙,但是隐藏这是你的事实。

路由器不应该转发来自192..的数据包。*因为那不是一个"可路由"的子网。它应该只用于内部/本地使用。如果在源和目标之间有路由器或网桥,那可能是问题所在。如果你在同一台机器上安装了wireshark,它可以监听数据包去看看他们,那就不是问题了。

您可以使用netstat来确保您的程序实际上正在侦听。输入"netstat -an -p UDP"查看所有正在侦听UDP数据包的程序。