Ворочаем прокси на локалхосте
В этой заметке покажу лайвхак для управления проксями на компьютере.
У меня, как и у большинства, 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