Вопрос или проблема
Я пытаюсь настроить обратный прокси Nginx и клиент OpenVPN на машине с Debian. Трафик должен маршрутизироваться от клиента OpenVPN к обратному прокси. Цель клиента OpenVPN – предоставить публичный IP-адрес. Запросы, сделанные к публичному IP OpenVPN (назовем его x.x.x.x) или связанному домену (sentry.mycompany.com), должны направляться к моему обратному прокси, который затем должен направлять трафик на http://localhost:9000. У меня работают как клиент OpenVPN, так и сервер Nginx по отдельности. Проблема в том, что трафик не маршрутизируется между ними. Это моя конфигурация Nginx:
server {
listen 80;
listen [::]:80;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Запросы к моему локальному IP (10.10.1.70) работают нормально, и трафик успешно перенаправляется на http://localhost:9000. Это моя конфигурация OpenVPN:
client
route-nopull
dev tun
proto tcp-client
data-ciphers AES-256-CBC:AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
tun-mtu 1400
mssfix 1360
tls-timeout 60
remote super-secret-server-url.net
port 1194
nobind
persist-key
persist-tun
tls-client
remote-cert-tls server
verb 5
mute 10
tls-cert-profile insecure
cipher AES-256-CBC
auth SHA512
auth-user-pass /.secrets/vpn/credentials.txt
<ca>
—–BEGIN CERTIFICATE—–
—–END CERTIFICATE—–
</ca>
Эта конфигурация действительна, и соединение с сервером проходит успешно. Я настроил route-nopull, так как не хочу, чтобы OpenVPN вмешивался в мои маршруты. Удаление route-nopull делает мой сервер недоступным из локальной сети (10.10.1.70) и также не делает сервер доступным из публичного IP OpenVPN. Я хочу иметь возможность получить доступ к машине из локальной сети. Подключение к серверу OpenVPN настраивает новый сетевой интерфейс:
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 192.168.90.174/24 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::8bd:d4a6:8d40:8b46/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Назначенный IP является правильным. Мой VPN-провайдер выполняет NAT-порт-форвардинг с внешнего IP x.x.x.x на “локальный” IP OpenVPN (192.168.90.174). Подводя итог, я хочу настроить это следующим образом:
Запрос к x.x.x.x или sentry.mycompany.com
Мой провайдер VPN перенаправляет трафик на 192.168.90.174
Моя машина получает трафик на tun0
Трафик с tun0 должен маршрутизироваться к моему обратному прокси Nginx
Обратный прокси Nginx должен перенаправлять трафик на порт 80 к http://localhost:9000
Запросы через мою локальную сеть (10.10.1.70) также должны быть возможны (SSH и т.д.).
Как я могу это сделать?
Ответ или решение
Настройка Nginx Reverse Proxy за клиентом OpenVPN
Ваша задача состоит в настройке Nginx развернутого на Debian сервере, который работает как обратный прокси-сервер, и клиента OpenVPN, который позволяет вашему серверу получать внешний IP-адрес от VPN-поставщика. Подходит решение, основанное на вашей текущей конфигурации и ожиданиях маршрутизации трафика.
1. Обзор конфигурации
Вы уже настроили OpenVPN и Nginx, однако вам нужно установить маршрутизацию трафика, поступающего на внешний IP-адрес или ассоциированный домен, так чтобы он был перенаправлен на Nginx, который будет отсылать его на локальную службу по адресу http://localhost:9000
.
2. Конфигурация OpenVPN
Ваша основная проблема связана с тем, что текущая конфигурация OpenVPN с директивой route-nopull
не позволяет маршрутизировать внешний трафик к вашему серверу. Необходимо убедиться, что OpenVPN перенаправляет трафик, приходящий на tun0
, к вашему Nginx. Попробуйте следующее:
-
Удаление директивы
route-nopull
: Эта директива предотвращает все добавления маршрутов через OpenVPN, что необходима для вашей конфигурации. Вместо этого, вам нужно явно указать маршруты. -
Добавление маршрутов: Исправьте конфигурацию OpenVPN, чтобы добавить маршруты. Можно добавить схему маршрутов, которые вы хотите использовать, для того, чтобы OpenVPN мог корректно маршрутизировать трафик, поступающий на ваш туннель.
Вот пример того, как настроить маршруты:
# client
dev tun
proto tcp-client
remote super-secret-server-url.net 1194
resolv-retry infinite
nobind
# Экспортируйте маршрут к вашему локальному IP
route 10.10.1.0 255.255.255.0
3. Конфигурация Nginx
Ваша конфигурация Nginx выглядит правильно, однако вам необходимо убедиться, что Nginx может принимать запросы из сети tun0
. Чтобы проверить корректность работы Nginx, выполните следующие шаги:
- Проверка доступа к Nginx: Убедитесь, что Nginx прослушивает на его конкретном IP-адресе, а именно на
192.168.90.174
. Возможно, вам потребуется расширить конфигурацию, чтобы указать IP-адрес:
server {
listen 80;
server_name sentry.mycompany.com x.x.x.x; # Добавьте внешние адреса
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
4. Настройка iptables
Для обеспечения доступа к вашему Nginx через трафик, который поступает c tun0
, может потребоваться дополнительная настройка iptables, чтобы разрешить трафик:
iptables -A INPUT -i tun0 -p tcp --dport 80 -j ACCEPT
Это указывает iptables разрешить входящие соединения через интерфейс tun0
на порт 80.
5. Тестирование
-
Тестирование доступа: Проверьте доступ к вашему Nginx с использованием публичного IP и домена через браузер или инструменты вроде
curl
:curl -I http://x.x.x.x curl -I http://sentry.mycompany.com
-
Проверка SSH: Убедитесь, что у вас есть доступ к локальному IP-адресу (10.10.1.70) через SSH.
Заключение
Эти изменения должны помочь вам правильно настроить маршрутизацию трафика через Nginx, работающий за клиентом OpenVPN. После внедрения изменений, также учтите, что любые корректировки в конфигурации могут потребовать перезагрузки соответствующих сервисов, чтобы изменения вступили в силу:
sudo systemctl restart nginx
sudo systemctl restart openvpn
Если у вас останутся вопросы, не стесняйтесь обращаться за дополнительной поддержкой.