我的 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 是我的本地网络。