Кот недовольный действиями Роскомнадзора.
Кот недовольный действиями Роскомнадзора.

Некоторое время назад, Роскомнадзор, в очередной раз, решил усложнить мне жизнь, а именно - стал блокировать и разрывать VPN-соединения по протоколу SSTP (Secure Socket Tunneling Protocol), при помощи которого я подключался к устройствам в своей домашней сети. Протокол SSTP относительно медленный, но к числу его преимуществ можно отнести то что он не требует наличия "белого" IP-адреса, т.к. он использует SSL / TLS канал и способен работать через Keenetic Cloud с использованием доменного имени, зарегистрированного в облачной службе KeenDNS.

Блокировки и разрывы SSTP-подключений продолжались примерно 2 или 3 недели и потом прекратились, однако невозможность всё это время нормально использовать свою домашнюю сети (где у меня, например, находится экспериментальный стенд) побудила меня искать альтернативные способы подключения к себе домой.

В этой статье будет рассказано о том, как развернуть на выделенном виртуальном сервере (VPS / VDS) свой личный VPN-сервер, работающий по протоколу AmneziaWG, а затем сконфигурировать развернутый VPN-сервер и домашний роутер фирмы Keenetic таким образом, чтобы внешние клиенты, подключившись к VPN-серверу получали доступ к устройствам в домашней сети.

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

Оглавление

1) Требования применявшиеся к выбранному решению

Так как мне не хотелось заморачиваться с приобретением "белого" IP-адреса у своего интернет-провайдера и, с учётом того что последние годы Роскомнадзор старательно портит и блокирует всё до чего может дотянуться, к потенциальному решению применялись следующие требования:

  • Протокол подключения должен быть хотя бы немного защищён от блокировок;

  • Протокол должен поддерживаться роутерами Keenetic;

  • Клиентские приложения должны существовать под все популярные операционные системы;

  • Для работы не требуется приобретать у своего Интернет-провайдера "белый" IP-адрес;

  • Желательно, чтобы протокол обеспечивал более высокую скорость соединения чем SSTP.

Подходящим решением стало использование собственного VPN-сервера, работающего по протоколу AmneziaWG v.1.0 (он же AmneziaWG Legacy) размещенного на площадке у хостинг-провайдера, с последующей настройкой маршрутизации трафика между внешними клиентами и роутером Keenetic и дополнительными правилами на роутере для разрешения доступа к устройствам во внутренней сети. В реализованной схеме все устройства, включая Wi-Fi роутер, подключаются к VPN-серверу в режиме клиента, а "белый" IP-адрес, необходим только на VPS / VDS, на который и будет произведена установка VPN-сервера.

Рисунок 1. Схема подключения устройств к VPN-серверу.
Рисунок 1. Схема подключения устройств к VPN-серверу.

2) Перечень необходимых программно-аппаратных средств

Для реализации описанной схемы подключения потребуются следующие средства:

  • Виртуальный сервер (VDS/VPS) с операционной системой Linux;

  • Роутер Keenetic с прошивкой версии 4.3.4 или выше;

  • Приложение Amnezia VPN версии 4.8.10.0.

Я не буду называть конкретных хостеров где можно заказать VPS/VDS и не буду советовать конкретные страны для размещения вашего VPN-сервера, надеюсь что вы сможете разобраться с этим вопросом самостоятельно. Главное на что следует обратить внимание - это на простоту регистрации, доступный объем трафика (желательно безлимитный), цену и на доступность оплаты из России.

В этой статье мы рассмотрим настройку на примере виртуального сервера с операционной системой Ubuntu 22.04 LTS, но версия операционной системы не принципиальна. Вы можете использовать и Ubuntu 20.04 и Ubuntu 24.04, да и вообще многие другие дистрибутивы Linux, главное чтобы с ними умел работать клиент Amnezia VPN и на них можно было запустить Docker, так как VPN-сервер мы будем запускать как Docker-контейнер.

