Как сделать vpn habr
Перейти к содержимому

Как сделать vpn habr

  • автор:

Как мы свой VPN поднимали

Я и мой коллега Артём — backend‑разработчики, пишем на Ruby. Когда мы только начали работать, в компании использовались две сторонние службы VPN (не буду их называть), которые со временем перестали по определённым причинам работать. На одном из собраний наш тимлид предложил руководству создать свой VPN, и backend‑отдел готов был попробовать придумать что‑то своё, используя базу OpenVPN.

Для начала мы решили заняться изучением требований под сервер. Нехитрым поиском в пару запросов было выяснено, что:

  1. OpenVPN занимает очень мало места на диске, да и вообще не сильно требовательный;
  2. в среднем на 100 пользователей хватает 1 Гб оперативной памяти.

Под эти запросы мы начали искать VPS хостинг, предварительно сделали список всех возможных кандидатов и, согласовав с руководителем, выбрали тот, на котором, как оказалось, у нас уже была снята одна машина. Хостинг пока не буду называть.

Поскольку я и мой коллега Артем никогда ничем подобным не занимались, пришлось подробно узнать, как это делается. Всю настройку сервера выполняли по найденной информации. Сам VPN мы поставили на машину под управлением Ubuntu 20.04.

Сначала мы выполнили первичную настройку сервера:

  1. Настроили вход по ssh‑ключу.
  2. Создали пользователя без привилегий root.
  3. Настроили базовый брандмауэр.
  4. Активировали внешний доступ для стандартного пользователя.

Затем настроили центр сертификации на сервере:

  1. Установили набор скриптов easy‑rsa.
  2. Создали папку для работы со скриптами.
  3. Создали PKI (инфраструктура открытых ключей) для центра сертификации.
  4. Подписали сертификат для нашего сервера.

Далее мы установили OpenVPN непосредственно на сервер и приступили к настройке.

Вот основные шаги для того, чтобы сделать всё правильно:

  1. Инициализировать PKI для OpenVPN (для создания ключей и их подписи для пользователей).
  2. Создать сертификат сервера и закрытый ключ для OpenVPN.
  3. Подписать сертификат с помощью центра сертификации, который в дальнейшем нужно провалидировать.
  4. Настроить криптографические материалы.

Для генерации ключей и защищённых подписей пользователей мы использовали криптографию на эллиптитческих кривых Elliptic Curve Cryptography (ECC). Использование ECC для обмена ключами значительно быстрее, чем использование простого алгоритма Диффи‑Хеллмана с классическим алгоритмом RSA, так как числа намного меньше, а вычисления выполняются быстрее.

  1. Настроить OpenVPN под нужные нам параметры.

OpenVPN уже идёт с примером файла конфигурации, в котором надо лишь изменить значения на нужные. Например, мы поменяли стандартный tls-auth на tls-crypt , так как при tls-crypt скрывается инициализация handhaske’а на сервере, это безопаснее и надёжнее с точки зрения обнаружения использования VPN.

Также мы поменяли стандартный криптографический шифр AES-256-CBC на AES-256-GCM, поскольку он обеспечивает более высокий уровень шифрования, производительности и лучше поддерживается современными клиентами OpenVPN.

В предыдущем шаге мы отказались от алгоритма Диффи-Хеллмана, так что надо найти строчку, которая отвечает за него, закомментировать или удалить её и указать dh none.

Далее нам нужно запустить OpenVPN без привилегий, с которыми он запущен, поэтому нам нужно указать на необходимость запуска с пользователем nobody и группой nogroup. Чтобы активировать эту возможность, найдите и раскомментируйте строки user nobody и group nogroup, удалив « в начале каждой строки.

Также мы изменили DNS и перенаправили весь наш трафик через сеть VPN. Для этого мы раскомментировали эти строки:

push «redirect-gateway def1 bypass-dhcp»

push «dhcp-option DNS 208.67.222.222»

push «dhcp-option DNS 208.67.220.220»

Последние две строки — это просто публичные DNS.

Помимо этого мы поменяли порт на 443 и протокол с udp на tcp.
Если вы также решите это делать, то не забудьте поменять значение с 1 на 0 в этой строке:

  1. Настроить конфигурации сети сервера OpenVPN. Для этого в файле /etc/sysctl.conf мы добавили следующую строчку в конце:

И применили данную настройку:

  1. Настроить брандмауэр под OpenVPN.

Прежде чем добавлять правила маскарадинга, необходимо предварительно найти публичный сетевой интерфейс сервера.

ip route list default

На выходе получаем что-то вроде такого:

Output

default via 159.65.160.1 dev eth0 proto static

Выделенный текст может отличаться — это то значение, которое нам понадобится в дальнейшем.

Далее открыли /etc/ufw/before.rules и добавили следующие правила, которые нам необходимы до загрузки обычных правил брандмауэра

# START OPENVPN RULES

*nat

:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE

COMMIT

# END OPENVPN RULES

Выделенный текст заменили на обнаруженный нами ранее сетевой интерфейс.

Для применения нужных нам правил в файле /etc/default/ufw мы поменяли значение с DROP на ACCEPT в данной строчке:

DEFAULT_FORWARD_POLICY=»ACCEPT»

А затем просто добавили новые правила в наш брандмауэр. В нашем случае это было:

sudo ufw allow 443/tcp

так как мы поменяли порт и протокол. И перезапустили брандмауэр.

  1. Запустить OpenVPN на сервере, проверить рабочий статус.
  2. Настроить конфигурацию клиентской части.

