Не так давно пришло уведомление от NewReleases.io. Удобный, кстати, сервис. Писал про н... — 30 июня 2026 г. в 08:11:01.607
Не так давно пришло уведомление от NewReleases.io. Удобный, кстати, сервис. Писал про него и с тех пор постоянно пользуюсь, читаю уведомления. Так вот, там было уведомление об обновление утилиты Labean. Я уже когда-то давно писал про него. Это простой сервис, который выполняет настроенные действия при посещении того или иного url. Он до сих пор поддерживается и время от времени обновляется. Например, обращаемся на 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 knocker After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/labean /etc/labean/labean.conf Restart=on-failure [Install] WantedBy=multi-user.target Запускаю: # systemctl daemon-reload # systemctl start labean Проверяю: # ss -tulnp | grep 9191 tcp 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, запускать/перезапускать/останавливать службы, добавлять/удалять маршруты и т.д. В общем, тут кто во что горазд в костылинге. #security #gateway

