{"id":19099218,"url":"https://github.com/diev/always-vpn","last_synced_at":"2026-05-27T21:30:14.960Z","repository":{"id":109040962,"uuid":"157586808","full_name":"diev/Always-VPN","owner":"diev","description":"Use VPN or On ne passe pas! Интернет или только через VPN, или больше никак!  ","archived":false,"fork":false,"pushed_at":"2021-04-07T13:20:51.000Z","size":28,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-03T01:29:13.718Z","etag":null,"topics":["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"],"latest_commit_sha":null,"homepage":"http://diev.github.io/Always-VPN/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/diev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-14T17:36:55.000Z","updated_at":"2023-04-30T18:35:25.000Z","dependencies_parsed_at":"2023-08-26T21:00:35.105Z","dependency_job_id":null,"html_url":"https://github.com/diev/Always-VPN","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FAlways-VPN","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FAlways-VPN/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FAlways-VPN/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FAlways-VPN/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/diev","download_url":"https://codeload.github.com/diev/Always-VPN/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240154954,"owners_count":19756548,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["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"],"created_at":"2024-11-09T03:49:10.249Z","updated_at":"2026-05-27T21:30:14.892Z","avatar_url":"https://github.com/diev.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Always-VPN]\n\n[![Build status]][appveyor]\n[![GitHub Release]][releases]\n\nUse VPN or On ne passe pas!  \nИнтернет или только через VPN, или больше никак!\n\n## Last News\n\nВместо этого пакета теперь используется аналогичный [скрипт для WireGuard].\n\n## Для чего\n\nЕсть, например, домашняя сетка. Во враждебном окружении разных провайдеров \nна пути до Интернета. Для решения таких задач придуман *VPN*, но он имеет \nсвойство как \"дозваниваться\", так и \"отваливаться\". Требуется обеспечить, \nчтобы он был постоянно и гарантированно.\n\nЕсть подходяще звучащая технология Microsoft *Always On VPN*, но она \nзаточена на подключение в сетям корпораций и требует много Microsoft как \nна той стороне, так и отнюдь небытовых редакций Windows на стороне клиента.\n\nЕсть аналогичные нагугленные решения (и больше вопросы) с использованием:\n\n* Windows *Firewall*, но он плохо различает *wireless* и *ras* и правила \nу него типа \"0-49,51-499,501-4499,4501-65535\", куда потом может \nпонадобиться вставить еще сетевую печать, например.\n* Ярлыка в автозагрузку, но потом Windows в какой-нибудь новой версии \nвозьмет и перестанет давать права на жонглирование маршрутами.\n* Постоянной проверки раз в 30 секунд, что VPN еще не отвалился.\n* Перспективного *PowerShell*, но он так и не реализовал всей былой \nфункциональности встроенной утилиты *NETSH* по работе с маршрутами, \nда и запускается он медленно, тогда как здесь важна быстрота \nреагирования.\n\nЭто решение по событиям:\n\n* При входе любого пользователя,\n* Появилось какое-то новое сетевое соединение,\n* Пропало какое-то сетевое соединение,\n* При разблокировании рабочей станции любым пользователем\n\nудаляет все действующие к этому моменту маршруты по умолчанию (то есть \nвыход в Интернет), очищает кэш маршрутов и прописывает едиственный маршрут \nтолько на *IP* указанного сервера VPN, а затем, если соединения с ним нет, \nподнимает его.\n\n## Настройка\n\n### Шаг 1: Создание VPN-соединения\n\nСоздать VPN-соединение в Windows, назвать его желательно одним английским\nсловом и без пробелов (например, *tunnel*), адрес сервера указать в числовом \nвиде *IP* - чтобы не зависеть от доступности DNS, не забыть указать \n*\"Использовать основной шлюз в удаленной сети\"* \n(*\"Use default gateway on remote network\"*)!\n\nВ современных Windows это запрятано достаточно далеко. \nНапример, в версии *1803* надо зайти в настройки *VPN*, далее в *Настройка \nпараметров адаптера* (справа - не при всякой ширине экрана и влезает), \nнайти наш *tunnel*, правой кнопкой мыши *Свойства*, закладка *Сеть*, \nв списке *IP версии 4 (TCP/IPv4)*, *Свойства*, *Дополнительно*, \n*Параметры IP* и там поставить эту галочку.\n\nВ процессе подключения Windows 8.1/10 может появиться ошибка вида \n*Policy match error* из-за отключенности *AES-256-CBC and MODP2048* \nпо умолчанию. Чтобы форсировать их использование, в реестр надо добавить \nпараметр:\n\n    [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RasMan\\Parameters]\n    \"NegotiateDH2048_AES256\"=dword:00000002\n\nПри использовании числового IP вместо символьного имени DNS скорее всего\nпонадобится также добавить в реестр еще один параметр (или попробовать сервис\n[sslip.io]):\n\n    [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RasMan\\Parameters]\n    \"DisableIKENameEkuCheck\"=dword:00000001\n\n### Шаг 2: Прописывание констант\n\nВ файле **always_vpn.cmd** указать две используемые константы:\n\n* название соединения (set vpn=*tunnel*) \n* адрес сервера (set ip=*IP*).\n\nЕсли название содержит пробелы, то здесь записывать БЕЗ кавычек - например, \nset vpn=*VPN Tunnel IKEv2*. Регистр значения не имеет. Тем не менее, \nвсегда лучше, если такие названия будут одним английским словом.\n\nАдрес лучше указывать цифрами (как *127.0.0.1*, указанный для примера в \nпрограмме), так как DNS может оказаться недоступен при удалении прежнего \nшлюза. \n\nТакже сохраните себе куда-нибудь на бумажку шлюзы по умолчанию с Ваших \nсетевых адаптеров - программа их очистит!\n\n### Шаг 3: Правильное размещение\n\nПоместить файл **always_vpn.cmd** в защищенную от изменений пользователем \nпапку (например, *Windows*), поскольку он запускается с админскими правами\n(требуется для удаления-добавления маршрутов) - чтобы не приписали чего.\n\n### Шаг 4: Планировщик заданий\n\nЗапустить *Планировщик заданий* Windows, импортировать в него прилагаемый \nфайл **always_vpn.xml** и откорректировать местоположение запускаемого \nфайла (по умолчанию это `%windir%\\always_vpn.cmd`).\n\nПри желании создать *Триггеры* самостоятельно, *события* подключения и \nотключения надо задать вручную:\n\n* Журнал: *Microsoft-Windows-NetworkProfile/Выполняется*\n* Источник: *NetworkProfile*\n* Код события: *10000* (подключение) и *10001* (отключение)\n\n## Прекращение деятельности\n\nПри необходимости все отключить, надо:\n\n* *Отключить* выполнение задания в *Планировщике заданий*, \n* у статических (чаще кабельных) сетевых адаптеров прописать обратно \nих *шлюз по умолчанию*, который удалила эта программа, \n* у адаптеров с DHCP (чаще это Wi-Fi) - просто переподключиться.\n\n**Заметьте:** Пока задание в планировщике не остановлено, любые \nпереподключения сетей не вернут выход в Интернет без поднятия заданного \nVPN! В этом ведь и заключается главная задача этой программы!\n\nЕсли шлюз по умолчанию на бумажку не записали, то его можно посмотреть \nв правой колонке выдачи команды:\n\n    netsh int ipv4 show route | find \"127.0.0.1/32\"\n\nгде вместо 127.0.0.1 указать *IP* Вашего сервера.\n\n## IPv6\n\nДанный код обрабатывает только IPv4, поскольку и Windows не добавляет \nмаршрут IPv6 по умолчанию. Это можно сделать командой вида:\n\n    netsh interface ipv6 add route ::/0 interface=27\n\nгде 27 - для примера это наш интерфейс IKEv2.\nИли патчить *strongSwan* issue [#817].\nПоэтому скрипт создания сервера также только IPv4.\n\n## Создание VPN-сервера\n\nСобственно, создание самого сервера осуществляется скриптом `vps-setup.sh`.\nВыполняются команды:\n\n    cd /tmp\n    wget https://raw.githubusercontent.com/diev/Always-VPN/master/vps-setup.sh\n    chmod u+x vps-setup.sh\n    ./vps-setup.sh\n\nДля скачивания также можно использовать сокращенный URL, но тогда с указанием\nимени для сохранения файла:\n\n    wget https://git.io/JemOz -O vps-setup.sh\n\n## Благодарности\n\nКод скрипта создания сервера основан на проекте [jawj/IKEv2-setup].\nCopyright (c) 2015 – 2018 George MacKerron.\nReleased under the [MIT licence].\n\nТакже скрипт использует проект [ValdikSS/easy-rsa-ipsec] для генерации\nсертификатов RSA для сервера и клиентов, forked from Easy-RSA 3.\nCopyright (C) 2013 by the Open-Source OpenVPN development community.\nEasy-RSA 3 license: GPLv2.\n\n## Лицензионное соглашение\n\nLicensed under the [Apache License, Version 2.0].\nВы можете использовать этот код совершенно свободно без всяких ограничений \nс моей стороны и без претензий с Вашей.\n\n[Wiki]: https://github.com/diev/Always-VPN/wiki\n[Идеи]: https://github.com/diev/Always-VPN/projects/1\n[Issues]: https://github.com/diev/Always-VPN/issues\n[releases]: https://github.com/diev/Always-VPN/releases/latest\n\n[CHANGELOG]: CHANGELOG.md\n[Apache License, Version 2.0]: LICENSE\n[MIT licence]: http://opensource.org/licenses/mit-license\n\n[Always-VPN]: http://diev.github.io/Always-VPN\n[sslip.io]: https://sslip.io/\n[#817]: https://wiki.strongswan.org/issues/817\n[jawj/IKEv2-setup]: https://github.com/jawj/IKEv2-setup\n[ValdikSS/easy-rsa-ipsec]: https://github.com/ValdikSS/easy-rsa-ipsec\n\n[скрипт для WireGuard]: https://github.com/burghardt/easy-wg-quick/\n\n[appveyor]: https://ci.appveyor.com/project/diev/always-vpn\n\n[Build status]: https://ci.appveyor.com/api/projects/status/bq1u869v35o09nai?svg=true\n[GitHub Release]: https://img.shields.io/github/release/diev/Always-VPN.svg\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiev%2Falways-vpn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiev%2Falways-vpn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiev%2Falways-vpn/lists"}