Так как предполагалось, что ключей будет создаваться достаточно много, то мы решили, что возьмём некую базовую конфигурацию, которая будет применяться для всех, меняя лишь сертификаты и ключи, которые индивидуальны для каждого. Для этого мы воспользовались готовым файлом client.conf, который предлагает OpenVPN и поменяли некоторые значения под наши:

  • в строчке с remote мы указали адрес нашего сервера, на котором находится OpenVPN,
  • указали 443 порт,
  • поменяли протокол на tcp,
  • закомментировали строки, которые указывают на файлы с ключами и сертификатами,
  • указали зеркальные настройки шифрования, как на нашем сервере,
  • закомментировали директиву tls-auth , так как указываем ключ в файле и используем tls-crypt ,
  • добавили строку:

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

  1. Создать первые тестовые сертификаты клиента и пары ключей.
  2. Скачать и протестировать.

Вуаля, всё работает!

Хочу посоветовать вам быть внимательнее на выше описанных пунктах, так как какая-либо неправильно записанная строка может нарушить работоспособность VPN.

Также рекомендуем выполнить необязательный пункт и изменить настройки DNS для перенаправления всего трафика через сеть VPN. Вышеуказанные настройки создадут соединение VPN между вашим клиентом и сервером, но не будут заставлять соединения использовать туннель, а если мы немного поменяем настройки, то тогда весь трафик точно будет шифроваться.

Это то, что мы делали в 5 пункте: указывали

push «redirect-gateway def1 bypass-dhcp».

Эти строки будут сообщать вашему клиенту о необходимости использования бесплатных интерпретаторов OpenDNS на перечисленных IP-адресах. Если вы предпочитаете использовать другие интерпретаторы DNS, вставьте их на место выделенных IP-адресов.

Это изменит настройки DNS, чтобы туннель VPN использовался как шлюз по умолчанию.

На выходе мы получили моментальный коннект, который до этого ни на одном платном VPN мы не встречали, а также стабильное высокоскоростное соединение. Приводим сравнительные замеры с сайта speedtes:

  1. обычное соединение с офисного Wi-Fi

  1. тот же сервер, но с VPN

Да, есть некоторая просадка по скорости, но в целом результат очень даже неплох.

Немного “обкатав” VPN нашим backend-отделом, было принято решение о выдаче ключей всем остальным сотрудникам. На данном этапе нам требуется только ввести с помощью используемого скрипта фамилию сотрудника, после чего создаётся клиентская конфигурация для OpenVPN, которую надо только скачать с сервера и передать сотруднику. Полной автоматизации, к сожалению, добиться пока не удалось, так как в некоторых местах надо ввести пароль и подтвердить то или иное действие. Но у нас в планах немного переработать скрипт, чтобы процесс был полностью автоматическим и запускался с локальной машины.

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

Стоит отметить, что некоторые коллеги скачали себе OpenVPN также на телефоны и другие мобильные устройства, где тоже всё стабильно работает.

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

Если есть замечания или предложения по этому вопросу, отпишитесь, пожалуйста, в комментариях.

Что мы имеем на выходе:

  1. свой личный VPN, который обходится гораздо дешевле, чем платные аналоги;
  2. стабильный и качественный коннект для всех сотрудников;
  3. неограниченное количество подключений на организацию, ограниченное только возможностью сервера (можно масштабировать согласно росту компании).

Да, нет возможности переключать IP и выбирать разные страны, но с основными поставленными задачами наш VPN справляется на все 100%. Далее в планах запустить VPN за границей.

  • vpn
  • vpn-сервер
  • информационная безопасность
  • конфиг
  • конфигурационные файлы
  • конфиги

Создаем свой VPN с защищенным от блокировок протоколом AmneziaWG, или WireGuard на максималках

Всем привет! Возможно уже совсем скоро разные новостные и IT‑ресурсы будут подчищать информацию о способах обхода блокировок. А пока этого не случилось, запасаемся полезными гайдами и разворачиваем свои собственные VPN с защищенными от блокировок протоколами. Расскажу как это сделать, как изменилась Amnezia и как мы защитили WireGuard от блокировок.

Мини‑гайд в конце статьи, а я сначала скажу пару слов о проекте. Amnezia — это бесплатное self‑hosted приложение с открытым исходным кодом. Amnezia позволяет в два клика создать персональный VPN на личном сервере. Пользователю нужно просто приобрести виртуальный сервер (VPS) у любого VPS‑провайдера и ввести данные сервера в приложение и выбрать уровень цензуры его регионе. Более подробно о принципе работы в предыдущей статье.

За время существования проекта мы добавили множество протоколов, среди них WireGuard, OpenVPN и IKEv2 для Windows. А после начала массовых блокировок сайтов и VPN‑протоколов на территории России мы серьезно задумались об уязвимостях перед системами DPI и добавили поддержку ShadowSocks и OpenVPN over Cloak.

ShadowSocks первых версий оказался уязвим к блокировкам во многих странах, поэтому в будущем мы планируем его добавить в более современной и защищенной интерпретации. OpenVPN over Cloak, напротив, оказался очень устойчивым к блокировкам, и сейчас используется жителями Ирана, Туркменистана и Китая. Это одно из тех немногих решений, которое, на данный момент, не подвержено блокировкам в этих регионах.

Несмотря на все преимущества, OpenVPN over Cloak во многих случаях замедляет работу интернета, поэтому мы занялись поисками защищенного протокола с более высокой скоростью работы. Мы много думали, и временно отложив другие задачи, пришли к решению — просто защитить любимый всеми WireGuard. Так на основе WireGuard‑GO, мы выпустили собственный форк — AmneziaWG. Он уже доступен в приложении Amnezia.

Немного о принципе работы AmneziaWG

Протокол работает в рамках обратной совместимости. То есть реализация AmneziaWG позволяет изменить некоторые статичные параметры в WireGuard, по которым этот протокол обычно и распознают системы DPI. А если оставить эти параметры по умолчанию (равными 0), то протокол работает как обычный WireGuard.

В AmneziaWG изменены заголовки всех пакетов: пакета рукопожатия (Initiator to Responder), ответного пакета (Responder to Initiator), пакета данных, а также специального пакета «Under Load» — по умолчанию они имеют рандомные значения, но их можно самостоятельно поменять в настройках.

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

Еще одно слабое место WireGuard — это размеры пакетов авторизации. В AmneziaWG к каждому auth‑пакету дописываются рандомные байты, чтобы изменить их размер. Так «init и response пакеты» рукопожатия дополнительно имеют «мусор» в начале данных, размер которого определяется значениями S1 и S2. По умолчанию инициирующий пакет рукопожатия имеет фиксированный размер (148 байт), а после добавления мусора, его размер будет равен 148 байтам +S1.

В реализации AmneziaWG предусмотрен и еще один трюк для более надежной маскировки. Перед началом сессии Amnezia отправляет некоторое количество «мусорных» пакетов, чтобы окончательно запутать системы DPI. Количество таких пакетов и их минимальный и максимальный размер в байтах тоже задается в настройках, параметрами Jc, Jmin и Jmax.

Нам уже удалось успешно протестировать AmneziaWG в Китае и в России. Оказалось, что по скорости оно практически не уступает обычному WireGuard. Кстати, будем рады, если вы присоединитесь к тестированию и напишите нам свои впечатление на почту support@amnezia.org, как начать тестирование описано в мини‑гайде, в конце статьи.

Немного о новом дизайне Amnezia.

Кроме нового протокола, Amnezia 4 версии кардинально отличается от предыдущих версий дизайном. Три года назад Amnezia была проектом одного человека, именно тогда был создан дизайн неизменный до сегодняшнего дня. Сейчас Amnezia — приложение с множеством протоколов и сервисов, над которым работает целая команда. Мы стараемся сделать его приятнее для использования.

Так четвертая версия теперь исполнена полностью в темной теме. Мы также постарались сделать приложение намного понятнее, чтобы каждый пользователь смог найти ту функцию или кнопку, которая ему нужна. Еще мы увеличили скорость работы UI, что позволяет избавится от микро‑задержек и старых багов. Так же были исправлены регрессионные баги из 3 версии приложения и добавлены удобные мелочи. Самая главное — к Английскому мы наконец добавили Русский и Китайский языки, и в ближайшем будущем планируем добавить Фарси.

Кроме приложения у нас появился новый Сайт с 30 новыми инструкциями для каждого пользовательского сценария, и переработан раздел с инструкциями по покупке VPS, так что теперь каждый сможет найти ответ на любой вопрос связанный с приложением. В общем, лучше один раз показать чем писать много текста .https://amnezia.org/

Мини-гайд

Спасибо что дочитали. Как и обещал, мини‑гайд по созданию собственного VPN с защищенным от блокировок WireGuard — AmneziaWG.

  1. Покупаем любой VPS у любого хостинг провайдера. Важно чтобы была операционная система Ubuntu (официально поддерживаемая версия — 22.04), или Debian 11. Вот тут есть пошаговые инструкции в качестве примера, но вы можете выбрать любой другой.
  2. Устанавливаем приложение https://amnezia.org/, есть версии для Windows, Linux, MacOS, IOS и Android.
  3. Вносим данные сервера в приложение, и выбираем «Средний или Высокий» уровень цензуры (или вручную выбираем протокол AmneziaWG). Ну и нажимаем «Подключиться»!

Профит! Теперь у Вас есть собственный VPN с защищенным от блокировок протоколом AmneziaWG. Его можно использовать на неограниченном количестве устройств и делиться с другими людьми.

Настройка простого VPN Server’а для всех устройств с использованием Mikrotik CHR

Добрый день всем, кто читает эту статью. Меня зовут Минисламов Руслан. Это мой перый пост на habr.com. Мы будем настраивать VPN Server с использованием Mikrotik CHR — это специальная версия Mikrotik RouterOS, которая разработана для развертывания в облачной инфраструктуре, например на VPS. Пост расчитан чтобы далекий от IT человек смог настроить себе VPN Server, а так же технически грамотный специалист, но не работавший с продуктами Mikrotik. К VPN по окончании статьи сможем подключаться с телефона при помощи ПО «strongSwan» к VPN по протоколу IKEv2 over IPsec ,приложение «strongSwan» есть в «Google Play», а так же сможем с ПК подключаться по протоколу L2TP over IPsec так же к нашему VPN.

Системные требования Mikrotik CHR: процессор: x86_64 с поддержкой аппаратной виртуализации, ОЗУ: 128 МБ и более.
Как видно из вышеуказанных требований, не нужно покупать дорогой VPS Server, достаточно стартового, с 1 ядром, оперативной памяти 512 Mb, OC на диске то же много не съест, но помоему везде предлагают от 5GB, тип диска SSD или SAS не важно. Для статьи я буду использовать VPS со следующими характеристиками.

Характеристики арендованного VPS.

Как только VPS будет подготовлен, выполняем подключение по ssh к нашему серверу. Данные для подключения к VPS скорее всего будут направлены на почту вашим «Хостинг Провайдером». После удаленного подключения к нашему VPS, выполним команду «ip r» чтобы узнать gateway. Потребуется в будущем при настройке, в моем случае это 194.36.179.1. Запишем себе в текстовый файлик это значение.

Результат команды ip r.

Выполним команду «fdisk -l» . Нас интересует выделенное на скриншоте значение «/dev/vda».

Результат команды fdisk -l.

Установим пакет wget и unzip, выполнив следующую команду
«apt update && apt install wget unzip -y».
Далее скачаем Mikrotik CHR и распакуем наш образ.
«wget https://download.mikrotik.com/routeros/7.9.2/chr-7.9.2.img.zip && unzip chr*.img.zip».
Далее вводим команды
«echo u > /proc/sysrq-trigger»
«dd if=chr-7.9.2.img of=/dev/vda bs=4M oflag=sync»
ВАЖНО. При вводе команды вам необходимо изменить следующие значения на свои:
of=/dev/vda полученные после ввода команды «fdisk -l»
if=chr-7.9.2.img на вашу версию, если отличается от используемого в инструкции образа.
Далее вводим команды перезагрузив наш VPS.
«echo 1 > /proc/sys/kernel/sysrq»
«echo b > /proc/sysrq-trigger»

Далее нам необходимо авторизоваться на сайте «Хостинг Провайдера» где арендовали VPS и перейти в Панель управления VPS Server’ом. Необходимо найти похожий интерфейс и подключиться через VNC к нашему серверу, так как следующие команды набо выполнять для первоначальной настройки на Mikrotik CHR.

Подключаемся через VNC к VPS.Интерфейс после подключения к терминалу через VNC.

Вводим в поле Login «admin» нажимаем Enter, в поле Password ничего не указываем просто кликаем Enter. И вводим «y» и удерживаем «Enter» чтобы прочитать молнееносно лицензионное соглашение»

Аутентификация и лицензионное соглашение.Смена пароля.

Вводим пароль для УЗ «admin» я для теста ввел коротки пароль, но вам лучше использовать сложный. Далее будет еще пару моментов про настройку безопасности чтобы не пополнить копилку mikrotik bot’ов.
После смены пароля необходимо ввести следующие команды для первоначальной настройки Mikrotik CHR.

Вносим ip для первоначальной настройки и подключения к нашему MIkrotik.

«ip address add interface=ether1 address=194.36.179.249 netmask=255.255.255.0»
«ip route add gateway=194.36.179.1 dst-address=0.0.0.0/0 distance=1»

С консолью работать закончили, можно подключаться к нашему роутеру с использованием ПО Winbox. Указываем настройки для подключения и кликаем «Connect».

Подключение к серверу через WinBox.

Далее в меню выбираем «IP» — «Services» и кликая по каждому сервису, выдлив его, отключаем его кликнув на красную иконку.

Так выглядит изначально список сервисов ( не безопасно )

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

Отключение лишних сервисов для безопасности.

Далее делаем backup настроек, чтобы если что-то пошло не так, не нужно было переустанавливать все повторно, для этого перейдем в интерфейсе winbox выберем «Files»
Кликаем «Backup» — в новом окне в строке «Name» вводим название, чтобы было понятно. Я указал «first». Подтвержжаем нажимая «Backup».
Backup был создан как видно по скриншоту ниже.

Backup, чтобы вернуться к первоначальной настройке.

Далее в меню выбираем «IP» — «DNS» Укажем DNS Server, я указал 8.8.8.8. Кликаем «OK» подтвердив наши настройки.

Указываем какой DNS использовать.

Далее в меню выбираем «Bridge» открывается окно, на вкладке «Bridge» в верхнем левом углу жмем на иконку «+». Добавляем новый Interface указав ему Name, я ввел «ikev2».

Создаем interface для нашего vpn.

Далее работа будет происходить в меню «IP».
«IP» — «Addresses» — «+». В интерфейсе указываем в поле «Address» ip адрес ( адрес указываем используемые в локальных сетях ) и в поле «Interface» выбираем созданный на прошлом шаге «Interface». Кликаем «OK» подтвердив наши настройки.

Создаем диапозон IP адресов.

«IP» — «Pool» — «+». В интерфейсе указываем в поле «Name» наименование нашего Pool, я введ «ikev2-pool». В поле «Addresses» указываем диапозон ip, из этого диапозона будет выдаваться подключенным Client’ам ip адрес, но вносим значение из того же диапозона что и сделали ранее Interface с именем «ikev2».

Указываем pool из которого клиентам будет выдаваться ip при подключении к vpn.

Далее работа будет происходить в меню «System».
«System» — «Certificates» — «+». В поле «Name» вводим «ca», следующие 3 поля «Country», «State» и «Locality» не обязательны, но если ввели, необходимо будет вносить и в созданных в будущем сертификатах. В поле «Days Valid» исправляем значение на «3650», чтобы не перевыпускать сертификат каждый год и не переподписывать клиентские сертификаты которые создадим далее. В этом же окне, переходим на вкладку «Key Usage» и ставим галочки в полях «key cert.sign» и «cert sign».
Кликаем «OK» подтвердив наши настройки.

