Настраиваем свой маленький, домашний и ламповый VPN на основе Shadowsocks (Outline). Нужен Raspberry и настраиваемый wi-fi-роутер. Пошаговая инструкция. Без абонентской платы и аренды VPS.
Прежде всего, небольшой дисклеймер: я ненастоящий сварщик, я просто перелопатил много информации, скомпилировал ее и получил нужный мне результат. Им я и поделюсь со всем миром, где известное правительство пытается блокировать уже частные соединения 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
Теперь мы имеем статичное доменное имя, по которому можно обращаться к нашему 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” вставляем ту наше »зеленую” строчку.
VPN-сервер готов.
Открываем вкладку 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-серверу. «Миссия невыполнима», скачанная с торрентов младшим братишкой, в вашей стране будет выглядеть так, что это сделали вы со всеми вытекающими последствиями.
*некоммерческая организация выполняющая функции иностранного агента
Комментарии (33)
Artem_Khromov
29.08.2023 09:40+4я живу за границами РФ;
После этого можно закрывать статью, если нет друга который не в РФ, то покупаем VPS и платим $
wifi-роутер Fritz! Box 6690 (у вас может быть любой другой не тупой роутер, который можно настраивать в деталях);
Тут лучше сразу написать какие именно настройки должны быть в роутере для реализации проекта
Инструкций по создании своего VPN очень много и многие типичны, эта статья не выделяется
Araki_Satoshi
29.08.2023 09:40+3Ну почему, мне вот например статья оказалась очень полезной. Я тоже живу за границей РФ и ещё в начале этих событий поднял Wireguard сервер для друзей из РФ на крайний случай. Теперь буду думать с организацией альтернативы по статье, благо дешевенький Orange Pi есть, который это дело должен без проблем потянуть.
MiraclePtr
29.08.2023 09:40+3Несколько ремарк:
Outline
Недостаток его в том, что он использует старую версию Shadowsocks, которая имеет ряд уязвимостей и китайцы научились ее блочить (правда, мне кажется, наш РКН до такого еще не скоро дорастет, туповаты ребята). Shadowsocks-2022 в этом плане надежнее.
из преимуществ также является то, что соединение устанавливается не с хостинг-провайдером
еще одно преимущество - некоторые сервисы (например OpenAI/ChatGPT) банят подключения с non-residential IP-адресов, а вот в вашем случае все должно работать как надо.
скачивание торрентов
Если это важно, то стоит присмотреться к аналогам, XRay, например, позволяет резать доступ через прокси по протоколам (в том числе bittorrent).
XOR2048
29.08.2023 09:40Недостаток его в том, что он использует старую версию Shadowsocks, которая имеет ряд уязвимостей и китайцы научились ее блочить (правда, мне кажется, наш РКН до такого еще не скоро дорастет, туповаты ребята).
К сожалению, реальность такова, что в некоторых регионах очень не массово, но тестировали/тестируют блокировку Shadowsocks, причем успешно, происходит это так отслеживаются трафик SS на хост, далее убеждаются, что там SS и блокируют на пару часов.
P.S - хотелось бы дополнить, что все, что описано здесь, смогут сделать и в РФ при большом желании.
entze
29.08.2023 09:40+1Итого, получается что SS в реализации Outline не живуч. Плюс развивается довольно вяло и к нему нет интереса китайцев (насколько понимаю, основных разработчиков и пользователей устойчивых решений).
MiraclePtr
29.08.2023 09:40+2далее убеждаются, что там SS
при использовании SS-2022 на сегодняшний день даже у китайцев не существует хороших методов определить, что "там SS".
То, что описано в документе имеет катастрофический collateral damage - по сути дела они там пытаются определить используемый протокол, и если он не похож ни на что стандартное и им известное, они проверяют, что это не какой-то текстовый протокол типа HTTP или Telnet (тупо анализирую статистику, сколько байт из первых пакетов является ASCII-символами, а сколько нет), и если нет, то грохают подключение. Метод очень тупой и очень неточный (заодно страдает куча других совершенно безобидных протоколов).XOR2048
29.08.2023 09:40при использовании SS-2022 на сегодняшний день даже у китайцев не существует хороших методов определить, что "там SS"
Про SS-2022 не так много знаю. Мое сообщение было про старый SS, который используется в Outline и большинством юзеров.
An_private
29.08.2023 09:40+2Обычный провайдер домашнего интернета по умолчанию выдает динамический IP-адрес, который время от времени меняется. Зафиксировать его можно либо арендовав постоянный IP-адрес
Мммм. А разве сейчас по умолчанию не NAT? И на одном внешнем IP адресе может спокойно висеть пара сотен компов. Или всё-таки реальный внешний адрес дают каждому пользователю (пусть и диначмический)?
KONMAX
29.08.2023 09:40+1Зависит от провайдера. Ростелеком выдает динамический либо серый, либо белый(как повезет). МТС выдает серый адрес.
Pas
29.08.2023 09:40+1Европейские кабельные провайдеры по большей части вполне себе выдают динамические реальники и пока не балуются CGNAT, имея запасы айпишников. Главное этот самый реальник пробриджевать с кабельного модема на роутер, что может быть не всегда тривиально
PsihXMak
29.08.2023 09:40+3Малинка стоит около 80 евро. Мне кажется, удобнее взять vps за 3-4 евро в месяц и особо не париться.
MiraclePtr
29.08.2023 09:40+2Малинку можно под много что еще использовать для дома, так что тут зависит от ситуации.
sshemol
29.08.2023 09:40-4И какой смысл в поднятии VPN сервера в собственной локалке?
MiraclePtr
29.08.2023 09:40+6Это не VPN для собственной локалки, это VPN для пользователей из другой страны. Читайте пожалуйста статью внимательно прежде чем комментировать.
Tuxozaur
29.08.2023 09:40Настроить VPS и поднять на нём сервер shadowsocks - не проблема. Может уважаемый хабр поделится, как настроить клиент на роутере с Asuswrt Merlin?
MiraclePtr
29.08.2023 09:40+1Merlin Clash
Только там интерфейс на китайском...Tuxozaur
29.08.2023 09:40Там прям прошивка, а мне бы лучше на ванильную ручками из Entware поставить...
XOR2048
29.08.2023 09:40Вы про установку SS на роутер с поддержкой Entware?
Если я правильно понял, то вот недавно статью выпустили (только там пускают WG over SS).Harwest
29.08.2023 09:40+1В свежей стабилке openwrt завезли обфускатор для wg, вчера обнаружил при сборке.
MiraclePtr
29.08.2023 09:40+2Интересно. Как называется пакет?
Harwest
29.08.2023 09:40+1iptables-mod-wgobfs
Некое расширение для обфускации. Включил в прошивку но не пробовал что это такое.
MiraclePtr
29.08.2023 09:40+2Видимо не судьба, мейнтейнеры Entware прямым текстом говорят "мы не хотим добавлять в репы очередные средства обхода блокировок, помощи от нас не ждите, и вообще, не надо нарушать законы" (1, 2).
Поэтому там есть только голые (консольные и без transparent proxy) клиенты shadowsocksR и v2ray, и тот и другой в наше время уже морально устарели и не поддерживают современные протоколы и фичи.По первой ссылке есть пример скрипта для старого v2ray и советы какой бинарь выбрать, по идее, реально адаптировать его под xray и накатить вручную.
VIVIM
29.08.2023 09:40А если использовать не Малинку, а обычный старенький комп на каком-нибудь Р4, какую ось туда лучше поставить?
Реальность сейчас такова, что нужно иметь не только VPN где-то там, но иногда нужно иметь VPN и где-то в России.
MiraclePtr
29.08.2023 09:40+1какую ось туда лучше поставить?
Ту, с которой вы имеете больше всего опыта работы и настройки, и если перед "старенький компом" не будет стоять роутера с фаерволом - ту, для которой до сих пор выходят апдейты безопасности. А бы накатил какой-нибудь самый обычный Debian. Хорошо бы ещё знать, сколько на машинке памяти, т.к. на 256 мегабайтах далеко не каждый современный дистрибутив запуститься сможет (даже с голой консолью - последняя Ubuntu Server не запускается даже на 512Mb).
Dupych
29.08.2023 09:40-2После слов я не из РФ, думал закрыть статью.
Но любопытсво взяло вверх.
После того как афтор использовал Докер просто пролистал.
Докеры это неведомая хрень, которая неведомо как и кем собрана.
Купиль в германии сервер за 3 евро.
Поставил своими ручками из оригинальных исходников OpenVPN.
Посадил его на 443 порт.
Сделал конфиг с ключами в одном файле.
Прикрутил к микротик.
Сделал 2 адреслиста.
Для сайтов типа rutor.is
Для ip домашних устрйств типа сервер dell вывести для получения обнов
Все работает как часы
MiraclePtr
29.08.2023 09:40+3Докеры это неведомая хрень, которая неведомо как и кем собрана.
Что запрещает заглянуть в Dockerfile перед тем как его разворачивать и сбилдить контейнер локально? Там все предельно прозрачно будет.
Поставил своими ручками из оригинальных исходников OpenVPN
Установка софта ручками из исходников напрямую без пакетного менежера или контейнеров - самый верный способ развести срач в системе и получить потенциальные проблемы с конфликтами в будущем при апгрейдах. Ну и трата времени.
OpenVPN
В наше время голый OpenVPN - очень сомнительное решение, РКН его уже умеет блокировать при необходимости без особых затруднений.
entze
29.08.2023 09:40+1Даже как-то грустно, что после ковровых блокировок телеграма целыми подсетями, после цикла твоих статей и при массовых блокировках по протоколу, читать "поставил OVPN на VPS за 3$ а вы тут херней страдаете". Должна же быть у людей какая-то мыслительная деятельность за пределами несложного навыка.
MountainGoat
Для тех, кто считает, что Outline нафиг не нужен, есть моя старая статья Она не особо устарела, только ставить в наши дни нужно shadowsocks-rust.