Вопрос или проблема
Я подключился к своему серверу 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 на стороне сервера.
Поэтапные инструкции
-
Установите
dnsmasq
sudo apt install dnsmasq
-
Настройте
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
-
Не используйте dnsmasq для локальных DNS запросов
В/etc/default/dnsmasq
раскомментируйте эту строку:DNSMASQ_EXCEPT="lo"
-
Перезапустите
dnsmasq
Примените конфигурацию, перезапустив службу:sudo systemctl restart dnsmasq
-
Проверьте конфигурацию
С клиента, подключенного к VPN, убедитесь, что домен разрешается в внутренний IP:dig @172.27.224.1 mysite.mydomain.com -p 5353
-
Перенаправьте 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
-
Отправьте настройки 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-сервер) должен обрабатываться напрямую.
Решения проблемы
Вот несколько подходов к решению этой проблемы:
-
Использование отдельного IP-адреса для VPN: Это наиболее простой и рекомендуемый способ. Используйте разные IP-адреса для веб-сайта и для OpenVPN, чтобы избежать конфликтов в маршрутизации.
-
Настройка DNS-сервера: Самым элегантным и простым решением будет настройка DNS-сервера (например, с использованием
dnsmasq
) на вашем VPN-сервере. Это позволит клиентам VPN резолвить доменные имена ваших сайтов в внутренние IP-адреса, когда они подключены к VPN. -
Политическая маршрутизация: Если ваш клиент использует Linux, можно реализовать политическую маршрутизацию и использовать несколько таблиц для перенаправления только необходимых портов (например, HTTP/HTTPS) через VPN.
Пошаговая инструкция по настройке dnsmasq
-
Установите
dnsmasq
:sudo apt install dnsmasq
-
Настройте
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
-
Исключите
dnsmasq
для локальных запросов:
В файле/etc/default/dnsmasq
раскомментируйте строку:DNSMASQ_EXCEPT="lo"
-
Перезапустите
dnsmasq
:sudo systemctl restart dnsmasq
-
Проверьте конфигурацию:
С клиента, подключенного к VPN, убедитесь, что домен резолвится в внутренний IP:dig @172.27.224.1 mysite.mydomain.com -p 5353
-
Перенаправление 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
-
Настройка клиента OpenVPN:
В интерфейсе OpenVPN выберите "Использовать те же DNS-серверы, что и сервер доступа". Это позволяет клиентам автоматически использоватьdnsmasq
для разрешения имён.
Заключение
После выполнения указанных выше шагов пользователи OpenVPN смогут без проблем получать доступ к веб-сайтам, размещённым на одном сервере с VPN. Это решение обеспечивает как простоту, так и гибкость без необходимости глобально изменять сетевую инфраструктуру.