Вступление

Привет, дорогой читатель! В своей первой статье я разобрался как подключить Outline VPN на сервере без графического интерфейса.

Начну немного издалека. Меня зовут Сергей и я :[||наркоман||]: сисадмин, плавно дрейфующий с Windows в сторону Linux. У меня хорошая работа, неплохая зарплата, но всегда хочется чего-то новенького, так вот случилось и у меня. С Linux у меня связано много приятного, но раньше это всегда было на уровне курения манулов, в какой-то момент что-то щёлкнуло у меня в голове и я начал изучать Bash и собственно углубляться в *NIX-подобные системы. Надеюсь, не сильно утомил таким введением, потому что, в общем-то перехожу к сути. Скриншотов будет мало, воды - много.

TL:DR

Используйте shadowsocks-libev-local с конфигом на основе дефолтного

Завязка

Есть у меня несколько тестовых серверов, где я опробую всякое. И вот, понадобилось мне уже пользоваться VPN, но, вот беда, РКН научился резать OpenVPN и Wireguard заграницу. А terraform отказывается не только скачиваться, но и работать в России. На мобильном телефоне и десктопах пользуюсь одним отличным сервисом VPN(не реклама) так вот, они предлагают Outline как основной метод, у Outline неплохой клиент, который работает только в графической среде. Но что делать с сервером? Гугление и дакдакление внятного ничего не показало, лишь обрывки информации, которые я и собрал в этой статье. Итак:

Начнём

Для начала у нас должен быть конфиг для подключения вида ss://bla-bla-bla, ss://bla-bla-bla#name или ss://bla-bla-bla@server.serv:port#name. Поговаривают, что последний вариант тоже существует, я не встречал, поэтому будем работать с первым видом. Его мы должны расшифровать, как говорит автор первой статьи - с помощью сайта-декодировщика. Вставляю только часть bla-bla-bla и вот, что у меня получается:

Base64Decoder screenshot
*данные, конечно же, невалидные*

Ставим пакет 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)


  1. VenbergV
    16.09.2024 09:26

    Ровно такую же проблему решал в пятницу с Terraform.
    И оказалось, что Terraform и даже Packer до сих пор вполне хорошо работает через зеркала.
    Например yandex. Или comcloud.
    Но за установку клиента, вам отдельное спасибо. Для него есть локальные задачи.


    1. PhantomCat71 Автор
      16.09.2024 09:26

      И вам спасибо за комментарий, статья пролежала довольно долгое время в песочнице. Когда писал - были трудности с терраформ даже у яндекс. Но они быстро починили.

      К тому же, было интересно разобраться, а от этого и статья вышла.


  1. RighteousHippie
    16.09.2024 09:26
    +1

    У Outline есть официальный cli клиент, написан на go, прекрасно работает на Linux

    https://github.com/Jigsaw-Code/outline-sdk/tree/main/x/examples/outline-cli


    1. PhantomCat71 Автор
      16.09.2024 09:26

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


  1. degistration
    16.09.2024 09:26

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


    1. PhantomCat71 Автор
      16.09.2024 09:26

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


  1. schebotar
    16.09.2024 09:26

    У меня Shadowsocks прирезали по скорости в тот же день, что отвалился wg. То есть подключение есть, но YouTube тот же уже не посмотреть.
    Перешёл на xray, работает прекрасно. Похоже это теперь необходимый минимум.


    1. PhantomCat71 Автор
      16.09.2024 09:26

      Согласен, но с поправкой, что и xray иногда подглючивает, переключаюсь между ними по мере необходимости