Идея подобного функционала у меня давно сидела в голове, но до реализации дело не дошло. А готовых инструментов я раньше не встречал и даже не слышал о них. Labean работает очень просто и эффективно. С его помощью можно выполнить любое действие при определённом http запросе. Например, обращаемся на url http://10.20.1.56/labean/tuktuk/ssh/on, а labean выполняет проброс порта на нужный сервер. То есть выполняет конкретное действие:
iptables -t nat -A PREROUTING -p tcp --dport 31004 -i ens18 \-s 10.20.1.1 -j DNAT --to 10.30.51.4:22Я проверил работу labean, очень понравился результат. Настраивается быстро и легко. Рассказываю по шагам.
Сначала собираем утилиту из исходников. Написана на GO.
# apt install golang git nginx# git clone https://github.com/uprt/labean.git# cd labean# go buildКопируем бинарник, конфиг и systemd unit.
# cp labean /usr/sbin# cp examples/labean.conf.ex /etc/labean.conf# cp examples/labean.service.ex /etc/systemd/system/labean.serviceРисуем примерно такой конфиг:
{ "listen": "127.0.0.1:8080", "url_prefix": "tuktuk", "external_ip": "10.20.1.56", "real_ip_header": "X-Real-IP", "allow_explicit_ips": true, "tasks": [ { "name": "ssh", "timeout": 30, "on_command": "iptables -t nat -A PREROUTING -p tcp --dport 31004 -i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22", "off_command": "iptables -t nat -D PREROUTING -p tcp --dport 31004 -i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22" }, { "name": "postfix", "timeout": 0, "on_command": "systemctl start postfix", "off_command": "systemctl stop postfix" } ]}Не буду все настройки описывать, можно в репозитории посмотреть. Я для теста сделал 2 сервиса и 2 разных действия для них. Первое действие добавляет правило в iptables, второе - запускает службу. Проверил оба примера, всё работает. Привожу для наглядности, чтобы вы понимали функционал. Labean может делать всё, что угодно, а не только правила firewall изменять.
Теперь для любого хоста, к которому мы будем обращаться, добавляем в конфиг nginx ещё один location. Я добавил прямо в default, чтобы по ip обращаться.
location ~ ^/labean/(.*) { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080/$1;}При желании можно добавить basic auth и закрыть паролем.
Перечитываем службы systemd и запускаем:
# systemctl daemon-reload# systemctl start nginx labeanИдём по урлу http://10.20.1.56/labean/tuktuk/ssh/on и смотрим результат:
{ "commandLine": "iptables -t nat -A PREROUTING -p tcp --dport 31004 -i ens18 -s 10.20.1.1 -j DNAT --to 10.30.51.4:22", "returnCode": 0, "timeoutInSeconds": 30, "clientIp": "10.20.1.1"}Зайдём в консоль сервера и посмотрим правила iptables:
# iptables -L -v -n -t nat | grep 31004 0 0 DNAT tcp -- ens18 * 10.20.1.1 0.0.0.0/0 tcp dpt:31004 to:10.30.51.4:22Через 30 секунд правило исчезнет. За это отвечает параметр timeout. Если поставить 0, то само удаляться не будет, и нужно будет вручную зайти на закрывающий урл - http://10.20.1.56/labean/tuktuk/ssh/off.
Как вы уже поняли, обращение к url http://10.20.1.56/labean/tuktuk/postfix/on и http://10.20.1.56/labean/tuktuk/postfix/off будет запускать и останавливать службу postfix. Дергать эти адреса можно как в браузере, так и через curl.
В документации заявлена ещё одна возможность через дополнительный аргумент ?ip=123.56.78.9 указывать для обработки различные ip адреса, но у меня почему-то сходу не заработало. Пока не разбирался.
Вот такая простая и удобная программа. Рекомендую обратить внимание. Я точно буду пользоваться, так как это очень удобно. Заметка получилось полной инструкцией.
#security #gateway