Вопрос или проблема
Моя основная цель следующая: установить VPN сервер на сервере, и сайт на этом сервере должен быть доступен только пользователям, использующим VPN на том же сервере.
Во-первых, случай с двумя серверами работает.
То есть, у меня есть два сервера, A и B. PPTP VPN сервер установлен на A, а nginx на B.
Я настроил правила доступа для моего сайта на nginx следующим образом, и они работают нормально:
allow ip_of_a;
deny all;
Однако, когда я пытаюсь подключиться к сайту на A (vpn сервер также имеет nginx сервер), мой удаленный IP отображается как мой оригинальный IP, а не как IP, который я получаю, когда подключаюсь через VPN, и я получаю страницу 403 Forbidden на nginx. В логах ошибок отображается попытка подключения с моего оригинального IP, а не с IP VPN.
Я понимаю, что VPN все еще знает мой оригинальный IP вместо IP, который он мне присвоил, но для этой ситуации должно быть решение.
VPN присваивает локальные IP в формате allow 10.80.80.*, поэтому я добавил еще одно правило разрешения в следующем формате:
allow 10.80.80.0/24;
Это не сработало.
Я также пытался напрямую добавить локальный IP, который VPN выдает мне, но опять это не сработало:
allow 10.80.80.100;
Это нужно исправить как-то на сервере pptp или это можно исправить с помощью правила nginx?
Редактирование: Таблицы маршрутизации на клиенте (OS X) до и после подключения к vpn:
До:
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 18 0 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 17 12724964 lo0
169.254 link#4 UCS 0 0 en0
192.168.1 link#4 UCS 3 0 en0
192.168.1.1 0:25:9c:4a:c6:44 UHLWIir 19 28906 en0 1000
192.168.1.126 0:88:65:5c:6a:f4 UHLWIi 0 33 en0 440
192.168.1.129 127.0.0.1 UHS 1 0 lo0
192.168.1.255 ff:ff:ff:ff:ff:ff UHLWbI 0 24 en0
После:
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.99.99.99 UGSc 16 0 ppp0
default 192.168.1.1 UGScI 11 0 en0
10 ppp0 USc 1 0 ppp0
10.99.99.99 10.99.99.100 UHr 17 8 ppp0
SERVER_IP_HERE 192.168.1.1 UGHS 1 299 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 17 12724968 lo0
169.254 link#4 UCS 0 0 en0
192.168.1 link#4 UCS 3 0 en0
192.168.1.1 0:25:9c:4a:c6:44 UHLWIir 13 28987 en0 988
192.168.1.126 0:88:65:5c:6a:f4 UHLWIi 0 33 en0 428
192.168.1.129 127.0.0.1 UHS 0 0 lo0
192.168.1.255 ff:ff:ff:ff:ff:ff UHLWbI 0 38 en0
VPN сервер по умолчанию не перенаправляет веб-трафик, как объясняется здесь, добавление строки
push "redirect-gateway def1"
в ваш openvpn.conf позволит вам иметь IP сервера VPN в качестве вашего удаленного IP, и с этим ваш веб-сервер должен позволить вам пройти.
На самом деле, вам не нужно настраивать DNS сервер. Я попробовал следующий сценарий:
VPN сервер
Создайте псевдоним
# ifconfig eth0:1 192.168.127.10 netmask 255.255.255.255 up
Настройте nginx на адрес псевдонима
server {
listen 192.168.127.10:80;
server_name site1.example.net;
location / {
root /var/www/html;
}
}
Настройте iptables
# iptables -t nat -I PREROUTING -p tcp -d xxx.xxx.xxx.xxx --dport 80 -j DNAT --to-destination 192.168.127.10:80
где xxx.xxx.xxx.xxx — это публичный IP адрес сервера A и IP адрес сайта.
Кажется, что приоритет других локальных правил маршрутизации выше, чем при отправке “redirect gateway def1”. Добавление IP хоста напрямую в таблицу маршрутизации может оказать влияние:
push "route vpn-server-ip/32"
Ответ или решение
Для ограничения доступа к вашему веб-сайту на NGINX только для пользователей, подключенных через VPN на одном сервере, необходимо правильно настроить как сервер VPN, так и сервер NGINX.
Шаг 1: Установка и настройка сервера VPN
Вы можете использовать PPTP или OpenVPN для создания VPN-сервера. Здесь мы рассмотрим пример с OpenVPN, так как он более гибкий и безопасный. Убедитесь, что ваш VPN-сервер настроен для раздачи IP-адресов в пределах сети, доступной только для VPN-подключений (например, диапазон 10.80.80.0/24
).
Конфигурация OpenVPN:
-
Откройте файл конфигурации OpenVPN (обычно
server.conf
) и добавьте строку для перенаправления маршрута:push "redirect-gateway def1"
Это обеспечит использование IP-адреса, полученного от VPN, для всего веб-трафика.
-
Настройте клиентское соединение, чтобы убедиться, что после подключения к VPN, ваша система использует IP-адрес, выданный VPN.
Шаг 2: Настройка сервера NGINX
После настройки VPN-сервера, необходимо убедиться, что NGINX принимает подключения только от IP-адресов, которые были выданы VPN.
-
В конфигурационном файле NGINX (например,
/etc/nginx/sites-available/default
) добавьте правила доступа:server { listen 80; server_name site1.example.net; location / { allow 10.80.80.0/24; # Разрешить доступ для VPN deny all; # Запретить доступ всем остальным } }
-
Проверьте вашу конфигурацию на наличие ошибок:
sudo nginx -t
-
Перезагрузите NGINX, чтобы изменения вступили в силу:
sudo systemctl restart nginx
Шаг 3: Настройка маршрутизации и IPTables
Важно убедиться, что маршруты настроены правильно и трафик через VPN отправляется корректно:
-
Убедитесь, что маршруты действительно настроены после подключения к VPN. Команда
route -n
илиip route show
покажет текущие маршруты. -
Если ваш клиент (например, ОС X) пренебрегает маршрутом при соединении с VPN, можно попробовать добавить его вручную:
route add SERVER_IP_HERE 10.80.80.1
где
SERVER_IP_HERE
– это IP-адрес вашего веб-сервера. -
Убедитесь, что IPTables правильно настроены для разрешения трафика:
iptables -I INPUT -p tcp --dport 80 -s 10.80.80.0/24 -j ACCEPT iptables -I INPUT -p tcp --dport 80 -j DROP
Заключение
Таким образом, вы сможете ограничить доступ к вашему веб-сайту, используя VPN-сервер на том же сервере, где развернут NGINX. Правильная настройка маршрутов, правил NGINX и IPTables обеспечит безопасность вашего сайта и ограничит доступ только для авторизованных пользователей VPN.