Создаем ca сертификат.Активируем необходимые атрибуты для ca сертификата.

Далее на созданном сертификате кликаем правой кнопокй мыши (далее: ПКМ), Sign.

Генерируем fingerprint для ca.

В новом окне кликаем «Start» и ожидаем пока в поле «Progress» не появится надпись «done». Кликаем «Close».

Генерируем fingerprint для ca.

Далее в этой же вкладке «Certificates» создаем новый сертификат, но уже сервера. Кликаем на иконку «+» . В поле «Name» я указал «serv-cert», как ранее и говорил так как раньше внес значения «Contry», «State» и «Locality» их указал и в текущем. В поле «Subject Alt. Name» выбираем «IP» и указываем внешний IP адрес который выдал нам хостинг провайдер. В поле «Days Valid» так же исправим значение на «3650» как и ранее. Переходим на вкладку «Key Usage» и активируем атрибут «tls server». Кликаем «OK» подтвердив наши настройки.

Создаем сертификат сервера.Активируем опции для сертификата сервера.

Далее в этой же вкладке «Certificates» создаем новый сертификат, но уже для клиента. Кликаем на иконку «+» . В поле «Name» я указал «client», как ранее и говорил так как раньше внес значения «Contry», «State» и «Locality» их указал и в текущем. В поле «Days Valid» так же исправим значение на «3650» как и ранее. Переходим на вкладку «Key Usage» и активируем атрибут «tls client». Кликаем «OK» подтвердив наши настройки.

Создаем клиентский сертификат.Активируем опции для клиентского сертификата.

Необходимо подписать сертификат сервера с именем «serv-cert» и клиентский сертификат с именем «client» сертификатом нашего УЦ созданного под именем «ca», для этого кликаем ПКМ на сертификате «serv-cert» выбираем «Sign», в новой вкладке в поле «CA» выбираем сертификат и нажимаем «Start». В поле «Progress» должна появится надпись done. Кликаем «Close».

Подписываем сертификат сервера, сертификатом УЦ.

То же самое делаем с клиентским сертификатом. (Если в будущем будете создавать дополнительные их так же нужно подписать).
Теперь можно выполнить «Export» Клиентского сертификата с именем «client». Кликаем ПКМ по сертификату и выбираем «Export».

Подписываем сертификат клиента, сертификатом УЦ.

В новом окне выбираем «Type» как на скриншоте ниже и обязательно в поле «Export Passphrase» указываем пароль, не меньше 8 символов, иначе вместе с сертификатом не произойдет экспорт сертификата сервера. Кликаем «Export».

Экспортируем клиентский сертификат.

Далее работа будет происходить в меню «IP» — «IPsec».
«IP» — «IPsec» — переходим на вкладку «Mode Configs» — «+». В поле «Name» указываем имя, я ввел «ikev2-ipsec», в поле «Address Pool» выбираем pool созданный ранее для пользователей которые будут подключаться к VPN. В поле «Address Prefix Length» указываем «32″. (Для новичка слишком длинное будет объяснение почему 32, а технически грамотные специалисты и так поймут). Кликаем «OK» подтвердив наши настройки.

«IP» — «IPsec» — переходим на вкладку «Profiles» — «+». Создаем новый профиль. В поле «Name» я указал «ikev2-ipsec-profile«, в поле «Hash Algorithms» изменил значени на «sha256«, в поле «Encrypting Algorithm» оставить только 3 атрибута «aes256«, «modp1024» и «modp2048«. Кликаем «OK» подтвердив наши настройки.

«IP» — «IPsec» — переходим на вкладку «Groups» — «+». Создаем новую группу. В поле «Name» я указал «ikev2-group«. Кликаем «OK» подтвердив наши настройки.

«IP» — «IPsec» — переходим на вкладку «Proposal»«+». Указываем в поле «Name» любое имя, я указал «ikev2-proposal» и оставил активными 2 алгоритма шифрования, в поле «PFS Group» изменяем значение на «none». Кликаем «OK» подтвердив наши настройки.

«IP» — «IPsec» — переходим на вкладку «Policies» — «+». Активируем опцию «Template», в поле «Group» выбираем группу созданную ранее, переключаемся на вкладку «Action» и в поле «Proposal» выбираем ранее созданный «ikev2-proposal«. Кликаем «OK» подтвердив наши настройки.
( Если простыми словами группа и proposal необходимы для установки IPsec соединения, а оно устанавливается из двух фаз, каждый из которых важен ).

«IP» — «IPsec» — переходим на вкладку «Peer» — «+». В поле «Name» указываем имя создаваемого нами peer, я назвал «ikev2-peer«, в поле «Profile» выбираем профиль ранее созданный, в поле «Exchange Mode» выбираем IKE2. Активируем атрибут «Passive«. Кликаем «OK» подтвердив наши настройки.

«IP» — «IPsec» — переходим на вкладку «Identities» — «+». В поле «Peer» выбираем ранее созданный «ikev2-peer», в поле «Auth. Method» выбираем «digital signature«, в поле «Certificate» выбираем сертификат сервера «cert-serv«, в поле «Remote Certificate» выбираем клиентский сертификат, в поле «Policy Template Group» выбираем ранее созданную группу «ikev2-group«, в поле «Remote ID Type» выбираем «ignore«, в поле «Match By» выбираем «certificate«, в поле «Mode Configuration» выбираем ранее созданный «ikev2-ipsec», в поле «Generate Policy» выбираем значение «port strict«. Кликаем «OK» подтвердив наши настройки. ( Эту настройку надо выполнять для каждого клиентского сертификата если вы сделали их несколько штук )

