Вступление
Привет, дорогой читатель! В своей первой статье я разобрался как подключить Outline VPN на сервере без графического интерфейса.
Начну немного издалека. Меня зовут Сергей и я :[||наркоман||]: сисадмин, плавно дрейфующий с Windows в сторону Linux. У меня хорошая работа, неплохая зарплата, но всегда хочется чего-то новенького, так вот случилось и у меня. С Linux у меня связано много приятного, но раньше это всегда было на уровне курения манулов, в какой-то момент что-то щёлкнуло у меня в голове и я начал изучать Bash и собственно углубляться в *NIX-подобные системы. Надеюсь, не сильно утомил таким введением, потому что, в общем-то перехожу к сути. Скриншотов будет мало, воды - много.
TL:DR
Используйте shadowsocks-libev-local с конфигом на основе дефолтного
Завязка
Есть у меня несколько тестовых серверов, где я опробую всякое. И вот, понадобилось мне уже пользоваться VPN, но, вот беда, РКН научился резать OpenVPN и Wireguard заграницу. А terraform отказывается не только скачиваться, но и работать в России. На мобильном телефоне и десктопах пользуюсь одним отличным сервисом VPN(не реклама) так вот, они предлагают Outline как основной метод, у Outline неплохой клиент, который работает только в графической среде. Но что делать с сервером? Гугление и дакдакление внятного ничего не показало, лишь обрывки информации, которые я и собрал в этой статье. Итак:
из статьи Настройка клиента Outline VPN на OpenWRT (все версии) на базе пакета shadowsocks-libev и tun2socks мы узнаём куда копать и чем копать. Outline использует Shadowsocks, поэтому поставим в систему пакет.
из статьи Shadowsocks-туннелирование корпоративного VPN мы узнаём как правильно копать. Настроим клиент.
-
из опыта и прочих манулов покажу куда и что прописать чтобы заработало для:
только одного пользователя
всей системы
проверим подключения
Начнём
Для начала у нас должен быть конфиг для подключения вида ss://bla-bla-bla, ss://bla-bla-bla#name или ss://bla-bla-bla@server.serv:port#name. Поговаривают, что последний вариант тоже существует, я не встречал, поэтому будем работать с первым видом. Его мы должны расшифровать, как говорит автор первой статьи - с помощью сайта-декодировщика. Вставляю только часть bla-bla-bla и вот, что у меня получается:

Ставим пакет shadowsocks и отключаем запуск сервера, он нам не нужен
sudo ‑i
apt update && apt install shadowsocks‑libev
systemctl stop shadowsocks-libev
systemctl disable shadowsocks-libev
Теперь нам с вами необходимо написать конфиг клиента, напишем мы его на основе дефолтного конфига. Сначала сохраним его. потом переименуем и отредактируем в соответствии выданного нам декодером. Кстати, продолжаем работать под рутом.
cp /etc/shadowsocks-libev/config.json /etc/shadowsocks-libev/config.json.bak
mv /etc/shadowsocks-libev/config.json /etc/shadowsocks-libev/myvpn.json
vim /etc/shadowsocks-libev/myvpn.json
В моём случае сервер статичный и сколько я им пользуюсь - не переезжал, поэтому я заранее перевёл доменное имя в IPv4 адрес (так как у меня здесь пример адреса - вставлю IP DNS от Google: 8.8.8.8)
Изменим дефолтный конфиг в соответствии с нужными нам данными, представлю это в виде diff
{
- "server":["::1", "127.0.0.1"],
+ "server":"8.8.8.8",
"mode":"tcp_an_udp",
- "server_port":8388,
+ "server_port":50851,
+ "local_address":"127.0.0.1",
- "local_port":1080,
+ "local_port":631,
- "password":"7vezO2wapZQM",
+ "password":"2BBNmjghKUghbf90wshjbfw9uhKUyhfo8uy9w8yfg2yg3djhge8mHkyTcrg",
- "timeout":86400,
+ "timeout":300,
"method":"chacha20-ietf-poly1305"
}
В итоге наш конфиг должен выглядеть следующим образом:
{
"server":"8.8.8.8",
"mode":"tcp_an_udp",
"server_port":50851,
"local_address":"127.0.0.1",
"local_port":631,
"password":"2BBNmjghKUghbf90wshjbfw9uhKUyhfo8uy9w8yfg2yg3djhge8mHkyTcrg",
"timeout":300,
"method":"chacha20-ietf-poly1305"
}
Сохраняем и выходим из vim, я надеюсь, что все знают как это делать, если нет - тренируйтесь, очень крутая штука.
Подключение
Мы сконфигурировали клиента shadowsocks и теперь его нужно запустить и проверить. Я надеюсь, вы всё ещё в сессии root
systemctl start shadowsocks-libev-local@myvpn.service
curl https://ifconfig.me
curl --proxy socks5://127.0.0.1:631 https://ifconfig.me
Вы должны увидеть сначала свой IP, а потом - IP вашего VPN сервера
Если всё получилось - великолепно, сделаем сервис постоянным (если нужно, если нет - пропустите этот шаг)
systemctl enable shadowsocks-libev-local@myvpn.service
exit
На этом шаге мы выходим из сессии root
Но писать для каждого сервиса, что рвётся в сеть отдельный параметр с прокси - не наш метод, к тому же, такой параметр бывает не у всех.
Пропишем прокси в оружение, и здесь у нас есть выбор: прописать отдельно для пользователя или для всей системы. Тут всё просто, для того, чтобы прописать переменные окружения мы добавляем следующие строки в ~/.bashrc, а для всей системы в /etc/environment (для этого редактор нужно запустить от суперпользователя), только и всего. Обратите внимание, что строки дублируются в верхнем и нижнем регистрах, это сделано для того, чтобы, как поговаривают в сети, всем клиенты был доступен прокси, сам я не проверял, лучше пусть будет лишняя строка, чем что-то не работает.
export HTTP_PROXY="socks5://127.0.0.1:631"
export http_proxy="socks5://127.0.0.1:631"
export HTTPS_PROXY="socks5://127.0.0.1:631"
export https_proxy="socks5://127.0.0.1:631"
export FTP_PROXY="socks5://127.0.0.1:631"
export ftp_proxy="socks5://127.0.0.1:631"
export NO_PROXY="127.0.0.1,localhost,192.168.25.0/24"
export no_proxy="127.0.0.1,localhost,192.168.25.0/24"
В переменную окружения NO_PROXY я прописал как локальный хост и IP, так и IP домашней подсети
Применяем настройки и проверяем работоспособность.
source ~/.bashrc
curl --proxy socks5://127.0.0.1:631 https://ifconfig.me
Заключение
Надеюсь, что вам было интересно читать, буду благодарен любым комментариям. Если у вас всё прошло успешно и моя статья помогла - значит мои изыскания не были напрасны!
И, хочу добавить ещё вот что: чтобы сделать быструю команду отключения прокси добавьте alias в свой .bashrc:
alias no-proxy="unset HTTP_PROXY http_proxy HTTPS_PROXY https_proxy FTP_PROXY ftp_proxy NO_PROXY no_proxy"
Хотя, можете сделать и 2 скрипта (на включение переменных окружения и на отключение)... Всё в ваших руках, это же GNU/Linux!
Всего вам хорошего и отличного настроения!
PS
Да, я пошутил насчёт воды, то, что я написал - это для меня довольно много, тренируюсь писать больше. Спасибо, что дочитали.
Комментарии (8)

RighteousHippie
16.09.2024 09:26+1У Outline есть официальный cli клиент, написан на go, прекрасно работает на Linux
https://github.com/Jigsaw-Code/outline-sdk/tree/main/x/examples/outline-cli

PhantomCat71 Автор
16.09.2024 09:26Когда я писал статью рабочего cli не было. Тем не менее, как написали ниже, shadowsocks потихоньку учатся резать. Надо писать новую статью, наверное, про то, как жонглировать подключениями и туннелями.

degistration
16.09.2024 09:26не распространяй сильно статью а то захочешь что лучше бы оформили за наркоманию

PhantomCat71 Автор
16.09.2024 09:26В статье приводится способ подключения протокола shadowsocks в headless сервере. Никакой агитации или рекламы впн услуг не производится.

schebotar
16.09.2024 09:26У меня Shadowsocks прирезали по скорости в тот же день, что отвалился wg. То есть подключение есть, но YouTube тот же уже не посмотреть.
Перешёл на xray, работает прекрасно. Похоже это теперь необходимый минимум.
PhantomCat71 Автор
16.09.2024 09:26Согласен, но с поправкой, что и xray иногда подглючивает, переключаюсь между ними по мере необходимости
VenbergV
Ровно такую же проблему решал в пятницу с Terraform.
И оказалось, что Terraform и даже Packer до сих пор вполне хорошо работает через зеркала.
Например yandex. Или comcloud.
Но за установку клиента, вам отдельное спасибо. Для него есть локальные задачи.
PhantomCat71 Автор
И вам спасибо за комментарий, статья пролежала довольно долгое время в песочнице. Когда писал - были трудности с терраформ даже у яндекс. Но они быстро починили.
К тому же, было интересно разобраться, а от этого и статья вышла.