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

问题描述

我的局域网上有一台设备正在UDP 50222上发送广播数据包。使用tcpdump,我可以看到这些数据包,但是在Ubuntu 20.04 LTS盒中的python中,没有接收到数据。但是,在同一LAN上的其他2个系统(Centos 7.8和Raspbian 9 [stretch])上,完全相同的代码有效。这似乎并不完全限于python;在两个非Ubuntu系统上运行 nc -lu 50222 可以,但是在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捕获,数据包中包含我期望的数据,并且校验和正确。

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

有什么建议吗?

解决方法

事实证明,在Ubuntu盒子上启用了防火墙,防火墙已锁定到仅允许特定端口允许本地通信的程度。添加规则以解决该问题。我仍然不太确定为什么tcpdump可以工作,大概是在较低的层上并且不受防火墙限制。