Далее работа будет происходить в меню «IP» — «Firewall».
«IP» — «Firewall» — переключаемся на вкладку «NAT» — «+». В поле «Chain» выбираем «srcnat», в поле «Src. Address» указываем диапозон ip из ранее созданного pool, у меня «172.17.18.0/24«, переключаемся на вкладку «Action» в поле «Action» выбираем masquerade. Кликаем «OK» подтвердив наши настройки.

Осталось зайти в меню «Files», кликнуть ПКМ на сертификат и в выпадающем меню выбрать «Download» и укажем путь где сохранить файл. Переносим сертификат на мобильное устройство и установим приложение для VPN Strongswan.
PS: Возможно у Вас заработает VPN и через стандартные настройки, у меня телефон отказывался подключаться, пока не указать «Общий IPsec ключ» хотя его я нигде не вводил и это значение не является обязательным.

Настройки в приложении StrongSwan в приложении на телефоне приведены на скриншоте.

2 Важных момента.

1) Рекомендую так же зарегистрироваться на сайте mikrotik и получить бесплатную лицензию. После того как зарегистрируетесь, необходимо в меню выбрать «System»«License» кликнуть «Renew License» и ввести свой логин (email) и пароль который вы создали при регистрации на сайте mikrotik, и у Вас будет лицензия P1.
Лицензия временная, предоставляет возможность обновляться в течении 60 дней на новую версию, но нам нужно увеличить скорость интерфейса. Даже когда закончится лицензия, скорость не будет резаться, сйчас скорость нашего интерфейса будет ограничена программно 1Мб, после регистрации на сайте, а затем указать эти данные в форме ниже, мы увеличим скорость до 1Гб, конечно в нашем случае скорость такой не будет, но около 100Мб и комфортная работа обеспечена.

2) Ниже настройки не обязательны, VPN уже работает.
Следующие правила можно не создавать, если в будущем не планируете более тонко настраивать Firewall и изучать эту тему, VPN уже готов к работе на этом этапе и можно к нему подключиться с мобильного устройства.
«IP» — «Firewall» — «+». В поле «Chain» вибираем канал «input», в поле «Protocol» выбираем udp, в поле «Dst. Port» вводим «500, 4500«, переключаемся на вкладку «Action» в поле «Action» выбираем «accept«. Кликаем «OK» подтвердив наши настройки.

Создадим следующее правило с настройками. В поле «Chain» выбираем «input«, в поле «Src. Address» указываем «0.0.0.0«, переключаемся на вкладку «Advanced» и в поле «IPsec Policy» выбираем «ipsec«. Кликаем «OK» подтвердив наши настройки.

Создадим следующее правило с настройками. В поле «Chain» выбрать «forward«, в поле «Src. Address» указать «0.0.0.0«, переключаемся на вкладку «Action«, в поле «Action» выбираем «accept«. Кликаем «OK» подтвердив наши настройки.

Выше мы выполнили настройку VPN Server’а для того чтобы подключаться с мобильных устройств, ниже выполним настройку еще одного протокола для подключения к нашему VPN. Запасной протокол настраиваем, так как существует у каждого множество разных устройств, с разной ОС, с разным набором программ и отдельное устройство используется для разных задач. Например по протоколу L2TP можно будет подключаться к ChatGPT с ПК без проблем.

Создадим отдельный пул с ip адресами. Перейдем в меню «IP» — «Pool» — «+». Комментировать не буду, ранее создавали пул ip адресов для протокола ikev2.

Создаем pool для l2tp-server.

Далее работа будет происходить в меню «PPP».
«PPP» — «Profiles» — «+». В поле «Name» указываем имя, я ввел «l2tp«. В поле «Local Address» ip из того же пула что создали выше. В поле «Remote Address» указываем pool который ранее создали. Меняем значение «Change TCP MSS» с «default» на «yes«. Кликаем «OK» подтвердив наши настройки.

«PPP» — «Interface» — «L2TP Server». Приводим к виду как на скриншоте ниже. Из важного, в поле «IPsec Secret» указан пароль, введите значение и запомните его, оно понадобиться при настройке подключения на ПК. Кликаем «OK» подтвердив наши настройки.

«PPP» — «Secrets» — «+». Данными действиями мы создаем нового пользователя, который сможет подключаться к нашему VPN по протоколу l2tp. Приводим к виду как на скриншоте ниже. Поле «Password» указан пароль с которым пользователь сможет подключаться, введите значение и запомните его, оно понадобиться при настройке подключения на ПК. Кликаем «OK» подтвердив наши настройки.

Последний момент, настроим NAT, переходим «IP» — «Firewall».
«IP» — «Firewall» — переключаемся на вкладку «NAT» — «+». В поле «Chain» выбираем «srcnat«, в поле «Src. Address» указываем диапозон ip из ранее созданного pool, у меня «172.17.19.0/24«, переключаемся на вкладку «Action» в поле «Action» выбираем «masquerade«. Кликаем «OK» подтвердив наши настройки.

Расписывать как настроить L2TP на ПК не буду, там все элементарно, указать IP, логин и пароль пользователя которого создали в MIkrotik CHR и пароль для IPsec.
Так же рекомендую еще раз сделать backup настроек.