Приблизительные характеристики виртуального сервера: 1 CPU, 2 Gb RAM, 20 Gb SSD/NVMe. Брать накопитель меньшего размера не рекомендую, т.к. я сторонник того что на сервер надо устанавливать обновления, а с накопителем меньшего размера это может стать проблематичным из-за нехватки свободного места.

Прошивка роутера Keenetic должна быть версии 4.3.4 или выше, т.к. начиная с этой версии в роутерах Keenetic была реализована полная поддержка протокола AmneziaWG v.1.0.

Примечание: Базовая поддержка протокола AmneziaWG v.1.0 появилась в прошивках версии 4.2, но в ней требовалось выполнять дополнительные команды, для задания asc-параметров. Начиная с версии 4.3.4 этого не требуется. Все необходимые параметры роутер получает из конфигурационного файла.

Для развертывания VPN-сервера требуется Amnezia VPN версии 4.8.10.0, по той причине что официальные прошивки роутеров Keenetic, на момент написания статьи, поддерживают только протокол AmneziaWG v.1.0. А последняя из сборок Amnezia VPN разворачивающая контейнеры использующие этот протокол это как раз сборка версии 4.8.10.0. Вероятно, в будущем официальные прошивки Keenetic-и научатся поддерживать AmneziaWG v.1.5 и AmneziaWG v.2.0, но на данный момент этот функционал не реализован, потому работаем с тем что есть.

Примечание: Amnezia VPN версии 4.8.10.0 нужна только на том устройстве, с которого вы будете разворачивать свой VPN-сервер. На устройствах просто подключающихся к VPN-серверу можно использовать и более свежие сборки.

3) Первоначальное развертывание VPN-сервера

Предполагается что вы успешно выполнили квест по подбору хостинг-провайдера, заказу выделенного виртуального сервера (VPS / VDS) и получили сообщение с реквизитами для подключения к серверу по SSH.

Примечание: Если хостер предоставил вам доступ к серверу под учётной записью root, то вы можете не вводить sudo перед каждой командой. Я, даже работая под root-ом, буду её использовать просто для универсальности инструкции.

Итак, открываем на компьютере вашу любимую консоль и подключаемся к серверу:

ssh root@11.22.33.44

При первом подключении вам будет выведено предупреждение о том что цифровой отпечаток сервера не известен. Вам нужно будет ввести yes чтобы подтвердить что вы доверяете этому серверу. Затем у вас запросят пароль от учётной записи. Скопируйте его из письма полученного от хостера. После чего вас должно пустить в консоль сервера.

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

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

Предупреждение о том что сервер необходимо перезагрузить.
Предупреждение о том что сервер необходимо перезагрузить.

По своему опыту могу сказать что при первом входе в систему лучше всего не перезагружать сервер сразу-же, а дать ему постоять минут 10-15, т.к. бывали случаи что только что развернутый сервер продолжал в фоне устанавливать новые версии пакетов и перезагрузка ломала этот процесс. К каким-то необратимым последствиям это, как правило, не приводит, но чтобы не вводить потом дополнительные команды, лучше немного подождать. А пока сервер "отстаивается" можно сменить пароль от учётной записи при помощи команды passwd и установить на ваш компьютер приложение Amnezia VPN версии 4.8.10.0 - оно нам понадобится для развертывания VPN-сервера на вашем VPS / VDS.

Если вы работаете с учётной записью отличной от root, то необходимо внести имя вашей учётной записи в группу sudo в явном виде. Дело в том что Amnezia VPN при настройке сервера, под учётной записью не являющейся root-ом, проверяет числится ли этот пользователь, в группе sudo в файле /etc/group и если не находит в учётную запись в этой группе - то выдаёт ошибку. То что пользователь при этом может использовать команду sudo за счёт того что он прописан в файлах размещенных в каталоге /etc/sudoers.d/ - Amnezia VPN игнорирует.

Вводим команду:

sudo nano /etc/group

Находим строку sudo:x:27:(число может быть другим) и вписываем имя вашей учётной записи после последнего двоеточия. Нажмите CTRL+O и затем Enter для сохранения изменений и CTRL+X для выхода из редактора.

