Назад | Перейти на главную страницу

openvpn: как не использовать VPN для доменов с несколькими IP-адресами

Я хочу обойти openvpn для определенного домена. Я пытался:

allow-pull-fqdn
route specificdomain.com 255.255.255.255 net_gateway

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

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

Я также пытался:

push "route specificdomain.com 255.255.255.255 net_gateway"

Хотя я признаюсь, читая документы, я до сих пор не понял, в чем разница - хотя здесь она не отображается в моей таблице маршрутизации и не работает (даже если я использую домен с одним IP-адресом)

Есть ли способ заставить openvpn не маршрутизировать домены с несколькими IP-адресами, подобными этому, или уже слишком поздно в маршрутизации для openvpn узнать, какой домен мы изначально запрашивали, и я лучше всего попытаться придумать набор IP-адресов, которые в настоящее время соответствуют домену?

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

При добавлении маршрутов вы можете добавить маршрут к определенному доменному имени, но это имя преобразуется DNS в IP-адрес перед добавлением в таблицу маршрутизации. Также обратите внимание, что ваша таблица маршрутизации не будет обновляться, если IP-адрес в записи DNS изменится.

В основном ваши варианты:

1: при запуске VPN добавьте маршрут ко всем конкретным именам хостов, к которым вы собираетесь получить доступ без VPN. Имена будут немедленно разрешены, но это может не иметь значения, если только IP-адреса не изменятся очень быстро.

2: выяснить все сетевые блоки, которые использует целевой домен, и настроить для них маршрутизацию без VPN. Однако в некоторых случаях невозможно определить сетевые блоки.

3: измените логику маршрутизации: отбросьте правило «маршрутизировать все через vpn», маршрутизируйте только определенные сетевые блоки через vpn (вы, скорее всего, знаете их, чем сетевые блоки определенного домена, который вы не контролируете), и пусть маршрут по умолчанию возьмите весь трафик, не связанный с vpn, в Интернет без vpn.

Как объясняли другие, теоретически это невозможно, потому что маршрутизация не знает DNS-имя назначения, которое использовалось для получения IP-адреса назначения. Однако вы можете делать то, что @Bass описал как «рубленый» DNS. Во-первых, настройте свой собственный DNS (я использую Raspberry Pi в качестве VPN-маршрутизатора, поэтому у меня есть все преимущества Linux, советую вам не делать этого на своей рабочей станции с Windows :). Используйте dnsmasq с отключенным DHCP и сначала настройте его как DNS-сервер с чистым кешированием, используя dnsmasq.conf следующим образом:

log-queries          # Logging
log-async            # Async logging    
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
server=8.8.8.8       # Use Google DNS 1 upstream
server=8.8.4.4       # Use Google DNS 2 upstream

После того, как вам удастся принудительно настроить собственный DNS на машины (настольные компьютеры и другие вещи, например chromecast, tv и т. Д.) И убедиться, что он работает, вы можете начать взламывать. Запустите программу / приложение или зайдите на сайт, который вы хотите перенаправить, а затем на машине маршрутизации, которую вы делаете:

sudo killall -SIGUSR1 dnsmasq
tail /var/log/syslog

Теперь у вас есть хороший дамп недавно использованных IP-адресов вместе с их именами (любое достойное приложение будет пытаться получить доступ к DNS, я считаю, что никто больше не будет жестко кодировать IP-адреса).

Теперь вы перезапускаете dnsmasq или машину маршрутизации (чтобы убедиться, что очистили кеш) и принудительно получаете доступ к DNS Google, который обходит OpenVPN, например сделав что-то вроде этого:

sudo route add -net 8.8.8.8 netmask 255.255.255.255 gw 192.168.1.1 dev eth0
sudo route add -net 8.8.4.4 netmask 255.255.255.255 gw 192.168.1.1 dev eth0

Для ясности: eth0 - это сетевой интерфейс, который идет к моему интернет-провайдеру, а 192.168.1.1 - это адрес шлюза, который обходит VPN. Теперь вы повторяете упражнение с запуском приложения / веб-сайта / устройства и сброса имен и IP-адресов. Теперь они должны быть другими.

Снова перезапустите маршрутизатор (чтобы избавиться от указанных выше временных маршрутов) и выполните следующие две вещи для каждого IP-адреса:

  1. Добавьте адресную строку в dnsmasq.conf для каждого адреса, чтобы принудительно разрешить IP-адрес вне vpn-адреса, полученный на втором этапе, как показано ниже:

    адрес = / www.avoidvpn.com / off.vpn.ip.oblished

  2. Добавьте маршрут для конкретного адреса в конфигурацию маршрутизации (необходимо выполнять после каждой перезагрузки или сохранять как постоянный маршрут)

    sudo route add -net off.vpn.ip. получена сетевая маска 255.255.255.255 gw 192.168.1.1 dev eth0

Опять же, предполагая, что 192.168.1.1 - это шлюз без vpn.

Предостережения

  1. Это ужасное решение
  2. Меня устраивает
  3. IP-адреса могут измениться в любой момент, и настройка станет недействительной.
  4. К счастью, сценарий из 3. встречается нечасто, если для балансировки нагрузки или ограничения содержимого используются разные IP-адреса (например, вы бы обошли эти механизмы, но IP-адреса все равно будут работать).
  5. Не знаете, что подумают люди, обслуживающие сервер, когда они получат трафик с IP-адресов, которых не должно существовать (например, кто-то пытается передать нагрузку на другой IP-адрес, в то время как вы с радостью продолжаете доступ к серверу, который теоретически не должен быть под нагрузкой).

Надеюсь, это поможет, но да, это ужасное решение. Удачи и удачи!

  allow-pull-fqdn
  push "dhcp-option DNS 10.0.0.1"

  route thehost.com 255.255.255.255 vpn_gateway