Можно настроить так же разные правила Firewall, но VPN уже работает корректно и для большинства людей текущих настроек достаточно.

За статью спасибо моей девушке Елизавете, для которой и настраивался изначально VPN Server.

Личный домашний VPN на основе Raspberry (Shadowsocks) (для самых маленьких)

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

До этого блокировали пока что только коммерческие сервисы VPN. Пока под раздачу попадают протоколы WireGuard и OpenVPN (август 2023) (ссылка на СМИ, выполняющее функции иноагента). Первый очень популярен своей легкостью и быстродействием, быстрой настройкой. К сожалению, у такого трафика на лбу написано «Я — VPN соединение”. Второй протокол уже довольно старый и популярный, но тоже довольно легко обнаруживается РКН. На сегодня РКН только тренируется с блокировками, но похоже, что Shadowsocks пока работает без перебоев. Тем не менее, «эксперты «Роскомсвободы»* также предполагают, что следующим шагом властей может стать блокировка Shadowsocks, нестандартного протокола, созданного для обхода Великого китайского файрволла, и подобных ему инструментов” (ссылка на сайт некоммерческой организации выполняющей функции иностранного агента). Пока до этого протокола еще не добрались, на основе него, а точнее Outline, использующий технологию Shadowsocks, и настроим свой VPN-сервер.

Что нам понадобится?

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

Итак, моим близким людям, находящимся в РФ, нужен незаблокированный доступ в Интернет. Да и мне он тоже может понадобится, если я сам буду (нет) в РФ.

Что у меня есть:

  • я живу за границами РФ;
  • у меня обычное домашнее подключение к Интернету у обычного провайдера (с динамическим IP-адресом);
  • Raspberry PI 400 (был у меня подаренный на ДР);
  • wifi-роутер Fritz! Box 6690 (у вас может быть любой другой не тупой роутер, который можно настраивать в деталях);
  • персональная ЭВМ.

Приступим

Прежде всего, с помощью Raspberry Pi Imager, установим на флешку microSD легкую 64-битную Raspberry Pi OS Lite. Вставляем карточку в Raspberry и подключаемся к нему через SSH с компьютера:

ssh user@192.168.178.44

Где user ваше имя пользователя в Raspberry, а 192.168.178.44 — IP-адрес вашего Raspberry в вашей домашней сети.

Вводим пароль, затем обновляемся (вводим команды по очереди, со всем соглашаемся):

sudo apt update sudo apt dist-upgrade sudo apt clean sudo reboot

После перезагрузки снова подключаемся к Raspberry по SSH:

ssh user@192.168.178.44

Где user ваше имя пользователя в Raspberry, а 192.168.178.44 — IP-адрес вашего Raspberry в вашей домашней сети.

Вводим пароль и устанавливаем Docker. Сначала скачиваем скрипт для установки.

curl -fsSL https://get.docker.com -o get-docker.sh

Запускаем скрипт установки Docker:

sh get-docker.sh

Разрешаем работать обычному пользователю с Docker без прав root:

sudo usermod -aG docker $USER

Настройка роутера и DynDNS

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

Я использовал бесплатный сервис https://ydns. io/ — он не просит никаких ваших данных, кроме email, очень простой и без рекламы:

  • после регистрации в разделе Hosts создаем новый, присваеваем какое-нибудь имя и указываем свой IP-адрес, который вам выдал ваш провайдер. Узнать это можно, если, например, зайти на https://2ip. ru (обратите внимание, чтобы были выключены iCloud Private Relay, если у вас Mac, и любые другие VPN или сервисы, которые могут скрыть ваш реальный IP-адрес) или посмотреть в настройках роутера;
  • в настройках созданного хоста нажмите кнопку Get Update URL и скопируйте ссылку;

  • в настройках роутера в разделе DynDNS введите: логин, пароль от ydns. io и скопированную ссылку Update URL (каждый раз при смене IP-адреса провайдером, роутер будет “нажимать” на эту ссылку, таким образом передавая сервису свой новый IP-адрес).

Обратите внимание, что сам сервис на домене ydns.io, а предоставляет он домен ydns.eu

в моем случае, это роутер Fritz!Box 6690

Теперь мы имеем статичное доменное имя, по которому можно обращаться к нашему IP-адресу и настроенный роутер, который при смене IP-адреса обновляет данные на сервисе DynDNS.

Установка Outline

Разработчики из JigSaw предоставляют максимально простой скрипт для установки, вам нужно написать одну команду в терминале, все остальное сделает скрипт. К сожалению, при попытке установить сервер Outline на Raspberry, будет выдаваться ошибка, что Raspberry не является x86 машиной и установка будет прерываться.

Энтузиастами скрипт был доработан и теперь Outline прекрасно работает и на arm64 Raspberry.

Также стоит учесть, что по умолчанию скрипт берет ваш динамический IP-адрес и устанавливает его в своих настройках. Нам это не подходит, потому что когда провайдер сменит IP, то к VPN-серверу мы не сможем подключиться. Именно поэтому мы и сделали хост DynDNS выше.

SB_IMAGE=oreoluwa/shadowbox:daily sudo --preserve-env bash -c "$(wget -qO- https://raw.githubusercontent.com/EricQmore/installer/main/install_server.sh) --hostname user.ydns.eu"