Помимо этого рекомендую отключить запрос пароля при использовании команды sudo. Для этого выполните команду:

sudo nano /etc/sudoers

И поменяйте строку %sudo ALL=(ALL:ALL) ALL на %sudo ALL=(ALL:ALL) NOPASSWD:ALL. Нажмите CTRL+O и затем Enter для сохранения изменений и CTRL+X для выхода из редактора.

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

sudo shutdown -r now

После перезагрузки заново подключитесь к серверу (надеюсь вы не забыли новый пароль):

ssh root@11.22.33.44

И введите в консоль команду

sudo apt autoremove -y; sudo apt update -y && sudo apt upgrade -y

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

Если какие-то пакеты были обновлены, то перезагружаем сервер еще раз.

sudo shutdown -r now

Теперь переходим к установке VPN-сервера. Для этого запускаем приложение Amnezia VPN, нажимаем символ "+" и выбираем пункт меню "self-hosted VPN". После чего вводим в окно реквизиты для подключения к вашему серверу и нажимаем кнопку "Продолжить". Затем выбираем пункт меню "Ручная", нажимаем "Продолжить", выбираем протокол "AmneziaWG" и нажимаем кнопку "Установить". Порт можно оставить по-умолчанию. Ждём окончания установки.

Примечание: Если, вдруг Amnezia VPN, по какой-то причине не смогла автоматически настроить ваш сервер и выдала ошибку на этапе первичного развертывания сервера, то вам необходимо подключиться к вашему серверу по SSH и выполнить следующие команды:

sudo apt install docker -y
docker pull amneziavpn/amnezia-wg

После чего повторить в приложении Amnezia VPN шаги для установки VPN-сервера.

После успешного развертывания Docker-контейнера с AmneziaWG снова подключитесь к вашему серверу по SSH и выполните команду docker ps. Должен отобразиться список запущенных контейнеров.

Запущенный контейнер AmneziaWG.
Запущенный контейнер AmneziaWG.

В клиенте Amnezia VPN ваш сервер будет сохранён как "Сервер 1". Можете переименовать его в что-то более красивое через выпадающее меню рядом с именем и значок шестерёнки.

Теперь нажмите на значок из трёх связанных точек и выберете там вкладку "Пользователи". Вы увидите там запись Admin [Название операционной системы]. Эта учётная запись создаётся автоматически, при первичной настройке VPN-сервера и при последующий подключениях к VPN-серверу с учётной записью имеющей права root на сервере. Эта учётная запись нам сейчас не нужна и её можно смело удалить. Нажмите на учётную запись и выберите пункт меню "Отозвать".

Примечание: Если у вас на роутере уже настроены какие-нибудь подключения по протоколам Wiregard / AmneziaWG, то проследите чтобы диапазоны адресов выдаваемых клиентам этим VPN-сервером не пересекались с диапазонами уже существующих подключений. Посмотреть существующие диапазоны можно в веб-интерфейсе роутера (меню "Интернет" -> "Другие подключения" и в разделе "Wiregard"), а изменить диапазон настраиваемого VPN-сервера можно в приложении Amnezia VPN, перейдя в настройки сервера через выпадающее меню и значок шестерёнки, а затем нажав на строчку "AmneziaWG" -> "AmneziaWG настройки сервера" -> "Подсеть VPN-адресов".

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

Теперь создадим на VPN-сервере учётную запись для роутера. Для этого нажимаем на значок из трёх связанных точек, вводим имя пользователя, например KN-ROUTER, убеждаемся что выбрали правильный сервер и протокол и выбираем "Оригинальный формат AmneziaWG". И нажимаем кнопку "Поделиться". Через несколько секунд будет создана конфигурация подключения, которую необходимо сохранить как файл. Для этого нажмите кнопку "Поделиться" и сохраните файл с понятным именем. Этот файл нам понадобиться чуть-чуть позднее.

