Итак, я предполагаю, что у вас есть контейнер, подключенный к 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