В медиаполе снова пошла знакомая волна предупреждений: пользоваться VPN и другими средствами обхода блокировок не только нежелательно, но еще и опасно. Мошенники крадут данные, учетные записи и деньги, а доверчивый пользователь, разумеется, остается крайним.
Рациональное зерно в этом, конечно, есть. Случайные VPN-сервисы - особенно бесплатные, непрозрачные и обещающие «полную анонимность в один клик» - действительно могут оказаться сомнительным выбором. Когда весь ваш трафик идет через неизвестно чью инфраструктуру, вопрос доверия перестает быть теоретическим.
Но дальше обычно начинается привычная подмена. Из тезиса «не стоит пользоваться чем попало» очень быстро пытаются перейти к тезису «не стоит пользоваться ничем вообще». И вот это уже больше похоже не на заботу о безопасности, а на очередную попытку объяснить, что ограниченный интернет - это и есть нормальный интернет.
На практике все работает ровно наоборот. Чем больше ограничений, тем выше спрос на инструменты обхода. И если уж выбирать между случайным коммерческим VPN, бесплатным приложением с мутной моделью монетизации и собственным сервером, то self-hosted-вариант выглядит как минимум достойным внимания.
Поэтому дальше речь пойдет не о том, почему VPN - это страшно, а о том, как сделать его своим: развернуть self-hosted AmneziaWG с помощью install-скрипта и дополнить его веб-интерфейсом для управления пользователями.
Root? Нет, спасибо
Сама Amnezia, надо сказать, жизнь упрощает. Официальное приложение умеет поднять серверную часть, если просто дать ему доступ к VPS. Для многих это, наверное, вполне нормальный сценарий.
Но я в таких вопросах человек тревожный: когда приложению предлагают просто выдать root и не задавать лишних вопросов, у меня включается легкий внутренний аудит.
Поэтому я выбрал чуть менее простой путь. Сама идея подобных install-скриптов не нова, и хабровские читатели, скорее всего, вспомнят вариант @RomikB - в этом смысле корни у всей истории вполне хабровские.
Ну а дальше я сделал то, что обычно и делают в таких случаях: взял рабочую основу, адаптировал ее под свои задачи и довел до совместимости с AmneziaWG 2.0. При этом список поддерживаемых ОС пришлось немного сократить: часть дистрибутивов временно пришлось убрать не потому, что они чем-то принципиально плохи, а потому, что для них сейчас нет актуальных пакетов с обновлённым AmneziaWG 2.0.
Меня в этой схеме как раз устраивало то, что она оставляет контроль на моей стороне. Без магии, без режима «что-то где-то само настроилось» и без необходимости потом гадать, что именно приложение сделало с сервером от моего имени.
Сначала для себя, потом как обычно
Какое-то время этого мне вполне хватало. Сервер поднимается, пользователи добавляются, конфиги создаются, все работает. Вполне нормальный уровень бытового self-hosted-счастья - для себя, друзей и пары знакомых, которые обычно появляются со словами: «слушай, а мне тоже можешь сделать?»
А потом произошло то, что обычно и происходит с любой «небольшой инфраструктурой для своих»: она перестала быть небольшой. Пользователей стало больше, ручной рутины тоже. Где-то добавить новое устройство, где-то пересоздать конфиг, где-то отозвать доступ, где-то просто вспомнить, у кого что вообще заведено. По отдельности все это не выглядит трагедией, но в сумме довольно бодро съедает время и превращает вполне понятную техническую задачу в фоновую организационную возню.
В какой-то момент стало понятно, что консоль по-прежнему прекрасна, но только пока всем этим не приходится заниматься регулярно. Так что следующим логичным шагом стало добавление веб-панели - не потому, что без нее ничего не работает, а потому, что мне хотелось тратить на эту историю меньше ручного труда и чуть меньше оперативной памяти.
Два скрипта и немного здравого смысла
Практическую часть я изначально хотел оставить максимально приземленной: без обязательной панели и без сценария, в котором ради пары клиентов нужно сразу собирать пол-инфраструктуры.
Базовый слой здесь - это amneziawg-install.sh. Он ставит серверную часть AmneziaWG, генерирует параметры и выпускает клиентские конфиги. И что для меня было принципиально важно: это не одноразовый bootstrap-скрипт, а рабочий инструмент, который потом можно использовать и дальше. Тут, правда, есть один нюанс: с параметром S4 стоит быть аккуратнее. Он напрямую влияет на MTU, так что слишком смелые значения могут потом вылезти уже не на этапе установки, а в виде странностей в работе соединения.
Поверх него, при необходимости, ставится веб-панель. Для этого есть отдельный lifecycle-скрипт - amneziawg-web.sh, который отвечает за установку, обновление, удаление и проверку статуса панели.
Мне изначально было важно не превращать все это в монолит, где ради одной админки нужно сразу тащить половину инфраструктуры. Поэтому панель здесь не обязательная часть установки, а дополнительный слой поверх уже работающего VPN.
Сама веб-часть - это отдельный сервис на Rust: с cargo-сборкой, SQLite и без лишней внешней обвязки. А чтобы не строить из себя человека, который все это героически печатал вручную, сразу отмечу: в разработке заметно помогал GitHub Copilot.
В итоге схема получилась довольно простой: сначала рабочий VPN и базовый инструмент сопровождения, потом, если пользователей и рутины становится больше, то веб-панель поверх него.
Быстрый старт без духовных практик
Практический сценарий здесь тоже довольно прямолинейный: сначала ставится сам VPN, а уже потом, если нужно, добавляется панель.
Минимальный вариант выглядит так:
curl -O https://raw.githubusercontent.com/wiresock/amneziawg-install/main/amneziawg-install.sh chmod +x amneziawg-install.sh sudo ./amneziawg-install.sh
Если потом хочется поставить веб-панель поверх уже установленного VPN, то сценарий такой:
curl -O https://raw.githubusercontent.com/wiresock/amneziawg-install/main/amneziawg-web.sh chmod +x amneziawg-web.sh sudo ./amneziawg-web.sh install
Если удобнее работать из checkout репозитория, то можно и так:
git clone https://github.com/wiresock/amneziawg-install.git cd amneziawg-install sudo ./amneziawg-install.sh sudo ./amneziawg-web.sh install
Для меня здесь был важен сам принцип: сначала поднять минимально рабочую конфигурацию, а потом уже решать, нужна ли сверху панель. Не наоборот.
Мне не хотелось, чтобы вся история упиралась только в интерактивный мастер. Поэтому у install-скрипта есть и неинтерактивный режим, и отдельные флаги для базовых операций с клиентами.
Например, так:
sudo AUTO_INSTALL=y ./amneziawg-install.sh
А базовые операции с клиентами можно делать так:
sudo ./amneziawg-install.sh --add-client alice sudo ./amneziawg-install.sh --remove-client alice sudo ./amneziawg-install.sh --list-clients
То есть это история не только про «один раз поднять сервер», но и про нормальное сопровождение после.
Панель не обязана торчать в интернет
Еще один момент, который для меня был важен с самого начала: панель не должна по умолчанию торчать наружу.
После установки она слушает 127.0.0.1:8080, а дальше уже администратор сам решает, как именно с ней работать. Если нужен постоянный внешний доступ - можно поставить reverse proxy. А если панель нужна только самому администратору, то ее можно вообще не публиковать наружу и заходить через SSH-туннель.
Например, так:
ssh -L 8080:127.0.0.1:8080 user@your-server.example
После этого панель будет доступна в локальном браузере по адресу http://127.0.0.1:8080, хотя наружу на сервере она по-прежнему не опубликована.
На мой вкус, для админки это гораздо более здоровый стартовый режим, чем сразу выставлять ее наружу, а потом объяснять, почему так делать не стоило.
Сервер подняли. Дальше начинается интересное
Отдельно стоит упомянуть еще одну важную тему - уже не серверную, а клиентскую. Недостаточно просто поднять сервер и получить рабочий туннель. В текущих условиях не менее важно и другое: как этот трафик выглядит со стороны и не привлекает ли он лишнего внимания.
В протоколе AmneziaWG за это отвечают параметры I1–I5. Их задача - сделать соединение похожим на известный и безобидный протокол. Без такой подстройки добиться чего-то действительно живучего и пригодного для реального использования почти невозможно. Во многих случаях проще запустить Cloudflare WARP с грамотно подобранной начальной маскировкой, чем использовать полноценную AmneziaWG 2.0 без нее.
При этом для обычного пользователя работа с «сырыми» параметрами пакетов - мягко говоря, не самый удобный сценарий. Поэтому в WireSock к этой же задаче мы подошли иначе: вместо прямой ручной настройки I1–I5 используется более прикладная модель - через выбор протокола, домена и браузера, в частности для QUIC. Подход другой, но логика остается той же.
Уходить здесь в конкретные практические рекомендации я не буду - не хочется повторять историю, которая уже случилась с другой моей статьей. Тем более что параметры, работающие сегодня, завтра могут оказаться бесполезными.
Когда консоль уже слегка надоела
Пока пользователей мало, веб-панель не выглядит чем-то жизненно необходимым. Базовый скрипт и так умеет все, что нужно для нормальной жизни.
Но как только инфраструктура выходит из режима «я и еще пара человек», начинает накапливаться та самая мелкая рутина, которая по отдельности вроде бы ерунда, а в сумме начинает съедать время.
Именно для этого я и добавил веб-панель. Не как замену исходному скрипту, а как более удобный интерфейс к тем операциям, которые и так уже нужны в повседневной эксплуатации.
Сам интерфейс панели при этом получился простым и интуитивно понятным. И, наверное, именно этого мне от него и нужно: не впечатлять пользователя архитектурной красотой, а быстро давать доступ к тем действиям, ради которых панель вообще открывают.
В текущем виде она берет на себя все то, что исходный install-скрипт умеет делать с пользователями: добавление, удаление, временное отключение, плюс немного сопутствующей статистики. При этом я сознательно не хочу описывать ее как «готовую законченную платформу»: она продолжает развиваться и для меня остается прежде всего рабочим инструментом, который обрастает теми возможностями, которые реально полезны в эксплуатации.
Чем к этому вообще подключаться
С клиентами у меня в итоге все довольно прагматично.
Под Windows я бы рекомендовал WireSock Secure Connect. Сразу отмечу, что эта рекомендация не совсем беспристрастна, поскольку это мой собственный проект. Начиная с версии 3.3.1, в нём появилась поддержка AmneziaWG 2.0. Бета-версии доступны и на официальном сайте, однако самые свежие сборки обычно сначала появляются в официальном Telegram-канале.
Под iOS у меня вполне нормально показал себя AmneziaWG.
Под Android - WG Tunnel.
Разумеется, это не попытка составить исчерпывающий рейтинг клиентов под все платформы, а просто тот комплект, который у меня в реальной эксплуатации оказался наиболее удобным.
Вместо вывода
В итоге получилась довольно приземленная конструкция: install-скрипт для развертывания self-hosted AmneziaWG, веб-панель для повседневного управления пользователями и понятный клиентский сценарий без лишней магии.
Не идеальный VPN на все случаи жизни, не «платформа», не «экосистема» и не очередной способ случайно собрать пол-DevOps-отдела ради пары клиентов. Просто рабочий инструмент, который решает вполне понятную задачу.
Для меня этого более чем достаточно.