Рекомендую сразу-же создать учётные записи для других клиентов. При их создании уже не обязательно выбирать оригинальный формат AmneziaWG, но тут есть нюанс - использование оригинального формата полезно, если вы решите поменять в конфигурации клиента, например, сетевую маски или адреса DNS-серверов. Однако учтите что при использовании оригинального формата, более новые версии Amnezia VPN не распознают QR-коды, которые Amnezia VPN 4.8.10.0 генерирует для быстрого подключения мобильных устройств и нужно будет добавлять подключение из файла.

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

Я создал еще две конфигурации, одна будет использоваться на смартфоне, а вторая на ноутбуке.

4) Конфигурирование роутера и VPN-сервера

Откройте файл KN-ROUTER блокнотом, найдите в нём строчку вида Address = 10.x.x.1/32 и замените сетевую маску с /32 на /24. Это необходимо сделать для того чтобы другие клиенты вашего VPN-сервера в будущем смогли обращаться к вашему роутеру.

Примечание: Если вы конфигурируете уже существующий VPN-сервер, на котором уже были какие-то учётные записи или вы не стали отзывать запись пользователя Admin, то последний октет сетевого адреса будет не 1, а каким-то другим. Это ни на что не повлияет.

Затем подключитесь к веб-интерфейсу роутера и добавьте в него ранее созданную конфигурацию. Для этого введите в браузере адрес роутера (в моём случае это будет https://192.168.1.1), введите логин и пароль и проверьте что на вашем роутере установлен компонент Wiregard VPN. Это можно сделать открыв меню "Управление" -> "Настройки системы" -> "Изменить набор компонентов" и в разделе "Сетевые компоненты" проверить наличие соответствующей галочки.

Установленный компонент Wiregard VPN.
Установленный компонент Wiregard VPN.

Если компонент отсутствует, то необходимо его установить и перезагрузить роутер.

Затем перейдите в пункт меню "Интернет" -> "Другие подключения" и в разделе "Wiregard" нажмите кнопку "Загрузить из файла". После чего выберите ранее созданный файл конфигурации для роутера, дождитесь создания подключения и включите его. Должно установиться соединение.

Активное подключение к VPN-серверу.
Активное подключение к VPN-серверу.

Примечание: В свойствах VPN-подключения есть возможность установить галочку "Использовать для выхода в Интернет". По-умолчанию она снята и её использование остаётся на ваше усмотрение. Для реализации функциональности описанной в этой статье устанавливать эту галочку не требуется. Если вам будет интересно как можно настроить выборочную маршрутизацию трафика на роутере Keenetic и управлять ей при помощи Telegram-бота, то можете прочитать вот эту статью.

После этого перейдите в меню "Сетевые правила" -> "Межсетевой экран" и выберите только что созданное подключение (KN-ROUTER), после чего нажмите строчку "Добавить правило". Вам необходимо создать и включить три разрешающих правила для протоколов TCP, UDP и ICMP.

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

Я, в качестве разрешённого источника указал диапазон адресов 10.5.1.0/24, а в качестве адресов назначения 192.168.1.0/24.

Правила разрешающие соединения из VPN-подключения во внутренние сети
Правила разрешающие соединения из VPN-подключения во внутренние сети

На этом конфигурирование роутера закончено и можно переходить к настройке VPN-сервера.

Подключитесь к вашему VPS / VDS по SSH, убедитесь что контейнер с AmneziaWG запущен выполнив команду docker ps, после чего выполните docker exec -it amnezia-awg bash. После выполнения этой команды вы окажетесь внутри docker-контейнера. Обратите внимание на то что приглашение к вводу команд изменилось на bash-5.1#. Введите команду ip a и посмотрите на список сетевых интерфейсов имеющихся в контейнере. Нас интересует интерфейс с именем wg0.

Сетевой интерфейс внутри Docker-контейнера AmneziaWG
Сетевой интерфейс внутри Docker-контейнера AmneziaWG

Для отображения существующих маршрутов выполните команду ip route list.

Исходный список маршрутов внутри Docker-контейнера.
Исходный список маршрутов внутри Docker-контейнера.

Для организации доступа в вашу внутреннюю сеть необходимо добавить в этот список маршрут, который будет отправлять трафик в вашу внутреннюю подсеть. Выполните следующие команды:

sed -i '/tail -f/i ip route add 192.168.1.0/24 dev wg0' /opt/amnezia/start.sh
ip route add 192.168.1.0/24 dev wg0
ip route list

Первая команда пропишет в скрипт, запускающийся при запуске контейнера, команду добавляющую маршрут до сети 192.168.1.0/24 через интерфейс wg0. Это необходимо для того чтобы при перезапуске контейнера (не путать с пересозданием) маршрут к сети добавлялся автоматически. Вторая команда добавит маршрут сразу же, не дожидаясь перезапуска контейнера. Третья команда отобразит актуальный список маршрутов. Он должен выглядеть следующим образом:

Список маршрутов внутри Docker-контейнера, включая маршрут во внутреннюю сеть.
Список маршрутов внутри Docker-контейнера, включая маршрут во внутреннюю сеть.

Осталось разрешить доступ с клиентского IP-адреса роутера во внутреннюю сеть. Для этого выполните команду vi /opt/amnezia/awg/wg0.conf перейдите в режим редактирования файла нажав клавишу Insert и найдите в списке клиентов ваш роутер по его IP-адресу. У меня эта строка выглядит как AllowedIPs = 10.5.1.1/32. В неё, после запятой и пробела, необходимо добавить вашу внутреннюю подсеть, чтобы получилось AllowedIPs = 10.5.1.1/32, 192.168.1.0/24. Выйдите из режима редактирования нажав клавишу Esc и введите :wq, после чего нажмите Enter. Изменения будут сохранены, а файл закрыт.

Посмотреть конфигурацию VPN-сервера можно выполнив внутри контейнера команду wg show.

Вывод команды wg show выполненной внутри контейнера.
Вывод команды wg show выполненной внутри контейнера.

Примечание: Здесь у вас может возникнуть вопрос, почему в конфигурационном файле роутера мы меняли сетевую маску с /32 на /24, а в конфигурации сервера оставили маску роутера /32? Насколько я понимаю (могу ошибаться), в конфигурации сервера указывается то какой IP-адрес должен быть у клиента, чтобы ему было позволено установить подключение с указанным ключом и какие адреса будет разрешено маршрутизировать серверу. И чтобы серверу было разрешено маршрутизировать трафик к клиентам внутренней сети, то в конфигурацию необходимо добавить вашу внутреннюю подсеть. А вот сетевая маска на самом клиенте определяет то, с диапазоном каких адресов он сможет общаться. И если на нём оставить маску /32, то общаться с другими VPN-клиентами он не сможет, т.к. маска /32 ограничивает подсеть одним возможным адресом. Соответственно на клиенте необходимо поменять маску на /24.

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

Так же можно посмотреть конфигурацию VPN-сервера и перезагрузить контейнер не заходя внутрь контейнера, при помощи команд:

docker exec amnezia-awg wg show
docker restart amnezia-awg

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

Если вы всё сделали верно, то при подключении к вашему VPN-серверу с внешних устройств, у вас работать выход в Интернет через ваш VPN-сервер и будут доступны устройства в вашей внутренней сети.

И, напоследок, настоятельно советую сгенерировать SSH-ключ, прописать его в вашу учётную запись на сервере и отключить возможность входа на сервер при помощи связки логин / пароль. В противном случае злобные хакеры будут постоянно пытаться подобрать пароль к вашему серверу, что может привести к разрастанию каталога /var/log и переполнению диска вашего сервера.

Спасибо за внимание!

P.S. На всякий случай тегну @AmneziaLover, @AmneziaAdept, @pokamest_nikakи Amnezia VPN. Может быть прочтут статью и увидят что было-бы неплохо доработать и добавить в свежих версиях приложения Amnezia VPN. Например возможность разворачивать старые версии контейнеров в новых версиях приложений и корректное распознавание QR-кодов, при генерации файла подключения с использованием "Оригинального формата Amnezia WG".