Вопрос или проблема
У меня есть 2 сервера, и я развернул VPN на сервере 1 с помощью Docker, используя IP сервера 1 в качестве IP VPN.
Затем я ограничил порты серверов 1 и 2 с помощью iptables.
Это VPN, который я использовал: KUY.io Konnect
Правила iptables для сервера 1 и сервера 2
iptables -A INPUT -p tcp -s ${SERVER_1_IP} --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
Сервис, использующий порт 8080, развернут в Docker с network_mode host
Проблема: Я могу получить доступ к порту 8080 сервера 2 через VPN, но не сервера 1
Несмотря на то, что VPN развернут на сервере и использует его IP-адрес, доступ осуществляется из контейнера Docker, поэтому используется сеть Docker. После того как я разрешил сеть контейнеров VPN, проблема была решена.
Например:
VPN IPV4 сеть контейнеров: 172.20.0.0/16
iptables -I INPUT -p tcp -s 172.20.0.0/16 --dport 8080 -j ACCEPT
Но если вы установите VPN network mode в host, то вам нужно проверить файл /etc/hosts, и если там указан адрес 172.0.1.1, то измените его на ваш публичный IP-адрес.
Ответ или решение
Настройка VPN на сервере, включая распределение сетевого трафика через контейнеры Docker и управление доступом через iptables, может производить множество осложнений и требует тщательного подхода. Данная ситуация касается ограничения портов Linux сервера, на котором развернут VPN с использованием Docker. Рассмотрим эту проблему более подробно.
Теория
При развертывании VPN в контейнере Docker с использованием сетевого режима host
все сетевые интерфейсы Docker контейнера становятся доступными так же, как если бы они были настроены на хосте. Это упрощает сетевую маршрутизацию, так как позволяет контейнеру использовать IP-адреса и порты хоста.
Однако, это может вызвать трудности при настройке правил firewall, таких как iptables, поскольку настройки должны учитывать IP-адреса Docker сети. Они могут отличаться от тех, что используются непосредственно хостом, даже в режиме host
.
Пример
Для решения проблемы с доступом к портам VPN на сервере, на котором вы запускаете Docker контейнеры, вы настроили iptables для ограничения трафика:
iptables -A INPUT -p tcp -s ${SERVER_1_IP} --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
Эти команды iptables означают, что трафик на порт 8080 разрешен только с указанных IP-адресов: с самого сервера (SERVER_1_IP
) и с локального хоста (127.0.0.1
). Остальные подключения на этот порт блокируются.
Применение
Вы столкнулись с проблемой, что можете получить доступ к порту 8080 на сервере 2 через VPN, но не на сервере 1, хотя VPN и развернута на этом сервере. Это связано с тем, что трафик, исходящий от вашего Docker контейнера, использует сеть Docker, которая может иметь свои собственные диапазоны IP-адресов.
Когда вы поняли, что ваш контейнер VPN использует Docker сеть (например, 172.20.0.0/16
), вы добавили правило:
iptables -I INPUT -p tcp -s 172.20.0.0/16 --dport 8080 -j ACCEPT
Этим правилом вы разрешили доступ к порту 8080 для всех IP-адресов из сети Docker, благодаря чему и был решён вопрос с доступностью.
Особенности Настройки Mode Host
Если ваш контейнер настроен на использование сетевого режима host
, убедитесь, что все сетевые настройки, такие как /etc/hosts
, правильно конфигурированы. Например, может быть необходимо изменить любые записи, которые связывают внутренние адреса с транспортными, такие как 172.0.1.1
, на ваш публичный IP-адрес, чтобы избежать проблем с разрешением IP.
Заключение
Подводя итог, важно понимать, что:
- При использовании Docker сети, даже в сетевом режиме
host
, нужно вручную следить за тем, как Docker обрабатывает сетевые интерфейсы и каким образом это передается на уровень iptables. - Тщательно проверяйте сетевые настройки внутри и снаружи контейнера для полной уверенности в правильности маршрутизации.
- Использование iptables предоставляет мощные возможности для контроля сетевого трафика, но требует внимательности при указании сетевых диапазонов и адресов.
Следуя этой логике, можно решить множество сетевых проблем при работе с Docker контейнерами на Linux сервере.