VPN
VPN (англ. Virtual Private Network — виртуальная частная сеть — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например, Интернет) WikiPedia


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

Если вы посмотрите на все доступные инструкции как настраивать VPN на Mac OS, то увидите что авторы говорят вам ставить галку «отправлять весь трафик через VPN», что приводит к тому, что (Капитан Очевидность) весь трафик идет через VPN, что в свою очередь накладывает все ограничения корпоративной сети (запрет на посещение отдельных ресурсов, закрытые порты и т.д.) или ограничения сервиса анонимизации (узкий канал, долгий ping и т.д.).

Возникает вопрос — нельзя ли через VPN пускать только определенный трафик, а весь остальной (основной) трафик пусть идет по обычному каналу без ограничений.

Делается это довольно просто.



Кратко пройдемся по настройке VPN соединения.

Нажимаем на «яблочко» в левом верхнем углу экрана и выбираем «Системные настройки».


Выбираем «Сеть»


Нажимаем на «плюсик» в списке сетевых соединений.


Выбираем «VPN»


Тип VPN (в моем случае это L2TP через IPSec)


Заполняем параметры соединения


Галку «Отправлять весь трафик через VPN» не ставим


Теперь нам надо узнать интерфейс через который идет VPN-трафик.

Запускаем ifconfig без подключенного VPN


Подключаем VPN и снова запускаем ifconfig


Видим что появился интерфейс ppp0

Теперь по умолчанию весь трафик идет по обычному соединению (не VPN).

Далее, мне нужно чтобы коннекты к моему серверу, расположенному по адресу 192.168.0.20 шли через VPN. Для этого нам нужно построить сетевой маршрут. Воспользуемся штатной unix-командой route.

sudo /sbin/route add -host 192.168.0.20 -interface ppp0


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

Для удобства в файле ~/.profile создаем алиасы на команду добавления маршрутов

alias server-vpn-up='sudo /sbin/route add -host 192.168.0.20 -interface ppp0'


Теперь чтобы поднять соединение, необходимо подключиться к VPN и выполнить команду server-vpn-up.

Альтернативный и более удобный вариант, указанный в комментариях shadowalone, это создать файл /etc/ppp/ip-up, прописать в него в моем случае

#!/bin/sh
/sbin/route add 192.168.0.0/24 -interface $1


и дать права на выполнение

chmod 0755 /etc/ppp/ip-up


После этого маршрут будет прописываться автоматически после соединения с VPN.

Какие могут встретиться подводные камни.

1. Может быть конфликт IP-адресов, если внутренняя и внешняя сеть используют одно адресное пространство (возможно я использую не правильный термин, поправьте в комментариях пожалуйста). Т.е. у вас и VPN и внутренняя домашняя сеть находятся в 192.168.0… В моем случае решением было перенастройка домашней сети на 10.0.1…

2. При подключении VPN автоматически ставился корпоративный DNS 192.168.0.7. И хотя весь трафик должен был идти вроде как не через VPN, все сайты переставали открываться. Решилось это добавлением Google-ового DNS 8.8.8.8 и поднятии его в самый верх.

Комментарии (6)


  1. agent10
    05.12.2015 20:28

    Какие есть варианты автоматически приписывать маршрут после поднятия VPN соединения? В Mavericks я использовал /etc/ppp/ip-up который вызывается каждый раз при поднятии соединения, но начиная с Yosemite это перестало работать вроде…


    1. shadowalone
      05.12.2015 23:16
      +1

      Использовать OpenVPN например — он отдает маршруты.


    1. shadowalone
      05.12.2015 23:56

      И да, в 10.11.1 прекрасно работает /etc/ppp/ip-up

      то есть, создаем файл /etc/ppp/ip-up:
      #!/bin/sh
      /sbin/route add 10.10.10.0/24 -interface $1

      даём ему права на выполнение:
      chmod 0755 /etc/ppp/ip-up

      и все работает, маршруты поднимаются как только поднимаешь vpn соединение, только что, на всякий случай, еще раз проверил.

      Так что вся эта статья — бред недоучки, не иначе.


      1. DVLev
        06.12.2015 00:29
        +1

        По существу вопроса Вы правы — указанный Вами способ удобнее моего. Добавил его в статью.


  1. shadowalone
    05.12.2015 23:31

    Статья уровня «начальной школы», где автор безгранично долго и подробно раскрывает описание «route add» — о чём, несомненно, знает большая часть посетителей данного ресурса.


    1. shadowalone
      05.12.2015 23:42
      +4

      Минусаторы, объясните свои минусы пожалуйста.
      Ибо, в статье действительно ничего нет — просто пшик вокруг добавления маршрута вручную. То есть всё это множество картинок и слов вокруг, красиво обволакивают одну единственную команду «route add» — знание которой первично, при знакомстве с сетями, даже простого уровня.