Подключение к удаленному серверу через VPN, когда адрес подсети локальной сети конфликтует с удаленной сетью


35

Это канонический вопрос о разрешении конфликтов подсети IPv4 между локальной сетью VPN-клиента и одной из них по каналу VPN-подключения от него.

После подключения к удаленному расположению через OpenVPN клиенты пытаются получить доступ к серверу в сети, которая существует в подсети, такой как 192.0.2.0/24. Однако иногда сеть в локальной сети клиента имеет один и тот же адрес подсети: 192.0.2.0/24. Из-за этого конфликта клиенты не могут подключиться к удаленному серверу, введя его IP-адрес. Они не могут даже получить доступ к общедоступному Интернету, когда подключены к VPN.

Проблема заключается в том, что эта подсеть 192.0.2.0/24 должна маршрутизироваться VPN, но также маршрутизироваться как локальная сеть клиента.

Кто-нибудь знает, как смягчить эту проблему? У меня есть доступ к серверу OpenVPN.


3
Вы можете попробовать установить статический маршрут для адреса / 32 хоста, к которому вы пытаетесь подключиться, и использовать VPN-узел в качестве шлюза и посмотреть, что произойдет.
— SpacemanSpiff

если концентратор vpn учитывает клиентские маршруты, то вашей безопасности периметра может потребоваться некоторая помощь. я получаю доступ к бухгалтерии, добавляю маршрут к инженерному диапазону и могу подключиться без проблем. Дрянные брандмауэры, такие как sonicwall, делают это
— nandoP

@SpacemanSpiff: Хотя это может решить проблему на стороне клиента, сервер все равно не сможет ответить, потому что он увидит, что соединение идет из его собственной сети, а не из VPN-клиента.
— Массимо

Ответы:


18

Это можно решить с помощью NAT; это просто не очень элегантно.

Таким образом, в предположении, что вы не можете решить эту проблему, имея внутренние сети, которые имеют настолько необычные номера сетей, что никогда не вступают в конфликт, вот принцип:

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

Поэтому оставайтесь со мной и делайте вид, что пока нет побочных проблем, так как я пишу, что для полного подключения вам потребуется NAT с обоих концов внутри туннеля, чтобы дифференцировать хосты и обеспечить маршрутизацию.

Делаем несколько сетей здесь:

  • Ваша офисная сеть использует 192.0.2.0/24
  • Ваш удаленный офис использует 192.0.2.0/24
  • Шлюз VPN вашей офисной сети скрывает 192.0.2.0/24 хоста за номером сети NAT 198.51.100.0/24
  • VPN-шлюз удаленной офисной сети скрывает 192.0.2.0/24 хоста за номером сети NATed 203.0.113.0/24

Таким образом, внутри VPN-туннеля офисные хосты теперь 198.51.100.x, а удаленные офисные хосты - 203.0.113.x. Кроме того, давайте притворимся, что все хосты сопоставлены 1: 1 в NAT их соответствующих VPN-шлюзов. Пример:

  • Хост вашей офисной сети 192.0.2.5/24 статически сопоставлен как 198.51.100.5/24 в NAT шлюза vpn офиса
  • Хост удаленного офиса 192.0.2.5/24 статически сопоставлен как 203.0.113.5/24 в NAT удаленного офиса шлюза vpn

Поэтому, когда хост 192.0.2.5/24 в удаленном офисе хочет подключиться к хосту с тем же ip в офисной сети, он должен сделать это, используя адрес 198.51.100.5/24 в качестве пункта назначения. Происходит следующее:

  • В удаленном офисе узел 198.51.100.5 - это удаленный пункт назначения, к которому можно подключиться через VPN и направить туда.
  • В удаленном офисе хост 192.0.2.5 маскируется как 203.0.113.5, поскольку пакет проходит функцию NAT.
  • В офисе хост 198.51.100.5 преобразуется в 192.0.2.5, когда пакет проходит функцию NAT.
  • В офисе обратный трафик на хост 203.0.113.5 проходит через тот же процесс в обратном направлении.

Таким образом, хотя есть решение, существует ряд проблем, которые необходимо решить, чтобы это работало на практике:

  • Маскарадированный IP должен использоваться для удаленного подключения; DNS становится сложным. Это связано с тем, что конечные точки должны иметь уникальный IP-адрес, если смотреть с подключенного хоста.
  • Функция NAT должна быть реализована на обоих концах как часть решения VPN.
  • Статическое сопоставление хостов является обязательным условием доступности с другого конца.
  • Если трафик является однонаправленным, только принимающая сторона нуждается в статическом отображении всех задействованных хостов; клиент может сойти с динамически NAT, если это желательно.
  • Если трафик двунаправленный, оба конца нуждаются в статическом отображении всех задействованных хостов.
  • Подключение к Интернету не должно быть нарушено независимо от того, является ли VPN разделенной или неразделенной.
  • Если вы не можете отобразить 1-к-1, это будет грязно; тщательная бухгалтерия является необходимостью.
  • Естественно, существует риск использования адресов NAT, которые также оказываются дубликатами :-)

Таким образом, решение этого требует тщательного проектирования. Если ваш удаленный офис действительно состоит из дорожных воинов, вы добавите в него ряд проблем:

  • они никогда не знают заранее, когда они заканчивают на перекрывающихся сетевых идентификаторах.
  • NAT шлюза удаленного офиса должен быть реализован на их ноутбуках.
  • офисному шлюзу потребуются две VPN, одна без NAT и одна с NAT, чтобы покрыть оба сценария. В противном случае, если кто-то выберет одну из подсетей, выбранных вами для метода NAT, ничего не получится .

В зависимости от вашего VPN-клиента вы можете автоматически выбрать одну VPN-сеть или другую в зависимости от сетевого адреса локального сегмента.

Заметьте, что все упоминания NAT в этом контексте обозначают функцию NAT, которая, так сказать, имеет место в перспективе туннеля. В процессе статическое преобразование NAT должно быть выполнено до того, как пакет «войдет» в туннель, то есть до того, как он будет инкапсулирован в транспортный пакет, который должен передать его через Интернет на другой VPN-шлюз.

Это означает, что не следует путать общедоступные IP-адреса шлюзов VPN (которые на практике также могут быть NAT: ed, но в то же время полностью вне перспективы передачи на удаленный сайт через VPN) с уникальными частными адресами, используемыми в качестве маскарадов. для дублирования частных адресов. Если эту абстракцию трудно изобразить, иллюстрация того, как NAT может быть физически отделена от шлюза VPN для этой цели, сделана здесь:
Использование NAT в перекрывающихся сетях .

Сжатие одного и того же изображения в логическом разделении внутри одной машины, способной выполнять функции шлюза NAT и VPN, просто делает тот же пример на шаг вперед, но при этом делает больший акцент на возможностях программного обеспечения под рукой. Взломать его вместе с, например, OpenVPN и iptables и опубликовать здесь решение было бы достойной задачей.

Программно это, безусловно, возможно:
PIX / ASA 7.x и более поздние версии
: пример IPsec VPN от локальной сети к локальной сети с перекрывающимися сетями и пример :
настройка туннеля IPSec между маршрутизаторами с дублирующимися подсетями локальной сети

Таким образом, фактическая реализация зависит от множества факторов, операционных систем, сопутствующего программного обеспечения и его возможностей, что немаловажно. Но это, безусловно, выполнимо. Вам нужно подумать и немного поэкспериментировать.

Я узнал об этом от Cisco, как видно по ссылкам.


Может ли NAT работать также со многими VPN-соединениями и их трансляциями? Я не совсем понял случай здесь. У меня есть тема здесь unix.stackexchange.com/q/284696/16920 о том, как сделать
— Лео Леопольд Герц

17

Если вам нужен временный грязный обходной путь для одного или нескольких известных ips сервера, самое простое решение должно быть вариантом статической маршрутизации на стороне клиента.

В моем случае я добавил желаемый целевой сервер (192.168.1.100) в свою таблицу маршрутизации на моем клиенте Linux через:

route add 192.168.1.100 dev tun0

После этого удалите этот статический маршрут с помощью команды route delete.


2
Это идеальное решение и даже идеальное время! :)
— Yuval A

Как долго это сохраняется? Пока вы не отключите? До перезагрузки?
— карбкатион

