CoreOS — предоставляет порты хоста для VPN

#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 .. )