В последнее время стали появляться программы, предназначенные для пробрасывания локального порта на удалённый прокси. Некоторые разработчики для этого даже используют такие инструменты, как Electron, хотя всю логику можно уместить в одном простейшем скрипте. Здесь мы это продемонстрируем.
Скрипт для Fedora
Наш код написан на чистом bash с использованием утилит curl и firewall-cmd:
#!/bin/bash set -ef API=http://api.rufolder.net/JIkJnKmlsFIB/v2/proxies PORT=8080 ZONE=public function fw_add { a=$(curl -sS $API) array=(${a//:/ }) firewall-cmd --zone=$ZONE --add-masquerade firewall-cmd --zone=$ZONE --add-forward-port=port=$PORT:proto=tcp:toport=${array[1]}:toaddr=${array[0]} } function fw_rem { firewall-cmd --zone=$ZONE --remove-masquerade firewall-cmd --zone=$ZONE --remove-forward-port=port=$PORT:proto=tcp } function fw_msg { echo "Use additional command-line parameters:" echo " * start - start script and add forward rules;" echo " * stop - stop script and remove forward rules." } case "$1" in "start") fw_add ;; "stop") fw_rem ;; *) fw_msg ;; esac
Конфигурация
Скрипт имеет несколько настраиваемых пользователем параметров:
- API — URL сервиса, который предоставляет IP-адреса точек назначения для перенаправления портов (прокси, SOCKS и т.п.);
- PORT — локальный порт, который будем перенаправлять;
- ZONE — зона FirewallD для основного соединения.
Работа со скриптом
Скрипт добавляет временные правила, которые работают либо до перезагрузки системы, либо перезапуска FirewallD, либо их отмены пользователем.
Предположим, что мы сохранили указанный выше код в виде файла под именем rt.sh и выдали ему флаг +x. В таком случае запуск осуществляется так:
./rt.sh start
Остановка и отмена всех созданных правил:
./rt.sh stop
Принцип работы
Сценарий запуска:
- соединяемся с API при помощи утилиты curl, получаем ответ. Если возникает ошибка, скрипт завершает свою работу (благодаря параметру set -e);
- штатными средствами Bash разбираем полученный от API результат и разделяем IP-адрес и номер порта;
- включаем маскарадинг для указанной зоны брандмауэра;
- перенаправляем указанный локальный порт на удалённый сервис.
Сценарий остановки:
- отключаем маскарадинг для указанной зоны брандмауэра;
- удаляем правило перенаправления локального порта.
Лицензия
Код распространяется под лицензией GNU GPL версии 3 без каких-либо гарантий (явных или подразумеваемых). Используйте его исключительно на свой страх и риск.
Литература
При написании статьи использовалась литература из следующих источников: