Always-VPN
Use VPN or On ne passe pas!
Интернет или только через VPN, или больше никак!
Last News
Вместо этого пакета теперь используется аналогичный скрипт для WireGuard.
Для чего
Есть, например, домашняя сетка. Во враждебном окружении разных провайдеров на пути до Интернета. Для решения таких задач придуман VPN, но он имеет свойство как “дозваниваться”, так и “отваливаться”. Требуется обеспечить, чтобы он был постоянно и гарантированно.
Есть подходяще звучащая технология Microsoft Always On VPN, но она заточена на подключение в сетям корпораций и требует много Microsoft как на той стороне, так и отнюдь небытовых редакций Windows на стороне клиента.
Есть аналогичные нагугленные решения (и больше вопросы) с использованием:
- Windows Firewall, но он плохо различает wireless и ras и правила у него типа “0-49,51-499,501-4499,4501-65535”, куда потом может понадобиться вставить еще сетевую печать, например.
- Ярлыка в автозагрузку, но потом Windows в какой-нибудь новой версии возьмет и перестанет давать права на жонглирование маршрутами.
- Постоянной проверки раз в 30 секунд, что VPN еще не отвалился.
- Перспективного PowerShell, но он так и не реализовал всей былой функциональности встроенной утилиты NETSH по работе с маршрутами, да и запускается он медленно, тогда как здесь важна быстрота реагирования.
Это решение по событиям:
- При входе любого пользователя,
- Появилось какое-то новое сетевое соединение,
- Пропало какое-то сетевое соединение,
- При разблокировании рабочей станции любым пользователем
удаляет все действующие к этому моменту маршруты по умолчанию (то есть выход в Интернет), очищает кэш маршрутов и прописывает едиственный маршрут только на IP указанного сервера VPN, а затем, если соединения с ним нет, поднимает его.
Настройка
Шаг 1: Создание VPN-соединения
Создать VPN-соединение в Windows, назвать его желательно одним английским словом и без пробелов (например, tunnel), адрес сервера указать в числовом виде IP - чтобы не зависеть от доступности DNS, не забыть указать “Использовать основной шлюз в удаленной сети” (“Use default gateway on remote network”)!
В современных Windows это запрятано достаточно далеко. Например, в версии 1803 надо зайти в настройки VPN, далее в Настройка параметров адаптера (справа - не при всякой ширине экрана и влезает), найти наш tunnel, правой кнопкой мыши Свойства, закладка Сеть, в списке IP версии 4 (TCP/IPv4), Свойства, Дополнительно, Параметры IP и там поставить эту галочку.
В процессе подключения Windows 8.1/10 может появиться ошибка вида Policy match error из-за отключенности AES-256-CBC and MODP2048 по умолчанию. Чтобы форсировать их использование, в реестр надо добавить параметр:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters]
"NegotiateDH2048_AES256"=dword:00000002
При использовании числового IP вместо символьного имени DNS скорее всего понадобится также добавить в реестр еще один параметр (или попробовать сервис sslip.io):
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters]
"DisableIKENameEkuCheck"=dword:00000001
Шаг 2: Прописывание констант
В файле always_vpn.cmd указать две используемые константы:
- название соединения (set vpn=tunnel)
- адрес сервера (set ip=IP).
Если название содержит пробелы, то здесь записывать БЕЗ кавычек - например, set vpn=VPN Tunnel IKEv2. Регистр значения не имеет. Тем не менее, всегда лучше, если такие названия будут одним английским словом.
Адрес лучше указывать цифрами (как 127.0.0.1, указанный для примера в программе), так как DNS может оказаться недоступен при удалении прежнего шлюза.
Также сохраните себе куда-нибудь на бумажку шлюзы по умолчанию с Ваших сетевых адаптеров - программа их очистит!
Шаг 3: Правильное размещение
Поместить файл always_vpn.cmd в защищенную от изменений пользователем папку (например, Windows), поскольку он запускается с админскими правами (требуется для удаления-добавления маршрутов) - чтобы не приписали чего.
Шаг 4: Планировщик заданий
Запустить Планировщик заданий Windows, импортировать в него прилагаемый файл always_vpn.xml и откорректировать местоположение запускаемого файла (по умолчанию это %windir%\always_vpn.cmd
).
При желании создать Триггеры самостоятельно, события подключения и отключения надо задать вручную:
- Журнал: Microsoft-Windows-NetworkProfile/Выполняется
- Источник: NetworkProfile
- Код события: 10000 (подключение) и 10001 (отключение)
Прекращение деятельности
При необходимости все отключить, надо:
- Отключить выполнение задания в Планировщике заданий,
- у статических (чаще кабельных) сетевых адаптеров прописать обратно их шлюз по умолчанию, который удалила эта программа,
- у адаптеров с DHCP (чаще это Wi-Fi) - просто переподключиться.
Заметьте: Пока задание в планировщике не остановлено, любые переподключения сетей не вернут выход в Интернет без поднятия заданного VPN! В этом ведь и заключается главная задача этой программы!
Если шлюз по умолчанию на бумажку не записали, то его можно посмотреть в правой колонке выдачи команды:
netsh int ipv4 show route | find "127.0.0.1/32"
где вместо 127.0.0.1 указать IP Вашего сервера.
IPv6
Данный код обрабатывает только IPv4, поскольку и Windows не добавляет маршрут IPv6 по умолчанию. Это можно сделать командой вида:
netsh interface ipv6 add route ::/0 interface=27
где 27 - для примера это наш интерфейс IKEv2. Или патчить strongSwan issue #817. Поэтому скрипт создания сервера также только IPv4.
Создание VPN-сервера
Собственно, создание самого сервера осуществляется скриптом vps-setup.sh
. Выполняются команды:
cd /tmp
wget https://raw.githubusercontent.com/diev/Always-VPN/master/vps-setup.sh
chmod u+x vps-setup.sh
./vps-setup.sh
Для скачивания также можно использовать сокращенный URL, но тогда с указанием имени для сохранения файла:
wget https://git.io/JemOz -O vps-setup.sh
Благодарности
Код скрипта создания сервера основан на проекте jawj/IKEv2-setup. Copyright (c) 2015 – 2018 George MacKerron. Released under the MIT licence.
Также скрипт использует проект ValdikSS/easy-rsa-ipsec для генерации сертификатов RSA для сервера и клиентов, forked from Easy-RSA 3. Copyright (C) 2013 by the Open-Source OpenVPN development community. Easy-RSA 3 license: GPLv2.
Лицензионное соглашение
Licensed under the Apache License, Version 2.0. Вы можете использовать этот код совершенно свободно без всяких ограничений с моей стороны и без претензий с Вашей.
Описание
Use VPN or On ne passe pas! Интернет или только через VPN, или больше никак!