VPN и Интернет в одном флаконе

Или, выражаясь умными словами, split tunneling.

Преамбула

Есть желание при подключении VPN в Windows использовать его только для доступа к внутренним ресурсам.

Проблемы

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

Возможное решение

Итак, хочется настроить split tunneling, чтобы для внутренних ресурсов трафик ходил через VPN и использовался внутренний DNS-сервер (чтобы можно было просто обращаться к внутренним ресурсам), а весь оставшийся трафик продолжал ходить через стандартный шлюз. Понятно, что всё это можно автоматизировать скриптами, но хочется, чтобы эти скрипты отрабатывали автоматически при подключении VPN-соединения и отменяли всё, что может помешать, после его разрыва.

Guide

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

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

Итак, приступим:

  1. Настраиваем параметры подключения VPN. Нужно отключить перенаправление всего трафика через это соединение при подключении:

    • Сетевые подключения → Свойства VPN → Сеть → IPv4 → Свойства → Дополнительно… → Убрать галку "Использовать основной шлюз в этой сети"

    Network Connections → VPN Connection → Properties → Networking → IPv4 → Properties → Advanced... → Uncheck "Use default gateway on remote network"

  2. Теперь хочется привязать выполнение скриптов к моменту установления подключения. Для этого воспользуемся Журналом событий Windows (это косметика, можно сразу переходить к шагу 3):
    • Пуск → Компьютер → Управление → Просмотр событий → Журналы Windows
    • В журнале Приложения найти событие о подключении VPN (код события: 20225; источник: RasClient)
    • В контекстном меню выбрать Привязать задачу к событию… (параметры см. далее):
      Start → Computer → Manage → Event Viewer → Windows Log → Application
  3. Созданные задания находятся чуть выше в консоли; нужно их отредактировать (или сразу создавать):

    • Планировщик заданий → Библиотека планировщика заданий → Задачи просмотра событий
    • Находим (или создаём вручную, если был пропущен шаг 2) наше задание, жмём Свойства:
      Task Scheduler → Task Scheduler Library → Event Viewer Tasks → <Our task> → Properties
    • Общие → Отметить “Выполнить с наивысшими правами”
      General → Check "Run with highest privileges"
    • Триггеры → При событии; журнал: Приложение; источник: RasClient; код события: 20225 (только если создаём руками)
    • Некоторые промежуточные действия, необходимые для дальнейших сценариев.
      Нужно узнать номер основного подключения, через которое осуществляется подключение к Интернету. Это можно сделать, выполнив в командной строке команду route print и посмотрев на Список интерфейсов:
      route print → Intrface List
    • Действия. Должно быть 2 штуки, оба типа “Запуск программы”:
      1. Программа или сценарий: netsh; добавить аргументы: interface ipv4 add route prefix=192.168.64.0/23 interface=17 metric=200 (здесь 192.168.64.0/23 – параметры внутренней сети; 17 – номер VPN подключения; 200 – метрика, чем меньше, тем более предпочтительна)
      2. Программа или сценарий: netsh; добавить аргументы: dnsclient add dnsservers 11 192.168.64.252 1 (здесь 11 – номер основного подключения; 192.168.64.252 – адрес DNS-сервера во внутренней сети; 1 – номер в списке DNS-серверов):

      Actions

    • Условия
      1. Отключить “Запускать только при питании от электросети” (опционально)
      2. Включить “Запускать только если подключении к следующей сети” и выбрать VPN-соединение:

      Conditions →

    • Параметры. При желании можно включить опцию “Остановить задачу, выполняемую дольше 1 минуты”:
      Settings → Check "Stop the task if it runs longer than: 1 minute"
  4. Теперь подобным образом нужно добавить выполнение скриптов, отменяющих наши манипуляции со списком DNS-серверов на основном соединении (если что-то пойдёт не так, то всё будет работать, просто время разрешения имён может возрасти):
    • Триггеры. Журнал: Система; источник: RasMan; код события: 20268
    • Действия. Команда: netsh; параметры: dnsclient delete dnsservers 11 192.168.64.252 (параметры те же, что и в соответствующей команде из п.3):
      Adding command on disconnect
  5. Проверяем работоспособность. Для этого пингуем / трэйсим какой-нибудь внутренний и внешний ресурс:
    Pinging addresses on intra- and internet

Заключение

Про IPv6 и DirectAccess мы поговорим как-нибудь в другой раз 🙂


Comments

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *