Не могу принимать широковещательные сообщения UDP с помощью python в Ubuntu 20.04 LTS, работает с Raspbian и Centos в той же сети

У меня есть устройство в моей локальной сети, которое отправляет широковещательные пакеты по 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, пакеты содержат данные, которые я ожидал, а контрольные суммы верны.

При поиске здесь и в других местах наиболее распространенной проблемой, которую я видел, является неправильное связывание, но я считаю, что то, что Я использовал правильный.

Есть предложения?

0
задан 7 September 2020 в 20:37

1 ответ

Проблема возникла из-за того, что брандмауэр блокировал большую часть локального трафика за некоторыми исключениями (например, ssh). Брандмауэр был изменен, чтобы разрешить широковещательный трафик, и это решило проблему.

В частности, брандмауэр ufw ранее был настроен так, чтобы разрешать только определенные порты от хостов в локальной сети (например, 80, 443, 53, 22) и отбрасывать весь остальной трафик.

Чтобы решить эту проблему, я выполнил следующую команду:

sudo ufw allow from 192.168.0.0/24, где 192.168.0.0/24 — моя локальная сеть.

1
ответ дан 8 September 2020 в 19:10

Другие вопросы по тегам:

Похожие вопросы: