openvpn и веб-сайт на одном сервере/IP

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

Я подключился к своему серверу OpenVPN, когда я делаю трассировку к любому хосту, я вижу, что мой запрос идет к моему VPN серверу, а затем к запрашиваемому хосту. Но когда я запрашиваю хост с того же сервера/IP, что и мой VPN сервер, я вижу, что трафик идет через моего провайдера. Возможно ли получить доступ к веб-сайтам, которые находятся на VPN сервере, как к другим веб-сайтам, используя VPN? Похожая проблема здесь. К сожалению, без ответа.

Это проблема маршрутизации.

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

Варианты.

  • Краткий основной ответ – получить и использовать отдельный IP-адрес для вашего VPN сервера. Не используйте тот же IP, который вы используете для вашего VPN, ни для чего другого.
  • Настройте DNS сервер на вашем хосте VPN и предоставьте записи для размещенных сайтов, которые сопоставляются с внутренними IP-адресами, когда вы подключены.
  • Если вы используете Linux в качестве клиента, вы можете поиграться с политической маршрутизацией и несколькими таблицами и отправлять только трафик 1194 через стандартную таблицу, а трафик http/https по VPN.

Ответ:

Эта проблема возникает из-за ограничений маршрутизации; запросы к собственным размещённым веб-сайтам VPN сервера обходят VPN туннель. Одно из решений – настроить DNS сервер (например, dnsmasq) на вашем VPN сервере, чтобы разрешать домены этих веб-сайтов на внутренние IP-адреса, как предложил @Zoredache. Это решение самое элегантное, поскольку оно не требует изменений на стороне клиента. В приведенных ниже инструкциях мы заботимся о том, чтобы не повлиять на разрешение DNS на стороне сервера.


Поэтапные инструкции

  1. Установите dnsmasq

    sudo apt install dnsmasq
    
  2. Настройте dnsmasq
    Отредактируйте файл конфигурации dnsmasq по адресу /etc/dnsmasq.conf:

    # Прослушивать только на интерфейсе VPN (замените `as0t0` на ваш интерфейс VPN)
    interface=as0t0
    
    # Используйте нестандартный порт, чтобы избежать конфликтов с другими DNS службами
    port=5353
    
    # Переключение на Google DNS для запросов, не соответствующих локальным доменам
    server=8.8.8.8
    
    # Укажите локальный домен
    local=/mydomain.com/
    domain=mydomain.com
    
    # Добавьте статические DNS записи (замените `mysite.mydomain.com` и `172.27.224.1` на ваше имя хоста и внутренний IP VPN)
    address=/mysite.mydomain.com/172.27.224.1
    
  3. Не используйте dnsmasq для локальных DNS запросов
    В /etc/default/dnsmasq раскомментируйте эту строку:

    DNSMASQ_EXCEPT="lo"
    
  4. Перезапустите dnsmasq
    Примените конфигурацию, перезапустив службу:

    sudo systemctl restart dnsmasq
    
  5. Проверьте конфигурацию
    С клиента, подключенного к VPN, убедитесь, что домен разрешается в внутренний IP:

    dig @172.27.224.1 mysite.mydomain.com -p 5353
    
  6. Перенаправьте DNS трафик
    OpenVPN не позволяет отправлять пользовательские порты DNS напрямую. Перенаправьте DNS запросы (порт 53) на порт dnsmasq (5353) с помощью iptables:

    sudo iptables -t nat -A PREROUTING -i as0t0 -p udp --dport 53 -j REDIRECT --to-port 5353
    sudo iptables -t nat -A PREROUTING -i as0t0 -p tcp --dport 53 -j REDIRECT --to-port 5353
    
  7. Отправьте настройки DNS клиентам
    В административном интерфейсе OpenVPN перейдите в настройки VPN → настройки DNS и выберите “Пусть клиенты используют те же DNS серверы, что и сервер доступа”. Правила iptables обеспечивают перенаправление DNS запросов от клиентов к dnsmasq, поэтому нет необходимости указывать IP DNS сервера.