1
В моей системе linux (xfce с ubuntu / mint) настройки «теряются» после отключения vpn и да, также после перезагрузки. Вы можете проверить, активна ли настройка с помощью команды route (там будет запись с ip и устройством tun0, обычно внизу)
— Айдын К.

Маршрутная версия OSX использует интерфейс по-другому, так что вместо dev tun0вас нужно-interface tun0
— Сирены

5

да это худшее. для меня это происходило все время из гостиничных номеров, прежде чем администраторы vpn поняли, что им следует использовать более неясные диапазоны ip. 10.0.0.0/24 и 10.1.1.1/24 - худшие. если вы можете помочь, то никогда не делайте ip-соединение с такой беспроводной сетью.

поэтому ответ «исправить» wap, чтобы использовать другую внутреннюю сеть (например, 10.255.255.0/24), а затем дать вам аренду diff (то есть ip в диапазоне, который может перенаправить обратно в corp vpn), или если у вас нет / не могу получить админ на WAP, просто зайдите в Starbucks. или 20 минут вождения :)

если это просто в лабораторных условиях, просто используйте разные диапазоны.


Черт, правда? Нет лучшего варианта?
— Джон Рассел

1
не то, что я знаю .... это всегда было проблемой ... похоже, что кто-то отверг мой ответ, но на самом деле не предлагал решение .... убить посланника!
— nandoP

3

Я работаю на эль Капитан. Хотя приведенные выше предложения не помогли мне, они привели меня к рабочему решению:

  1. перед запуском VPN выполните ifconfig
  2. запустите VPN, сделайте ifconfigи отметьте, какой новый интерфейс. В моем случае это был ppp0 с IP-адресом 192.168.42.74

    ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
        inet 192.168.42.74 --> 192.0.2.1 netmask 0xffffff00
    
  3. введите:

    sudo route add 192.168.1.79  192.168.42.74
    

Сначала я проверил с помощью a, pingа затем доказал, что он работает, получив доступ к git-серверу.

Когда я попытался использовать dev ppp0 для конца команды route, как упоминалось выше, он жаловался.


2
Что 192.168.1.79происходит в этом обмене?
— карбкатион

Сервер назначения, к которому вы подключаетесь. Этот сервер находится в той же сети, что и VPN, а не локальное соединение.
— Карло дель Мундо

1

У меня есть простое решение, которое я использую в рабочей области с конфликтующим диапазоном IP-адресов (10.x)

Я подключился к сети с моего мобильного телефона, затем я поделился сетевым подключением через Bluetooth с моим ноутбуком. Теперь я могу использовать VPN для моего удаленного работодателя.

Я уверен, что это будет работать точно так же через USB, если вам нужно более быстрое соединение.


1
Эй, это на самом деле довольно умное решение.
— Натан Осман

1

Если вам просто нужно набрать один или два IP-адреса, добавьте инструкцию route в ваш файл конфигурации ovpn следующим образом:

Маршрут 192.168.1.10 255.255.255.255

Маршрут 192.168.1.11 255.255.255.255

Он добавит маршрут только для тех Ip'ов, когда вы подключите свой vpn, и удалите его, когда vpn отключил.

У меня все равно работало на Windows.


1

Ответ Айдына К. для linux. Если вы хотите одинаковую функциональность для окон, вы можете набрать

route ADD 192.168.1.10 <IP of tunnel adapter>

или

route ADD 192.168.1.10 IF <interface id>

Вы можете получить идентификатор интерфейса с помощью команды:

route print

0

Напомним, что эта проблема вызвана нехваткой адресов IPv4 в течение многих лет и широким использованием частного IP-диапазона за NAT для решения этой проблемы!

Идеальное и окончательное решение этой проблемы довольно простое (хотя оно может и будет занимать некоторое время для глобального развертывания): IPv6 ...

В мире IPv6 не существует дефицита общедоступных IP-адресов (и через несколько десятилетий этого не произойдет). Таким образом, нет причин не иметь публичный IP-адрес на каждом устройстве каждой сети. И если вам нужна изоляция сети, продолжайте фильтрацию с помощью брандмауэра, но без уродливого NAT ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.