Докер принимает многоадресный трафик

У нас есть приложение для подключения к серверу, которое выполняет автоматическое -d обнаружение физических устройств в сети путем прослушивания многоадресных пакетов на порту 6969. Поэтому нам нужен наш док-контейнер, чтобы иметь возможность получать эти пакеты от устройств вне хоста через хост, и в контейнере. Я видел несколько подобных вопросов, и сделал в много из чтения, но я до сих пор не удалось получить ответ сервера на этих широковещательных пакетов.

Я сижу на Wireshark и наблюдаю за сетевым трафиком, но я не специалист. Я знаю, что Docker создает адрес MASQUERADE чтобы весь трафик выглядел так, как будто он идет от шлюза Docker, поэтому, когда я смотрю veth я вижу в основном разговоры между 172.17.0.1 и 172.17.0.2 хотя мой сервер не может получить какую-либо информацию об устройствах в сети. (Если я бегу за пределами докера, у меня нет проблем, конечно.)

Я не могу использовать --net=host поскольку, как и другие, мы используем --link. Я пробовал следующие варианты...

  • docker run --name app -p 6969:6969 -d me/app:latest
  • docker run --name app -p 0.0.0.0:6969:6969 -d me/app:latest (Этот, который я мог поклясться, сработал один раз, но теперь нет?)
  • docker run --name app -p 0.0.0.0:6969:6969/udp -d me/app:latest
  • docker run --name app -p 255.255.255.255:6969:6969 -d me/app:latest

Буду очень признателен за любую помощь или понимание, которое вы можете предоставить.

Ответ 1

Попробуйте включить multicat для своих nics:

ip link set eth0 multicast on

echo 1 >/proc/sys/net/ipv4/ip_forwarding, чтобы включить переадресацию IP-адресов

Вам нужно явно установить или хотя бы проверить, что он включен на соответствующих интерфейсах.

net.ipv4.conf.all.mc_forwarding = 1
net.ipv4.conf.eth0.rp_filter=0

Разрешить многоадресный трафик:

iptables -I INPUT -d 224.0.0.0/4 -j ACCEPT
iptables -I FORWARD -d 224.0.0.0/4 -j ACCEPT

Также вам может потребоваться добавить маршрут для многоадресного трафика:

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 

Измените TTL отправителя многоадресной рассылки:

iptables -t mangle -A OUTPUT -d <group> -j TTL --ttl-set 128
Where group is the multicast group address of the stream you want to change the TTL of.

Также вы можете запустить многоадресный прокси

PS:

Вы должны попробовать (если выше не помогло) запустить контейнер докеров с параметром --net = none и использовать конвейер с следующей командой:

pipework docker0 -i eth0 CONTAINER_ID IP_ADDRESS/[email protected]_ROUTE_IP 

который создает интерфейс eth0 внутри контейнера с флагом IFF_MULTICAST и определенным IP-адресом.

Ответ 2

Есть рабочие решения этой проблемы?