Докер принимает многоадресный трафик
У нас есть приложение для подключения к серверу, которое выполняет автоматическое -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
Есть рабочие решения этой проблемы?