OpenVpn пересылка на Docker (nginx)

Вопрос или проблема

У меня есть домен и поддомен.
Ожидаемый результат заключается в том, что доступ к admin.domain.com возможен только через VPN, а domain.com общедоступен.

Я установил OpenVPN на свой Ubuntu и у меня есть готовая конфигурация сервера и клиентские ключи.
Я могу подключиться к VPN со своего локального компьютера.
Кроме того, я развернул свое приложение на сервере и запустил его в docker.

Проблема в том, что, хотя openvpn работает на сервере и я не подключаюсь к vpn с локальной машины, доступны как domain.com, так и admin.domain.com.

Судя по журналам, соединение с vpn успешно
MULTI: primary virtual IP for user/XXX.X.XX.XX:60737: 10.9.0.2
Я временно добавил

allow 10.9.0.0/24;     # Разрешить VPN клиентам
deny all;

в конфигурацию nginx и получил ошибку 403 forbidden и сообщение
access forbidden by rule, client: XXX.X.XX.XX

Это означает 2 вещи

  1. VPN каким-то образом обойдена
  2. Nginx видит оригинальный IP, а не тот, который назначен vpn

Я полностью застрял здесь.

конфигурация openvpn сервера

port 1195
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/domain.com.crt
key /etc/openvpn/domain.com.key
dh /etc/openvpn/dh.pem
server 10.9.0.0 255.255.255.0
push "route 10.9.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-shcp"

OpenVPN добавляет новое правило в таблицу маршрутизации с целью IP-адреса VPN-сервера и следующим переходом, как это было ранее основным шлюзом, – а затем заменяет маршрут по умолчанию на свой собственный.

Таким образом, весь трафик на публичный IP сервера проходит через интернет. Либо смените на нормальный VPN, такой как WG, либо настройте DNS, чтобы указывать на внутренний IP для admin.example.com.

Ответ или решение

Для решения задачи по настройке OpenVPN и Docker с Nginx, чтобы обеспечить доступ к субдомену через VPN, а главному домену – напрямую из интернета, необходимо тщательно проанализировать текущую конфигурацию системы и выявить причины, по которым ваше начальнее решение оказалось неэффективным.

Теория

Цель вашей конфигурации – ограничить доступ к определённому субдомену (admin.domain.com) так, чтобы он был доступен только через соединение VPN, в то время как основной домен (domain.com) остаётся доступным для всех. Основная проблема в вашем случае заключается в том, что соединение через VPN, вероятно, не маршрутизируется корректно, и клиентские подключения к admin.domain.com никак не учитывают наличия VPN.

OpenVPN устанавливает новые правила в таблице маршрутизации, замещая предыдущий маршрут по умолчанию на свой, перенаправляя таким образом весь трафик через VPN-соединение. Если nginx обрабатывает исходные IP-адреса клиента напрямую, это говорит о том, что трафик не проксируется через VPN или не перенаправляется правильно.

Пример

Ваш текущий конфиг OpenVPN выглядит следующим образом:

port 1195
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/domain.com.crt
key /etc/openvpn/domain.com.key
dh /etc/openvpn/dh.pem
server 10.9.0.0 255.255.255.0
push "route 10.9.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"

В этом случае стоит обратить внимание на следующее:

  1. Если вы ожидаете, что admin.domain.com будет доступен только по VPN, его IP-адрес должен быть доступен только через внутреннюю сеть, предоставляемую VPN.
  2. Настройка маршрутизации в OpenVPN должна по умолчанию перенаправлять весь трафик через туннель, но это не всегда так — в частности, не следует забывать о звонке iptables для управления правилами маршрутизации.

Применение

  1. Настройка IPTABLES для OpenVPN: Убедитесь, что сетевой интерфейс TUN, созданный OpenVPN, правилен и все подключения идут через него. Для этого можно применять iptables для назначения правил для переадресации тосов соответсвеных VPN:
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
  1. Настройка Nginx для IP-фильтрации: Убедитесь, что nginx получает правильный исходный IP. Это возможно, когда прокси-сервер, такой как Nginx, использует X-Forwarded-For или если конфигурация сети выполняется в соответствии с этими путями:
server {
    listen 80;
    server_name admin.domain.com;

    location / {
        allow 10.9.0.0/24;  # Разрешить доступ только через VPN
        deny all;
    }

    # остальная конфигурация
}
  1. Проверка DNS-конфигурации: Отдельное значение имеет правильная настройка DNS для маршрутизации запросов к внутреннему IP-адресу VPN, что можно сделать через DNS-серверы, видимые только изнутри VPN.

  2. Docker-сетевое подключение: Убедитесь, что приложение в контейнере Docker имеет правильную сетевую конфигурацию, чтобы учитываются специфически адреса маршрутизации и реализация политики безопасности. Если ваше приложение работает в сети Docker, оно должно иметь доступ к тому же интерфейсу TUN:

docker run --network host ...

Это обеспечение того, что все пакеты, перенаправлялись в соответствии с идентичным методом.

В заключение, основная потребность здесь – убедиться в правильности использования VPN и контейнеризованных сервисов. Это включает установление строгих правил маршрутизации и доступа, а также учитывание всех аспектов сетевой безопасности и доступности. Настройка таким образом будет гарантировать выполнение задач со всеми поставленными ограничениями и параметрами доступа.

Оцените материал
Добавить комментарий

Капча загружается...