У меня есть хост с двумя контейнерами Docker (с NET_ADMIN
возможностью):
backend
с интерфейсомeth0
(172.16.7.3
)openvpn-server
с интерфейсамиeth0
(172.16.7.2
) иtun0
(10.8.0.1
), работающим на сервере OpenVPN (режим tun)
На другой машине есть клиент OpenVPN openvpn-client
с интерфейсом tun0
( 10.8.0.2
). VPN работает.
Дополнительная настройка маршрута:
backend
имеет маршруты10.8.0.0/24 via 172.16.7.2
и224.0.0.0/4 via eth0
.openvpn-server
имеет маршруты10.8.0.0/24 dev tun0
и224.0.0.0/4 dev tun0
.
backend
может успешно выполнить ping openvpn-client
(маршрутизация через openvpn-server
): ping 10.8.0.2
работает как часы.
Наблюдения:
Когда я запускаю ping -t3 239.1.2.3
на openvpn-server
, они проходят через VPN-туннель, и я вижу, как ICMP-пакеты поступают на openvpn-client
(с tcpdump -i tun0 net 224.0.0.0/4
на openvpn-client
).
Также, когда я запускаю ping -t3 239.1.2.3
на backend
, они выходят через этот хост eth0
и входят в openvpn-server
's eth0
. Я могу видеть их при openvpn-server
использовании tcpdump -i eth0 net 224.0.0.0/4
.
Проблема:
Я хотел бы иметь возможность работать ping -t3 239.1.2.3
и backend
пересылать пинги на openvpn-client
, как если бы 10.8.0.2
они были отправлены. (Конечная цель — многоадресная рассылка UDP-пакетов backend
всем VPN-клиентам.)
Моя попытка:
smcroute -d -n -j eth0 239.1.2.3 -a eth0 172.16.7.3 239.1.2.3 tun0
Я думал, что это установит маршрут многоадресной рассылки, но на самом деле это ничего не делает. Я не вижу исходящих пакетов ICMP на openvpn-server
's tun0
. -- Что не так?
Я также пробовал настраивать pimd
на любых двух парах из трех хостов, а также на всех трех из них. В результате я смог сделать бенчмарк iperf
(как и предлагалосьздесь) между backend
и openvpn-server
, а также между openvpn-server
и openvpn-client
, но не между backend
и openvpn-client
. Похоже, что пересылка/маршрутизация через переход в середине каким-то образом не работает. (Я установил TTL на 5, так что это не должно быть проблемой.)
Я с радостью предоставлю более подробную информацию, если это необходимо (например, ip route list
выходные данные), но не хотел бы загромождать вопрос излишне.
решение1
Проблема была в том, что я не убедился, что он openvpn-client
присоединяется к группе многоадресной рассылки, поэтому маршрутизатор в середине ( openvpn-server
) не знал, что он должен отправлять туда многоадресный трафик.
Достаточно следующей настройки:
- Настройте
backend
маршрут224.0.0.0/4 via 172.16.7.2
— это гарантирует, что трафик для диапазона многоадресных IP-адресов будет отправлен наopenvpn-server
(возможно, вы захотите указать более узкий диапазон) - Установить и
pimd
запуститьopenvpn-server
Убедитесь, что устройство
openvpn-client
сообщает о своем желании присоединиться к группе многоадресной рассылки.Для этогоscmroute
необходим демон IGMP, такой как. Это работает всего в два шага:smcroute -d
-- запустить демонsmcroute -j tun0 239.1.2.3
-- присоединиться к группе
Обратите внимание, что невозможно выполнить обе команды в одной команде (
smcroute -d -j tun0 ...
).
Таким образом, все работает так, как и ожидалось.
Примечание:Если вы запустите демоны pimd
или smcroute
до того, как OpenVPN настроит tun0
, ничего не будет работать. Лучше всего запускать их с помощью route-up
хука OpenVPN.