Ограничение подключения к сайту nginx только для пользователей VPN на том же сервере

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

Моя основная цель следующая: установить 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:

  1. Откройте файл конфигурации OpenVPN (обычно server.conf) и добавьте строку для перенаправления маршрута:

    push "redirect-gateway def1"

    Это обеспечит использование IP-адреса, полученного от VPN, для всего веб-трафика.

  2. Настройте клиентское соединение, чтобы убедиться, что после подключения к VPN, ваша система использует IP-адрес, выданный VPN.

Шаг 2: Настройка сервера NGINX

После настройки VPN-сервера, необходимо убедиться, что NGINX принимает подключения только от IP-адресов, которые были выданы VPN.

  1. В конфигурационном файле NGINX (например, /etc/nginx/sites-available/default) добавьте правила доступа:

    server {
       listen 80;
       server_name site1.example.net;
    
       location / {
           allow 10.80.80.0/24;  # Разрешить доступ для VPN
           deny all;              # Запретить доступ всем остальным
       }
    }
  2. Проверьте вашу конфигурацию на наличие ошибок:

    sudo nginx -t
  3. Перезагрузите NGINX, чтобы изменения вступили в силу:

    sudo systemctl restart nginx

Шаг 3: Настройка маршрутизации и IPTables

Важно убедиться, что маршруты настроены правильно и трафик через VPN отправляется корректно:

  1. Убедитесь, что маршруты действительно настроены после подключения к VPN. Команда route -n или ip route show покажет текущие маршруты.

  2. Если ваш клиент (например, ОС X) пренебрегает маршрутом при соединении с VPN, можно попробовать добавить его вручную:

    route add SERVER_IP_HERE 10.80.80.1

    где SERVER_IP_HERE – это IP-адрес вашего веб-сервера.

  3. Убедитесь, что 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.

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

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