Например, обращаемся на url https://service.example.com/tuktuk/ssh/on, а Labean выполняет проброс порта на нужный сервер. То есть выполняет конкретное действие на сервере:
iptables -t nat -A PREROUTING -p tcp --dport 31001 \
-i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22Или любое другое в зависимости от того, какой файрвол используете. Зашли и закрыли за собой дверь - https://service.example.com/tuktuk/ssh/off:
iptables -t nat -D PREROUTING -p tcp --dport 31001 \
-i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22Проброс порта - частный случай, когда с помощью Labean реализуется принцип port knocking. Тут он удобен тем, что работает по HTTP и с большой долей вероятности не будет блокироваться, в отличии от некоторых других методов.
Можно выполнять и любые другие действия: снимать дамп с базы, перезаливать dev, обновлять контейнеры и т.д. Такой вот костылинг на небольших инфраструктурах и задачах.
Так как это HTTP, перед Labean можно поставить любой прокси типа Angie / Nginx / Traefik и т.д. и настроить там по желанию какие-то дополнительные проверки, логирования, ограничения, аутентификации и т.д.
По своей сути Labean - одиночный бинарник на Go и конфигурационный файл в формате JSON. Проще всего запускать через systemd на хосте, либо собрать свой Docker контейнер, но в данном случае не вижу большого смысла, если действия будут выполняться на хосте, а не внутри группы контейнеров, к которым его можно присоседить.
Работает Laben примерно так. Ставлю:
# wget https://github.com/noiseonwires/labean/releases/download/v260531/labean-linux-amd64# chmod +x labean-linux-amd64# mv labean-linux-amd64 /usr/local/bin/labeanСоздаю конфигурацию
/etc/labean/labean.conf:{ "listen": "192.168.137.29:9191", "url_prefix": "tuktuk", "real_ip_header": "X-Real-IP", "allow_explicit_ips": false, "tasks": [ { "name": "ssh", "timeout": 30, "on_command": "iptables -A INPUT -i ens18 -s {clientIP} -p tcp --dport 22 -j ACCEPT", "off_command": "iptables -D INPUT -i ens18 -s {clientIP} -p tcp --dport 22 -j ACCEPT" } ]}Создаю юнит для systemd - /etc/systemd/system/labean.service:
[Unit]Description=Labean HTTP port knockerAfter=network.target[Service]Type=simpleUser=rootExecStart=/usr/local/bin/labean /etc/labean/labean.confRestart=on-failure[Install]WantedBy=multi-user.targetЗапускаю:
# systemctl daemon-reload# systemctl start labeanПроверяю:
# ss -tulnp | grep 9191tcp LISTEN 0 4096 192.168.137.29:9191 0.0.0.0:* users:(("labean",pid=1324,fd=7))Открываю в браузере url 192.168.137.29:9191/tuktuk/ssh/on, на сервере выполняется команда:
iptables -A INPUT -i ens18 -s 192.168.137.200 -p tcp --dport 22 -j ACCEPTгде 192.168.137.200 - адрес, с которого я делал запрос.
Это я показал максимально простой пример для демонстрации возможностей. Если будете использовать в реальной ситуации, то слушать надо "listen": "127.0.0.1:9191", а внешние запросы принимать на прокси. В репозитории есть примеры для nginx и caddy. Там же пример конфигурации и юнита systemd.
Настройка простая и интуитивная. Я сходу настроил и запустил на тестовой сервере. Сразу всё корректно отработало. Как я уже сказал, так можно выполнять любые действия. Из наиболее актуальных - открывать доступ к vpn/rdp, запускать/перезапускать/останавливать службы, добавлять/удалять маршруты и т.д. В общем, тут кто во что горазд в костылинге.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin: 📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#security #gateway

