CoreOS - выставить порты хоста для VPN - PullRequest
0 голосов
/ 17 марта 2019

Я запускаю Docker OpenVPN контейнер в CoreOS:

docker run --cap-add NET_ADMIN --device /dev/net/tun ...

Контейнер подключается к VPN, так как клиент и другие клиенты VPN могут пропинговать контейнер. Он запускает обычный openvpn процесс внутри него с параметром dev tun в конфигурации.

Моя задача - сделать хост-порты (-p выделенные порты из любых других контейнеров) на этом компьютере доступными для других VPN-клиентов через tun0 внутри контейнера VPN-клиента (так что это должно быть хост для настройки маршрутизации?). Как это реализовать?

1 Ответ

1 голос
/ 17 марта 2019

Итак, я предполагаю, что у вас есть контейнер, подключенный к VPN-серверу, и вам необходим доступ к серверу через этот контейнер из-за ограничений IP и т. Д.

1- Если вы используете Bridge Network, которая используется по умолчанию при запуске контейнера:

Для достижения этой цели вам потребуется установить внутри контейнера 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
...