После публикации на тему port knocking один читатель поделился шикарной утилитой, с помощью которой можно похожим образом открывать доступ на основе HTTP запроса, что во многих случаях удобнее отправки пакетов. Программа называется labean. Автор русскоязычный, поэтому подобное название не случайно (кто не понял, читайте наоборот).
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Идея подобного функционала у меня давно сидела в голове, но до реализации дело не дошло. А готовых инструментов я раньше не встречал и даже не слышал о них. 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, очень понравился результат. Настраивается быстро и легко. Рассказываю по шагам для Debian или Ubuntu.
Сначала собираем утилиту из исходников. Написана на 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 адреса, но у меня почему-то сходу не заработало. Пока не разбирался.
Вот такая простая и удобная программа. Рекомендую обратить внимание. Я точно буду пользоваться, так как это очень удобно. Заметка получилось полной инструкцией.