Заметки

  • Интерфейс VPN: Замените as0t0 на имя вашего интерфейса VPN (используйте ifconfig или ip addr, чтобы его определить).
  • Внутренний IP: Обновите 172.27.224.1 на соответствующий внутренний IP вашего интерфейса VPN.
  • Имена доменов: Используйте значимые имена вместо mydomain.com и mysite.mydomain.com.

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

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

Решение проблемы: доступ к веб-сайтам на сервере OpenVPN

При использовании OpenVPN для обеспечения соединения с удалёнными ресурсами существует распространённая проблема: запросы к веб-сайтам, которые размещены на том же сервере, что и сам VPN, могут обрабатывать всё равно через интернет-провайдера, а не через VPN-туннель. Это происходит из-за особенностей маршрутизации.

Суть проблемы

Когда вы подключаетесь к OpenVPN, весь трафик, за исключением определённых адресов, перенаправляется через VPN-сервер. Однако запросы к веб-сайтам, размещённым на этом же сервере, могут не проходить через туннель. Это связано с тем, что маршрутизатор считает, что запрос на тот же IP-адрес (ваш VPN-сервер) должен обрабатываться напрямую.

Решения проблемы

Вот несколько подходов к решению этой проблемы:

  1. Использование отдельного IP-адреса для VPN: Это наиболее простой и рекомендуемый способ. Используйте разные IP-адреса для веб-сайта и для OpenVPN, чтобы избежать конфликтов в маршрутизации.

  2. Настройка DNS-сервера: Самым элегантным и простым решением будет настройка DNS-сервера (например, с использованием dnsmasq) на вашем VPN-сервере. Это позволит клиентам VPN резолвить доменные имена ваших сайтов в внутренние IP-адреса, когда они подключены к VPN.

  3. Политическая маршрутизация: Если ваш клиент использует Linux, можно реализовать политическую маршрутизацию и использовать несколько таблиц для перенаправления только необходимых портов (например, HTTP/HTTPS) через VPN.

Пошаговая инструкция по настройке dnsmasq

  1. Установите dnsmasq:

    sudo apt install dnsmasq
  2. Настройте dnsmasq:
    Откройте конфигурационный файл dnsmasq:

    sudo nano /etc/dnsmasq.conf

    Добавьте следующее:

    # Слушать только на интерфейсе VPN (замените `as0t0` на ваш VPN-интерфейс)
    interface=as0t0
    
    # Использовать некорректный порт для избегания конфликтов
    port=5353
    
    # Запускать на случай, если нужные записи не найдены
    server=8.8.8.8
    
    # Задать локальную область
    local=/mydomain.com/
    domain=mydomain.com
    
    # Добавить статические DNS записи
    address=/mysite.mydomain.com/172.27.224.1
  3. Исключите dnsmasq для локальных запросов:
    В файле /etc/default/dnsmasq раскомментируйте строку:

    DNSMASQ_EXCEPT="lo"
  4. Перезапустите dnsmasq:

    sudo systemctl restart dnsmasq
  5. Проверьте конфигурацию:
    С клиента, подключенного к VPN, убедитесь, что домен резолвится в внутренний IP:

    dig @172.27.224.1 mysite.mydomain.com -p 5353
  6. Перенаправление DNS-трафика:
    Используйте iptables, чтобы перенаправить запросы DNS к dnsmasq:

    sudo iptables -t nat -A PREROUTING -i as0t0 -p udp --dport 53 -j REDIRECT --to-port 5353
    sudo iptables -t nat -A PREROUTING -i as0t0 -p tcp --dport 53 -j REDIRECT --to-port 5353
  7. Настройка клиента OpenVPN:
    В интерфейсе OpenVPN выберите "Использовать те же DNS-серверы, что и сервер доступа". Это позволяет клиентам автоматически использовать dnsmasq для разрешения имён.

Заключение

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

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

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