Пробрасываем локальный порт на удалённый хост

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

Принцип работы

Сценарий запуска:

  1. соединяемся с API при помощи утилиты curl, получаем ответ. Если возникает ошибка, скрипт завершает свою работу (благодаря параметру set -e);
  2. штатными средствами Bash разбираем полученный от API результат и разделяем IP-адрес и номер порта;
  3. включаем маскарадинг для указанной зоны брандмауэра;
  4. перенаправляем указанный локальный порт на удалённый сервис.

Сценарий остановки:

  1. отключаем маскарадинг для указанной зоны брандмауэра;
  2. удаляем правило перенаправления локального порта.

Лицензия

Код распространяется под лицензией GNU GPL версии 3 без каких-либо гарантий (явных или подразумеваемых). Используйте его исключительно на свой страх и риск.

Литература

При написании статьи использовалась литература из следующих источников: