.png)
Я новичок в работе с сетями, поэтому пробую это впервые. Я создал openvpn docker, который подключается к VPN-серверу. Запуск wget -q -O - https://api.myip.com
внутри контейнера docker подтверждает, что сеть docker надлежащим образом подключена к VPN и что IP принадлежит VPN-серверу. Теперь я хочу попробовать направить трафик хоста через контейнер docker и добиться того же результата за пределами контейнера, где трафик хоста использует VPN-подключение docker. Мне не совсем понятно, как это сделать из отношения хоста docker <-> контейнера, поэтому я подумал, что, возможно, я могу использовать функцию сопоставления портов в docker, а также настроить веб-прокси в docker для обработки любых http/https-запросов.
Поэтому я поднял squid и openvpn-сервер внутри одного докера и открыл порт 3128 (так как именно его слушает squid). Команда wget на хосте становится:
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
Но тесты показывают, что трафик не идет через vpn-соединение докера. Вместо этого результаты показывают, что связь идет через интернет-соединение хоста.
Я запускаю контейнер с помощью следующей команды Docker run:
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
Неправильный ли подход выше? Какой наилучший подход для маршрутизации трафика хоста через несколько docker vpn-подключений?
Следующие ресурсы указывают на возможность этого, но предлагают собственные решения, специфичные для их варианта использования. Было бы неплохо иметь сетевой инструмент Linux, такой как wget или curl, который может помочь мне отладить/протестировать прогресс моего решения.
решение1
Это старый вопрос, но, похоже, в последнее время он привлек некоторое внимание, поэтому я отвечу на него.
В зависимости от того, что вы пытаетесь сделать, есть 2 способа заставить вашу сеть проходить через VPN, а в зависимости от того, что вы пытаетесь маршрутизировать, есть 3 способа сделать это.
Прокси (прямой прокси)
Это требует, чтобы ваша хост-система или контейнер, который вы хотите использовать VPN, явно направляли свой трафик на прокси, работающий в контейнере VPN. Ваш контейнер VPN должен работать как с прокси, так и с активным VPN. Довольно эффективно управляет двунаправленной сетевой пересылкой.
Техника требует, чтобы вы выставили порт из прокси-сервера контейнеров, который вы вручную настроили в контейнере VPN, а затем настроили свою хост-систему для использования localhost:port
в качестве прокси. Это довольно сложно и имеет много опций, поэтому вам следует специально поискать это в Google.
Прямое управление сетевым стеком (хоста)
Обычно контейнер VPN имеет отдельный сетевой стек, работающий в отдельном пространстве имен, но вы можете указать docker не отделять сетевое пространство имен и предоставить ему полный доступ к сетевому стеку, как если бы он работал изначально на хосте. Если вы пытаетесь использовать контейнеризированный VPN, как если бы он был изначально установлен на хосте, то это то, что вы должны сделать. Однако управление сетевым пространством имен хоста — это отдельное разрешение, а не просто его совместное использование, поэтому вам также нужно добавить некоторые возможности. Возможности 3xact зависят от вашего программного обеспечения VPN, но обычно это CAP_NET
, CAP_NET_RAW
, и часто CAP_ADMIN
. Если вы не уверены и доверяете своему приложению, вы можете просто использовать привилегированный режим, чтобы предоставить все возможности (плюс некоторые ненужные дополнительные возможности). Поэтому для этого вы добавляете эти две опции в свою команду запуска: --net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
.
Прямое управление сетевым стеком (другого контейнера)
Эта опция имеет ту же концепцию, что и прямое управление сетевым стеком хоста, но позволяет использовать ваш VPN другому контейнеру вместо хоста, как если бы он был запущен внутри этого контейнера. Чтобы использовать его, вам просто нужно добавить строку в команду запуска не-VPN-контейнера, чтобы сообщить ему о необходимости совместного использования сетевого стека с вашим VPN-контейнером:--net=container:vpn-container-name