#docker #networking #coreos #openvpn #tun
#docker #сеть #coreos #openvpn #tun
Вопрос:
Я запускаю контейнер docker Openvpn в CoreOS:
docker run --cap-add NET_ADMIN --device /dev/net/tun ...
Контейнер подключается к VPN как клиент, и другие VPN-клиенты могут пинговать контейнер. Внутри него запускается обычный openvpn
процесс с dev tun
опцией в конфигурации.
Моя задача — сделать порты хоста ( -p
удаленные порты из любых других контейнеров) на этом компьютере доступными для других VPN-клиентов через этот tun0
внутренний контейнер VPN-клиента (значит, для настройки маршрутизации он должен принадлежать хосту?). Как это реализовать?
Комментарии:
1. Ваш основной контейнер — это клиент openvpn, подключенный к удаленному vpn-серверу? и вы хотите, чтобы другие подключались через этот контейнер, не запуская сам openvpn (потому что он уже запущен в контейнере)?
2. ДА. Я пытаюсь создать видимый только для VPN рабочий coreos, например, машина должна предоставлять все, что у нее есть, сети VPN, к которой она подключена в качестве клиента. Я использую github.com/tsaikd/docker-openvpn
3. Итак, я как пользователь должен получить доступ к сервису через него, потому что для этого требуется vpn ip и так далее, верно? Я уже создавал аналогичный сценарий, прежде чем я просто гарантирую, прежде чем отправлять ответ: D
4. Да, конечно, к нескольким портам можно будет получить прямой доступ, но большинство из них предназначены только для vpn-сервисов для других компьютеров в VPN. Спасибо
Ответ №1:
Итак, я предположу, что у вас есть контейнер, подключенный к VPN-серверу, и вам необходимо получить доступ к серверу через этот контейнер из-за ограничений IP и так далее.
1 — В случае, если вы используете мостовую сеть, которая используется по умолчанию при запуске контейнера:
Для достижения этого вам нужно будет установить IPTables внутри контейнера и после запуска VPN-соединения выполнить следующую команду:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
И с хост-компьютера, на котором вы хотите получить доступ к службе, вы можете использовать iproute
команду для маршрутизации соединения через контейнер, как показано ниже:
Предположим, вы хотите получить доступ к удаленному серверу с IP 192.168.0.20 через контейнер с IP: 172.17.0.4
ip route add 192.168.0.20 via 172.17.0.4
Теперь всякий раз, когда вы обращаетесь к серверу 192.168.0.20, это будет происходить через VPN-клиент внутри вашего контейнера.
2- Вы можете перейти --network=host
к docker run
, и в этом случае вам не понадобятся какие-либо дополнительные шаги, поскольку соединение по умолчанию будет маршрутизироваться через VPN
Обновить:
Учитывая, что у вас есть контейнер Y с портом 9000 и доступен через контейнер X.
Контейнер X подключен к VPN.
Пользователь, подключенный к той же VPN, хочет получить доступ к контейнеру Y, и он должен пройти через контейнер X, тогда вам нужно применить следующие правила брандмауэра внутри контейнера X
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 9000 -j DNAT --to-destination $CONTAINER_Y_DOCKER_IP
iptables -t nat -A POSTROUTING -p tcp -d $CONTAINER_Y_DOCKER_IP --dport 9000 -j SNAT --to-source $CONTAINER_X_DOCKER_IP
iptables -A FORWARD -m state -p tcp -d $CONTAINER_Y_DOCKER_IP --dport 9000 --state NEW,ESTABLISHED,RELATED -j ACCEPT
Комментарии:
1. Позвольте мне попробовать. Я действительно нашел цепочку
DOCKER
в iptables контейнера, которая, кстати, включает мои общедоступные порты. Я пока не понимаю, что это. Я просто использовал--network host
наряду с--device
и--cap-add
.2. Мой сценарий, описанный выше, применяется к сети моста (настройка docker по умолчанию), если вы собираетесь использовать сеть хоста, то по умолчанию связь будет маршрутизироваться через нее, никаких дополнительных шагов не требуется
3. Верно! Я уже могу использовать свои порты как
localhost
внутренний контейнер VPN. Проверит, почему другие VPN-клиенты не могут отключить их со своей стороны. Это, безусловно, проблема контейнера, а не клиента.4. Если вы собираетесь использовать контейнер с мостовой сетью, то первый метод поможет вам достичь этого
5. Спасибо! Оба ваших предложения верны. Однако я не могу получить доступ к пользовательскому TCP-порту
9000
с другого VPN-клиента. При выполнении я получаю сообщение об ошибке «отказано в подключении»telnet 10.8.0.2 9000
(ip контейнерной vpn), в то время как политика iptables ПРИНИМАЕТ как хост docker, так и контейнер docker vpn. Не могли бы вы сказать мне, чего мне может не хватать? Я использую мостовую сеть (по умолчанию без--network ..
)