An open API service indexing awesome lists of open source software.

https://github.com/diev/always-vpn

Use VPN or On ne passe pas! Интернет или только через VPN, или больше никак!
https://github.com/diev/always-vpn

batch-script cmd default gateway ikev2 ikev2-setup ip ipv4 netsh network routes scheduled-tasks shell-script strongswan-vpn tunnel vpn vpn-connections vpn-gateway

Last synced: 8 months ago
JSON representation

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

Awesome Lists containing this project

README

          

# [Always-VPN]

[![Build status]][appveyor]
[![GitHub Release]][releases]

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

[Wiki]: https://github.com/diev/Always-VPN/wiki
[Идеи]: https://github.com/diev/Always-VPN/projects/1
[Issues]: https://github.com/diev/Always-VPN/issues
[releases]: https://github.com/diev/Always-VPN/releases/latest

[CHANGELOG]: CHANGELOG.md
[Apache License, Version 2.0]: LICENSE
[MIT licence]: http://opensource.org/licenses/mit-license

[Always-VPN]: http://diev.github.io/Always-VPN
[sslip.io]: https://sslip.io/
[#817]: https://wiki.strongswan.org/issues/817
[jawj/IKEv2-setup]: https://github.com/jawj/IKEv2-setup
[ValdikSS/easy-rsa-ipsec]: https://github.com/ValdikSS/easy-rsa-ipsec

[скрипт для WireGuard]: https://github.com/burghardt/easy-wg-quick/

[appveyor]: https://ci.appveyor.com/project/diev/always-vpn

[Build status]: https://ci.appveyor.com/api/projects/status/bq1u869v35o09nai?svg=true
[GitHub Release]: https://img.shields.io/github/release/diev/Always-VPN.svg