Маршрутизируйте трафик из одного контейнера docker через VPN (предоставляемый вторым контейнером)

Мне нужно понять, как заставить два контейнера docker работать с таким сценарием, как этот:

Есть филиал с маршрутизатором и клиентом. Сеть - 192.168.190.0/24, а адреса - 1 и 57.

Где-то еще есть виртуальная машина, подключенная к Интернету с общедоступным IP-адресом X.Y.Z.K и установленной сверху средой docker.Внутри есть два контейнера. Первый - это веб-сервер, работающий только в частной сети с адресом 192.168.80.2. Другой контейнер имеет подключение к частной сети с адресом 192.168.80.44 и предоставляет свой порт 1194 на другом сетевом интерфейсе общедоступному IP-адресу.

Мне нужно иметь возможность заставить 192.168.190.57 открывать страницы на 192.168.80.2.

Часть VPN работает нормально (маршрутизатор подключается и может пинговаться с клиента), и мне не нужна помощь в этом.

Это макет для моего файла docker-compose.

version: '2'services:  openvpn:    image: mycompany/openvpn    restart: 'always'    cap_add:      - NET_ADMIN    ports:      - '1194:1194/udp'    networks:      nat:      private_net:          ipv4_address: '192.168.80.44'  coredns:    image: 'nginx'    restart: 'always'    links:      - openvpn:private_net_vpn    networks:      private_net:        ipv4_address: '192.168.80.2'networks:  private_net:    internal: true    ipam:      config:        - subnet: '192.168.80.0/24'  nat:

Сценарий, описанный ранее

В конце концов я обнаружил проблему.

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

Вначале я думал, что это просто маршрут, скажем, с 192.168.80.2 на 192.168.80.1 (IP-адрес, назначенный хост-машине для этого сегмента локальной сети), а затем в Интернет. Внимательно прочитав все правила iptables, я обнаружил, что переадресация также отключена.

Удаление internal: true позволил контейнеру маршрутизировать через VPN, как и ожидалось, за счет предоставления веб-серверу прямого доступа к общедоступному Интернету.

Да, я знаю. 192.168.190.57 также может пинговать VPN-сервер. Кроме того, VPN-сервер может пинговать 192.168.80.2.

можете ли вы отслеживать маршрут веб-сервера из vpn-клиента? также попробуйте свернуться, пинг может быть заблокирован в контейнере

Нет, я не смог. Ни один протокол вообще (icmp, tcp, udp) не работал так, как он был настроен. Но я все понял. Подробнее о моем собственном ответе ниже.

Какой образ openvpn вы используете? Вы пробовали метод веб-прокси, описанный здесь Docker Hub

Если вы внимательно посмотрите на схему на изображении, вы увидите, что контейнер docker для VPN - это сервер, а не клиент. Я не думаю, что этот образ сработал бы для меня.

хорошо, есть ли у вас эта запись в ``push 'route 192.168.80.0 255.255.255.0"` в вашем файле конфигурации сервера openvpn?