Вопрос или проблема
Я хочу, чтобы веб-служба (gitlab) была доступна только при подключении к VPN. Я добиваюсь этого, разрешая подключения только из сети 10.8.0.0/24 в nginx (внешний, не тот, что идет с gitlab).
ОДНАКО, если я пытаюсь запустить его на порту 80, nginx видит мой реальный IP-адрес клиента, даже при подключении к VPN. Если я запускаю его на любом другом порту, например, 8000, то он видит мой IP VPN при подключении, как и ожидалось.
Это создает много проблем, поскольку gitlab не был разработан для работы на другом порту, и многие ссылки внутри gitlab, включая “clone” и “push”, “забывают” о порте, требуя ручного исправления каждый раз…
Есть ли что-то, что я могу сделать, чтобы заставить его работать и на порту 80? Я использую этот скрипт OpenVPN: https://github.com/angristan/openvpn-install
Я также использую обычный Nginx и Gitlab Omnibus, хотя я не думаю, что они являются проблемой.
Изменить:
Конфигурация клиента:
client
proto udp
explicit-exit-notify
remote example.com 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server_<identifier> name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
setenv opt block-outside-dns # Предотвращение утечки DNS на Windows 10
verb 3
Конфигурация сервера:
port 1194
proto udp6
dev tun
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 192.168.100.1"
push "redirect-gateway def1 bypass-dhcp"
server-ipv6 fd42:42:42:42::/112
tun-ipv6
push tun-ipv6
push "route-ipv6 2000::/3"
push "redirect-gateway ipv6"
dh none
ecdh-curve prime256v1
tls-crypt <tls-key>
crl-verify <crl-file>
ca <ca-cert>
cert <server-cert>
key <server-key>
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
client-config-dir /etc/openvpn/ccd
status /var/log/openvpn/status.log
verb 3
Ваш адрес git.domain.tld
разрешается в ваш публичный IP. Поэтому машина клиента подключится к публичному IP-адресу, и если маршрут по умолчанию клиента не проходит через туннель VPN, то подключение произойдет с использованием публичного IP-адреса клиента.
Чтобы исправить это, нужно установить A-запись, чтобы она разрешалась в частный IP-адрес, используемый в туннеле.
.
Ответ или решение
Проблема, связанная с маршрутизацией порта 80 через OpenVPN, требует внимательного изучения настройки VPN и серверного окружения, особенно когда речь идет о доступе к веб-сервису, такому как GitLab, через VPN-туннель. Рассмотрим теоретическую основу, практические примеры и возможные решения для данной ситуации.
Теория
OpenVPN функционирует как гибкий и мощный инструмент для создания защищенных соединений через общий или небезопасный интернет. Он позволяет маршрутизировать интернет-трафик через защищенные туннели, обеспечивая безопасность данных пользователей. Один из основных принципов работы OpenVPN — это перенаправление трафика через назначенные интерфейсы VPN, такими как tun
или tap
, что позволяет клиентам демонстрировать локальный адрес сети VPN (например, 10.8.0.0/24) вместо публичных IP-адресов.
Возникновение проблемы с маршрутизацией порта 80 указывает на то, что в определённой конфигурации не происходит переброса трафика через туннель OpenVPN. Следовательно, IP-адрес клиента, который используют для определения доступа к веб-сервису, отображается неверно.
Пример
В вашем примере, вы описываете, что при подключении к VPN трафик через порт 80 позволяет увидеть реальный IP-адрес клиента, а использование других портов, таких как 8000, корректно передает IP VPN. Это может быть связано с несколькими факторами, включая поведение сетевых маршрутизаторов, брандмауэров или особенностей маршрутизации HTTP-трафика.
Применение
-
Настройки DNS
Один из обсуждаемых способов решения проблемы — это корректировка A-записи для домена, к которому применяется OpenVPN. В данном случае, адрес
git.domain.tld
должен разрешаться в частный IP-адрес внутри туннеля, например, в адрес из пула 10.8.0.0/24, что гарантирует, что соединения проходят через туннель, а не напрямую по публичному интернету. -
Настройка сервера OpenVPN
Проверьте, что директивы, передающие маршруты и перенаправляющие шлюзы, корректно работоспособны и согласованы с вашей сетью. Ваша конфигурация сервера включает строки:
push "redirect-gateway def1 bypass-dhcp"
Эта команда перенаправляет весь трафик, в том числе HTTP(порты 80 и 443), через VPN. Убедитесь, что она правильно объединена с настройками сети и брандмауэра.
-
Анализировать брандмауэр и правила NAT
Убедитесь, что ваши сетевые настройки не конфликтуют с перенаправлением VPN-трафика. Некоторые маршрутизаторы могут иметь исключения для порт 80 из-за его популярности и прохода через открытый интернет.
-
Настройка Nginx
Дополнительно вы можете исследовать настройку Nginx, отвечающего за прием этих подключений. Параметры Nginx могут включать
real_ip_header
иset_real_ip_from
, что позволяет корректно определять IP-адреса в определенных сценариях использования через прокси-сервера. -
Конфигурация клиента
Проверьте, что клиентская конфигурация не включает параметры, отклоняющие маршрутизацию HTTP через туннель. Например, если на клиенте установлены VPN приложения с различными задаваемыми параметрами маршрутизации и фильтрации трафика, это может повлиять на функционал VPN.
Заключение
Ваша задача — обеспечить, чтобы все составляющие — сервер OpenVPN, маршрутизатор, DNS, Nginx и GitLab — работали совместно для достижения ожидаемого результата. Применение этих шагов должно помочь в разрешении конфликта маршрутизации порта 80 через туннель OpenVPN и улучшении общей конфигурации системы для обеспечения безопасности и функциональности.