无法在 Ubuntu 20.04 LTS 上使用 python 接收 UDP 广播,但可在同一网络上的 Raspbian 和 Centos 上运行

无法在 Ubuntu 20.04 LTS 上使用 python 接收 UDP 广播,但可在同一网络上的 Raspbian 和 Centos 上运行

我的 LAN 上有一个设备正在 UDP 50222 上发送广播数据包。使用 tcpdump,我可以看到数据包,但在我的 Ubuntu 20.04 LTS 盒子上的 Python 中没有收到任何数据。但是,在同一 LAN 上的另外 2 个系统(Centos 7.8 和 Raspbian 9 [stretch])上,完全相同的代码可以正常工作。这似乎并不完全局限于 Python;运行nc-lu 50222在两个非 Ubuntu 系统上都可以运行,但是在 Ubuntu 盒子上没有收到任何数据。

下面是我用来测试这一点的一些代码:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
client.bind(("", 50222))
while True:
    data, addr = client.recvfrom(1024)
    print("received message: %s"%data)

我相信实际上不需要两次调用 setsockopt(),但我已经尝试过使用和不使用它们,并且在任何机器上都没有区别。

我尝试在 sudo 下运行示例代码和 netcat,但没有任何区别。查看 Wireshark 中的 tcpdump 捕获,数据包包含我期望的数据,并且校验和正确。

在这里和其他地方搜索,我看到的最常见问题是没有正确进行绑定,但我相信我所使用的是正确的。

有什么建议么?

答案1

问题是由于防火墙阻止了大多数本地流量,但某些流量除外(例如 ssh)。防火墙经过修改,允许广播流量通过,问题得以解决。

具体来说,ufw 防火墙之前配置为仅允许来自 LAN 上主机的指定端口(例如,80、443、53、22)并丢弃所有其他流量。

为了解决这个问题,我运行了以下命令:

sudo ufw allow from 192.168.0.0/24其中 192.168.0.0/24 是我的本地网络。

相关内容