У меня есть устройство в моей локальной сети, которое отправляет широковещательные пакеты по UDP 50222. Используя tcpdump, я могу видеть пакеты, но в python на моем ящике Ubuntu 20.04 LTS нет данных получил. Однако в двух других системах в той же локальной сети (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 () на самом деле не нужны, но я пробовал как с ними, так и без них, и это не имеет значения ни на одной из машин.
Я пробовал запускать как образец кода, так и netcat под sudo, но это не имеет значения. Глядя на записи tcpdump в Wireshark, пакеты содержат данные, которые я ожидал, а контрольные суммы верны.
При поиске здесь и в других местах наиболее распространенной проблемой, которую я видел, является неправильное связывание, но я считаю, что то, что Я использовал правильный.
Есть предложения?
Проблема возникла из-за того, что брандмауэр блокировал большую часть локального трафика за некоторыми исключениями (например, ssh). Брандмауэр был изменен, чтобы разрешить широковещательный трафик, и это решило проблему.
В частности, брандмауэр ufw ранее был настроен так, чтобы разрешать только определенные порты от хостов в локальной сети (например, 80, 443, 53, 22) и отбрасывать весь остальной трафик.
Чтобы решить эту проблему, я выполнил следующую команду:
sudo ufw allow from 192.168.0.0/24
, где 192.168.0.0/24 — моя локальная сеть.