Где в конце user. ydns. eu — это ваш хост, который вы создали выше. Таким образом, мы указываем скрипту, чтобы в настройках создаваемого сервера было указано наше доменное имя.

Если все ок, то скрипт выдаст зеленым строчку такого вида:

Копируем зеленую строчку и обращаем внимание на указанные порты ниже

Также, скорее всего, он поругается на установки Firewall, что не доступны определенные порты. Их он тоже укажет: один порт UDP, а также два порта TCP и UDP.

На случай, если наш сервер перезагрузится, нужно предусмотреть автоматический запуск контейнеров, чтобы VPN-сервер всегда поднимался. Вводим команды по очереди:

sudo systemctl enable docker.service sudo systemctl enable containerd.service

Теперь перезагрузим Raspberry, чтобы убедиться, что контейнеры запускаются снова и VPN-сервер поднимается сам:

sudo reboot

Снова подключаемся к Rasberry:

ssh user@192.168.178.44

Где user ваше имя пользователя в Raspberry, а 192.168.178.44 — IP-адрес вашего Rasberry в вашей домашней сети.

Проверяем, запустились ли контейнеры:

docker ps

В списке должно быть как минимум две записи: watchtower (следит за обновлениями) и shadowsocks.

Вернемся к компьютеру:

  • Запускаем уже заранее скачанный Outline Manager с официального сайта https://getoutline. org/ru/get-started/#step-1, нажимаем Set Up в правом нижнем углу (раздел Advanced).

  • в окно «Paste your installation output here” вставляем ту наше »зеленую” строчку.

  • Открываем вкладку Settings и в поле “Port for new access keys” заменяем на один из портов TCP, которые нам указал скрипт в терминале.

  • Во вкладке Connections нажимаем «Add new key”, называем как угодно («mama iphone”), нажимаем справа символ »Поделиться” и в появившемся окне жмем »Copy access key”.

Пробрасываем порты в роутере

У нас есть свой собственный VPN-сервер, работающий на Raspberry в домашней сети, но сейчас к нему нельзя подключиться, потому что он недоступен из “внешнего” интернета. Поэтому нужно пробросить порты, который нам указал скрипт в выводе терминала в настройках роутера. В моем роутера Fritz! Box 6690 это делается элементарно:

  • в разделе Home Network выбираем Network Connections и в списке устройств домашней сети находим Raspberry, например, 192.168.178.44
  • нажимаем “карандаш” для редактирования настроек;
  • нажимаем “Permit Access” и ставим галочку Permit independent port sharing for this device;
  • нажимаем кнопку Change port sharing и в появившемся разделе снова жмем “карандаш”;
  • затем выбираем New sharing и в появившемся окне Create sharing выбираем Port sharing;
  • В Application можно выбрать Other application и выбираем протокол порта;
  • Так у вас должно быть три записи на три порта: 1 порт UDP и 2 порта TCP, применяем настройки.

Наш VPN-сервер доступен по трем портам из “внешнего” интернета, пробуем подключаться.

Перед тем, как объявить своим близким, что вы подняли свой VPN-сервер и готовы поделиться окном в незаблокированный интернет, стоит попробовать самому подключиться к своему серверу из “внешнего” интернета.

  • Устанавливаем Outline Client с официального сайта https://getoutline. org/ru/get-started/#step-3 на свой смартфон и отключаемся от wifi, то есть используем мобильный интернет;
  • Вводим скопированный на предыдущих шагах ключ из Outline Manager в “Добавить сервер”;

  • Если все ок, появляется кнопка “Подключить”, жмем ее;

  • Если подключение произошло, то кружок становится зеленым, появляется кнопка “Отключить”;

  • На https://2ip. ru проверяем наш IP-адрес. Должен быть домашний IP-адрес. Можно открыть еще пару сайтов, чтобы проверить, что подключение есть и трафик по нему идет.

Подключение VPN работает, все хорошо.

Итог

Мы подняли свой собственный VPN-сервер на Raspberry на протоколе Shadowsocks в своей домашней сети, который работает достаточно автономно даже при перезагрузках и обновлениях динамического IP-адреса. Без абонентской платы, то есть практически бесплатно. И мы можем это дело немного администрировать: дать по ключу доступа каждому, видеть объем его трафика и даже ограничивать его и в случае необходимости отключить(удалить) ключ.

В будущем еще можно подумать, какие сервисы можно поднять на Raspberry, раз он уже есть. Например, AdGuard Home — будет еще эффективнее резать рекламные баннеры, блокировать вредоносные сайты, противодействовать трекингу ваших устройств.

По идее, такое VPN-соединение будет сложно определить РКН, из преимуществ также является то, что соединение устанавливается не с хостинг-провайдером, что выглядело бы для РКН как «частное VPN‑соединение с арендованным за границей VPS».

Имейте ввиду, что вы все делаете на свой страх и риск, я снимаю с себя всякую ответственность. Желаю удачи!

. ВНИМАНИЕ. Если вы живете в стране, где за скачивание торрентов бросают в тюрьму на 45 лет, то будьте крайне осторожны с раздачей ключе доступа к вашему VPN-серверу. «Миссия невыполнима», скачанная с торрентов младшим братишкой, в вашей стране будет выглядеть так, что это сделали вы со всеми вытекающими последствиями.

*некоммерческая организация выполняющая функции иностранного агента

  • vpn
  • outline
  • shadowsocks
  • raspberry
  • vpn своими руками
  • настройка своего vpn
  • блокировка vpn

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

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