Как разделить VPN трафик в MacOS
Предположим, вы разработчик и часть ресурсов (например база данных) находятся в корпоративной сети, доступ в которую осуществляется через 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.
Теперь весь трафик идет через мое обычное соединение, а трафик к корпоративному серверу идет через VPN.
Для удобства в файле
/.profile создаем алиасы на команду добавления маршрутов
Теперь чтобы поднять соединение, необходимо подключиться к VPN и выполнить команду server-vpn-up.
Альтернативный вариант, это создать файл /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 и поднятии его в самый верх.
Источник
Маршрутизация в Mac OS при VPN подключении
Появилась как-то задача подключатся по VPN к рабочей сети, чтобы иметь доступ к внутренним ресурсам.
Средствами Мака это можно сделать создав VPN подключение и 2 варианта:
1. поставить галочку «Слать весь трафик через VPN подключение»
2. статически прописать статически route add -net 192.168.10.0/24 192.168.44.1, где 192.168.10.0/24 — сеть в которой находятся компьютеры на работе, 192.168.44.1 VPN шлюз к которому я подключаюсб.
Итак после каждого подключения нужно делать вторую манипуляцию, так как общий доступ в интернет ограничен и скорость не ахты. Или задача состоит в том чтобы ходить на сайты (например youtube) через более быстрый канал VPN…
Итак задачу я решил следующим образом:
создал скрипт: touch /etc/ppp/ip-up
дал ему прав на исполнение: chmod +x /etc/ppp/ip-up
создал файл для логов: touch /tmp/ppp.log
Содержимое скрипта:
#!/bin/sh
VPNWORK=»192.168.44.1″; #обьявляем переменную (например по названию VPN подключения)
if [ $IPREMOTE = $VPNWORK ] #проверяем, если совпадает добавляем маршрут
then
/sbin/route -n add -net 192.168.10.0/24 $IPREMOTE > /tmp/ppp.log 2>&1
fi
Таким образом после подключения к сети добавляется маршрут, и нет необходимости добавлять его вручную, так-же при отключении от VPN он удаляется сам.
При необходимости добавлять DNS сервер можно дописать текст между then и fi:
echo «nameserver 4.2.2.1» > /etc/resolv.conf
Вместо 4.2.2.1 укажите свой основной DNS и второй записью рабочий.
Но при этом после отключения нам надо вернуть предыдущий DNS конфиг на место, для этого создаем: touch /etc/ppp/ip-down && chmod +x /etc/ppp/ip-down
Перед началом работы делаем бекап:
cp /etc/resolv.conf /etc/resolv.conf_original
и добавляем в скрипт /etc/ppp/ip-down:
#!/bin/sh
cat /etc/resolv.conf_original > /etc/resolv.conf
Собственно всё. При каждом подключении VPN прописывается маршрут, работаете сколько надо, после отключения удаляется, при этом у вас не будет загвоздок с DNS.
Источник
taldanzig / osxvpnrouting.markdown
Routing tips for VPNs on OS X
When VPNs Just Work™, they’re a fantastic way of allowing access to a private network from remote locations. When they don’t work it can be an experience in frustration. I’ve had situations where I can connect to a VPN from my Mac, but various networking situations cause routing conflicts. Here are a couple of cases and how I’ve been able to get around them.
Case 1: conflicting additional routes.
In this example the VPN we are connecting to has a subnet that does not conflict with our local IP, but has additional routes that conflict in some way with our local network’s routing. In my example the remote subnet is 10.0.x.0/24, my local subnet is 10.0.y.0/24, and the conflicting route is 10.0.0.0/8. Without the later route, I can’t access all hosts on the VPN without manually adding the route after connecting to the VPN:
In the above case the VPN is a PPTP VPN that uses ppp0 as the network interface. With this additional route, I can now access all the hosts I need to on the VPN. This won’t solve the case of trying to access addresses on the 10.0.y.0/24 subnet though.
Case 2: conflicting subnet between VPN and local network.
Fairly often a VPN on a private address space subnet can end up conflicting with a local subnet. For example if both the remote and local networks share the 192.168.0.0/24 subnet then our VPN connection ends up being pretty useless as all of the remote addresses will end up being routed to the local network device.
It is possible to get around this in some cases as long as the VPN IP address doesn’t conflict directly with a local IP address that you need access to. In this case we need to add a specific route for the remote IP:
In the above case I’m routing the host 192.168.0.x (replace the x with your specific address) via the tun0 device (in this case an OpenVPN connection).
Useful commands to debug routing issues.
The following command will show the existing routing table (IPv4 only):
The following command will show you how a specific host will get routed:
Источник
Как выборочно маршрутизировать сетевой трафик через VPN на Mac OS X Leopard?
Я не хочу отправлять весь свой сетевой трафик вниз к VPN, когда я подключен к сети моей компании (через VPN) из дома. Например, когда я работаю из дома, я хотел бы иметь возможность создавать резервные копии всех своих файлов в Time Capsule дома и по-прежнему иметь доступ к внутренней сети компании.
Я использую встроенный VPN-клиент Leopard. Я попытался снять флажок » отправлять весь трафик через VPN-соединение.»Если я это сделаю, я потеряю доступ к внутренним веб-сайтам моей компании это через curl или веб-браузер (хотя внутренние IP-адреса все еще доступны). Было бы идеально, если бы я мог выборочно выбрать набор IP-адресов или доменов для маршрутизации через VPN и сохранить остальные в своей сети. Достижимо ли это с помощью встроенного VPN-клиента Leopard? Если у вас есть какие-либо рекомендации программного обеспечения, я хотел бы услышать их, а также.
4 ответов
создать файл / etc/ppp / ip-up следующего содержания:
замена С подсетью вы хотите маршрутизировать через VPN (например. 192.168.0.0/16)
выполнить от имени root:
этот файл будет выполняться при каждом подключении к VPN.
- : интерфейс VPN (например, ppp0 )
- : неизвестный, был 0 в моем случае
- : IP сервера VPN
- : адрес VPN-шлюза
- : обычный (не vpn) шлюз для подключения к локальной сети
Я хотел сделать нечто подобное. Подключите VPN, а затем маршрутизируйте дополнительную сеть через эту VPN. Я закончил со следующим битом Applescript:
вам нужно изменить «Work» к имени вашего VPN соединения, 192.168.1.1 на ваш адрес шлюза и 172.16.0.0/16 в адрес сети, к которой вы хотите маршрут. Дополнительные сети можно добавить, повторив последнюю строку с разными адресами.
есть скрытая функция в настройках сети на MacOS:вы можете сортировать интерфейсов.
открыть системные настройки — > Сеть — > нажмите gear внизу слева -> Set service Order.
важно, что у вас есть сетевые интерфейсы, отсортированный в порядке, вы хотите их использовать. Если вы хотите, чтобы все данные, не относящиеся к локальной сети, интерфейс VPN наверху. Вроде такой
таким образом, нет необходимости проверять следующие настройки в Session Options :
отправить весь трафик через VPN-соединение
Источник
Как заставить разделенную туннельную маршрутизацию на Mac Cisco VPN
Кто-нибудь знает, как взломать таблицу маршрутизации (на Mac), чтобы победить форсирование VPN-маршрутизации для каждой вещи через VPN cisco? почти все, что я хочу сделать, это иметь только адреса 10.121. * и 10.122. * через VPN и все остальное прямо в Интернет.
Следующее работает для меня. Запустите их после подключения к Cisco VPN. (Я использую встроенный клиент Cisco OS X, а не фирменный клиент Cisco.)
замещать 10 в первой команде с сетью, которая находится на другой стороне туннеля.
замещать 192.168.0.1 с вашим локальным сетевым шлюзом.
Я поместил это в скрипт bash, вот так:
Я также нашел объяснение того, как запустить это автоматически когда вы подключаете VPN, но уже поздно в пятницу, и я не испытываю желания попробовать это 🙂
Редактировать:
С тех пор я оставил работу, где я использовал Cisco VPN, так что это из памяти.
10 в первой команде указывается сеть, которую вы хотите маршрутизировать через VPN. 10 короткая рука для 10.0.0.0/8 , В Дело Туана Ань Чана, похоже, что сеть 192.168.5.0/24 ,
Что касается того, какой шлюз нужно указать во второй команде, это должен быть ваш локальный шлюз. Когда вы входите в VPN, которая предотвращает раздельное туннелирование, она применяет эту политику, изменяя таблицы маршрутизации так, чтобы все пакеты маршрутизировались на виртуальном интерфейсе. Таким образом, вы хотите изменить маршрут по умолчанию обратно на то, что было до получения по VPN ,
Самый простой способ выяснить шлюз, это запустить netstat -rn перед входом в VPN и посмотрите на IP-адрес справа от места назначения по умолчанию. Например, вот как это выглядит на моей коробке прямо сейчас:
Мой шлюз 10.0.1.1 — он находится справа от пункта назначения по умолчанию.
С использованием информация из mehaase, Я написал скрипт на Python, который действительно упрощает этот процесс на Mac. Когда вы запустите его, скрипт сохранит информацию о вашем брандмауэре, запустит клиент AnyConnect, дождется входа в систему, затем исправит маршруты и брандмауэр. Просто запустите скрипт из «терминала».
Сценарий Python в этот предыдущий ответ было полезно, однако, он не заботился о маршрутах, которые AnyConnect использовал для захвата других интерфейсов устройства (таких как интерфейсы VMware). Он также не мог обрабатывать несколько сетей VPN.
Вот скрипт, который я использую:
Скорее всего, ваш администратор должен настроить VPN-подключения для использования локальной маршрутизации для подсетей 10.121. * И 10.122. * И позволить удаленному (вашей домашней машине) маршрутизировать все остальные запросы. (это экономит их пропускную способность и ответственность)
Используете ли вы Cisco VPN-клиент? ОС OS X?
если вы используете VPN в OS X (настраивается через панель настроек сети), вы можете нажать «Дополнительно» и выбрать вкладку «VPN по требованию». затем укажите необходимые подсети для использования VPN.
Вы должны иметь возможность попросить администратора маршрутизатора, к которому вы подключаетесь, создать отдельную «группу», которая выполняет раздельное туннелирование, и предоставить вам файл PCF, который содержит имя группы и пароль группы для этой группы.
У меня была такая же проблема, и я получил эту работу благодаря @mehaase
/vpn.sh в ответ на вопрос @mehaase вы можете поместить это в сценарий автоматизированного запуска приложения, выполнив следующие действия:
- С помощью Automator создайте новое приложение
- Добавьте «Запустить AppleScript» в разделе «Библиотека» & gt; коммунальные услуги
- Войти: do shell script «sudo
/vpn.sh» with administrator privileges
Вам также может понадобиться запустить chmod 700
/vpn.sh из терминала, чтобы дать сценарию права на выполнение.
После подключившись к VPN, вы можете просто запустить этот скрипт приложения. Введите пароль администратора и нажмите ОК — Готово. 🙂
Я хотел собственное «приложение», которое я мог бы запустить при входе в систему (и продолжать работать / скрыто), чтобы включить маршрутизацию Split Tunnel, аналогично функции Locamatic , Возможно, в какой-то момент я раскошелюсь на Locamatic и поиграюсь с ним. Я также могу загрузить этот AppleScript в Github. Я не хотел связываться с демоном, как этот ответ подсказывает.
Этот сценарий предполагает, что VPN имеет значение по умолчанию VPN (Cisco IPSec) имя и VPN-маршрут 10.10.10.1/22 & GT; 10.10.20.10 , Их нужно будет изменить / добавить дополнительные маршруты. Запустите терминал & gt; netstat -rn когда VPN подключен (до включения этого скрипта), чтобы увидеть VPN-добавленные маршруты.
Этот скрипт также генерирует уведомления в стиле рычания в Центре уведомлений 🙂
Я столкнулся с некоторыми проблемами с Марк Э. Хаас «s ответ как мой Cisco VPN изменяет существующий шлюз от UCSc к UGScI (специфичный для интерфейса en0) и добавляет шлюз VPN как UCS маршрут, требующий удаления двух шлюзов по умолчанию и добавления обратно оригинал UGSc шлюз по умолчанию
Слава Богу, StackExchange / google, это мой первый AppleScript, и я бы не смог собрать его без нескольких часов поиска в Google.
Предложения / исправления / оптимизации приветствуются!
сохранить как приложение:
щелкните правой кнопкой мыши & gt; показать содержимое пакета, добавьте в info.plist следующее (это скрывает значок приложения от дока, что требует использования Activity Monitor или терминала & gt; pkill -f ‘Split Tunnel’ чтобы выйти из приложения, пропустите, если вы хотите значок док-станции:
создать новую однострочную routeNOPASSWD файл (без расширения), используя следующий код точно (это может помешать доступу sudo, если сделано неправильно, Google visudo для получения дополнительной информации — это позволяет командам sudo в AppleScript запускать БЕЗ запроса пароля, пропустите, если вы хотите запросить пароль, когда необходимо изменить таблицу маршрутизации):
скопируйте этот файл в /etc/sudoers.d
выполните следующие команды в терминале (вторая команда запросит пароль — это позволяет sudo route команды в AppleScript для запуска БЕЗ запроса пароля, пропустите, если запрос пароля требуется, когда скрипт изменяет таблицу маршрутизации)
наконец, добавьте приложение в системные настройки & gt; Пользователи и группы & gt; элементы входа
Источник