[home] [projects] [knowledge base] [manpages] [code] [markdown] [my ip]

Ворочаем прокси на локалхосте

В этой заметке покажу лайвхак для управления проксями на компьютере.

У меня, как и у большинства, systemd и это весьма удобно. Особенно удобно, что systemd поддерживает пользовательские юниты. Другая полезная фича — template unit files.

Подготовка юнитов

Юниты лежат в локальной дире юзера. Если её нет, то создаём:

mkdir -p ~/.config/systemd/user

И ещё создадим папку для env-файлов:

mkdir -p ~/.config/defaults

Теперь запишем файлы сервисов.

Для SSH-прокси ~/.config/systemd/user/ssh-proxy@.service:

[Unit]
Description=SSH tunnel to %I
After=network.target

[Service]
Environment="LOCAL_ADDR=localhost"
EnvironmentFile=%h/.config/defaults/ssh-proxy@%i
ExecStart=/usr/bin/ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -D ${LOCAL_ADDR}:${LOCAL_PORT} ${TARGET}
RestartSec=5
Restart=always

[Install]
WantedBy=default.target

Для Shadowsocks ~/.config/systemd/user/shadowsocks@.service:

[Unit]
Description=Shadowsocks tonnel to %I
After=network.target

[Service]
EnvironmentFile=%h/.config/defaults/shadowsocks@%i
ExecStart=/usr/bin/ss-local -c ${CONFIG_FILE}
RestartSec=5
Restart=always

[Install]
WantedBy=default.target

EnvironmentFile

Для SSH-прокси создаём файлы в дире ~/.config/defaults:

TARGET=fermi
LOCAL_ADDR=127.0.0.1
LOCAL_PORT=1080

В TARGET пишем хостнейм, можно в формате user@host, но у меня в ~/.ssh/config уже есть User root, так что нужды нет.

Имя файла должно иметь формат ssh-proxy@fermi. fermi в моём случае это имя хоста.

Для Shadowsocks файл будет выглядеть сильно проще, я просто добавляю путь до конфига:

CONFIG_FILE=/home/ge/.config/shadowsocks/nl-ams.json

Имя файла по тому же правилу — shadowsocks@fermi.

Как этим пользоваться

Работает всё очень просто:

systemctl --user start ssh-proxy@fermi.service

Далее, в любой программе, которая поддкрживает SOCKS4 или SOCKS5 прокси прописываем локлаьный адрес, который задали в ssh-proxy@fermi.

Наглядно увидеть, что прокси работает можно отправив такой запрос:

curl --proxy socks5h://localhost:1080 eth0.me

В терминале увидите IP-адрес прокси-сервера.

Для Firefox есть прекрасное в своей простоте расширение Proxy Toggle, которое позволит одним тычком мыши включать и выключать проксирование.

Небольшая автоматизация

Я наклепал на шелле небольшую обёртку для сокращения писанины — pmgr (proxy manager). Она оборачивает systemctl и делает ещё пару полезных вещей.

pmgr -- proxy manager

Usage: pmgr [options] [<arguments>]

Options:
    -l      list proxies
    -e      enable (start) proxy
    -d      disable (stop) proxy
    -r      restart proxy
    -s      show proxy status
    -j      view proxy logs
    -o      print $PMGR_ENV_DIR
    -R      run systemctl --user daemon-reload
    -a      add to autostart
    -A      remove from autostart
    -h      print this help message and exit
    -v      print version and exit

Самое удобное тут:

  • Можно переключаться между прокси-серверами не занимясь постоянным вкл/выкл.

  • pmgr -l рисует красивую табличку со сводными данными.

Устновка:

wget -O pmgr https://git.nxhs.cloud/ge/proxy-manager/raw/branch/master/pmgr
install -Dm755 pmgr ~/.local/bin/pmgr

Для полного счастья стоит добавить автодополнение имён юнитов. В ~/.bashrc:

complete -W "$(find ~/.config/defaults -type f -printf '%f ')" pmgr