Always-VPN

Use VPN or On ne passe pas! Интернет или только через VPN, или больше никак!


Project by Дмитрий Евдокимов Hosted on GitHub

Always-VPN

Build status GitHub Release

Use VPN or On ne passe pas!
Интернет или только через VPN, или больше никак!

Для чего

Есть, например, домашняя сетка. Во враждебном окружении разных провайдеров на пути до Интернета. Для решения таких задач придуман VPN, но он имеет свойство как “дозваниваться”, так и “отваливаться”. Требуется обеспечить, чтобы он был постоянно и гарантированно.

Есть подходяще звучащая технология Microsoft Always On VPN, но она заточена на подключение в сетям корпораций и требует много Microsoft как на той стороне, так и отнюдь небытовых редакций Windows на стороне клиента.

Есть аналогичные нагугленные решения (и больше вопросы) с использованием:

Это решение по событиям:

удаляет все действующие к этому моменту маршруты по умолчанию (то есть выход в Интернет), очищает кэш маршрутов и прописывает едиственный маршрут только на 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=VPN Tunnel IKEv2. Регистр значения не имеет. Тем не менее, всегда лучше, если такие названия будут одним английским словом.

Адрес лучше указывать цифрами (как 127.0.0.1, указанный для примера в программе), так как DNS может оказаться недоступен при удалении прежнего шлюза.

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

Шаг 3: Правильное размещение

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

Шаг 4: Планировщик заданий

Запустить Планировщик заданий Windows, импортировать в него прилагаемый файл always_vpn.xml и откорректировать местоположение запускаемого файла (по умолчанию это %windir%\always_vpn.cmd).

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

Прекращение деятельности

При необходимости все отключить, надо:

Заметьте: Пока задание в планировщике не остановлено, любые переподключения сетей не вернут выход в Интернет без поднятия заданного 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. Вы можете использовать этот код совершенно свободно без всяких ограничений с моей стороны и без претензий с Вашей.

Downloads

Релизы и инфо Скачать Дата