Skip to content
GNUGiminotPublic

About

Консольное меню для UFW: правила, резервные копии и автоматический откат изменений на VPS

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

VPSWall 0.3 — панель сетевых экранов для VPS

Терминальное приложение с русским интерфейсом: рамки, цветовые акценты, формы, стрелки, Enter, Tab и прокрутка. Один исполняемый файл Linux amd64/arm64; Go на VPS не нужен. UFW, firewalld, nftables и iptables выбираются в панели.

Установка или обновление

На Linux с systemd:

sudo apt update
sudo apt install curl unzip
curl -fL https://github.com/GNUGiminot/vpswall/releases/download/v0.3.0/vpswall-0.3.0.zip -o vpswall-0.3.0.zip
unzip vpswall-0.3.0.zip -d vpswall-0.3.0
cd vpswall-0.3.0
sudo sh ./install.sh
sudo --preserve-env=SSH_CONNECTION vpswall

На системе с dnf установите curl/unzip своим пакетным менеджером; остальная последовательность та же. После первого запуска выберите инструмент. При его отсутствии панель предложит установку через apt-get или dnf. Пакетная установка не запускает firewall: это отдельное действие в разделе «Политика и включение». Во время установки служба временно маскируется; новая служба не включается при перезагрузке сама по себе. Настройки VPSWall восстанавливает его boot-служба.

Установщик менеджера сохраняет конфигурацию в /var/lib/vpswall, устанавливает /usr/local/bin/vpswall, vpswall-recover.service и планировщик vpswall-worker.timer. Существующие конфигурации UFW/Docker/Fail2ban не стираются. При обновлении сначала подтвердите или отмените ожидающее изменение.

Посмотреть интерфейс без root и без изменения firewall можно на Linux/Windows:

vpswall --demo
# Из исходников на Windows: go run . --demo

Минимальный размер терминала — 49×24; комфортно 80×24 и больше. Если клиент отключает цвета, рамки и выделение сохраняются. NO_COLOR=1 отключает цвета.

Веб-панель через SSH-туннель

Веб-интерфейс встроен в бинарник: Node.js, Nginx, внешние шрифты и CDN на VPS не нужны. Сервис выключен по умолчанию. В терминальной панели есть раздел «Веб-панель»; те же действия доступны командами. На VPS из SSH-сеанса:

sudo vpswall web enable
sudo --preserve-env=SSH_CONNECTION vpswall web token

Первая команда создаёт и включает vpswall-web.service, слушающий исключительно 127.0.0.1:8090. Вторая выдаёт случайный токен на 8 часов, привязанный к текущему SSH-сеансу; ранее выданный токен перестаёт работать. На сервере сохраняется только SHA-256 токена, срок и контекст SSH, файл доступен только root. Не передавайте токен другим.

На своём компьютере оставьте запущенным туннель:

ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:8090:127.0.0.1:8090 -p 22 user@server

Укажите фактический SSH-порт вместо 22. Откройте http://127.0.0.1:8090 и вставьте токен в форму входа. Если локальный 8090 занят, используйте -L 127.0.0.1:18090:127.0.0.1:8090 и браузерный адрес http://127.0.0.1:18090. Порт 8090 не нужно разрешать для внешних подключений в firewall.

В панели доступны реальные операции: собственные правила и фильтры, временные окна, Certbot, выбор/установка backend, политика, SSH-мастер, копии/восстановление, история и системная диагностика. Изменения проходят через тот же механизм, что TUI. Долгие операции выполняются в фоне, интерфейс показывает результат; одновременная вторая операция не запускается. Если правила изменены из другого сеанса, редактирование устаревшей версии отклоняется: обновите страницу.

Для правил/политики/включения/SSH/восстановления сохраняется независимый откат через 120 секунд. Панель показывает CLI-команду подтверждения. Подтвердить можно только из нового SSH-сеанса, при смене порта — на новом порту. Кнопки веб-подтверждения в рабочем режиме нет: старый туннель сам по себе не проверяет новый доступ. Окна портов и операции Certbot имеют своё расписание/поведение, описанное ниже.

Токен браузера хранится в sessionStorage текущей вкладки и передаётся в Authorization; в URL и cookie его нет. Проверяются loopback-адрес клиента, Host и Origin, запросы из сторонних сайтов/CORS запрещены. Изменения принимаются только как JSON с токеном и правильным Origin; команды диагностики ограничены фиксированным списком. Выход из браузера очищает токен вкладки. Для отзыва на сервере выдайте новый токен или отключите сервис:

sudo vpswall web disable

Отключение отзывает токен и останавливает web service; firewall и его scheduler продолжают работать. При обновлении установщик перезапускает ранее активный web service, но никогда не включает его сам. Для полного удаления отключите сервис и удалите /etc/systemd/system/vpswall-web.service.

Посмотреть интерфейс с настоящим API и изолированным демонстрационным состоянием:

vpswall web --demo
# Windows / исходники: go run . web --demo

Демо слушает 127.0.0.1:8091, не выполняет системных команд и автоматически входит с отдельным демонстрационным токеном. В демо есть кнопка имитации подтверждения; в рабочем режиме она отсутствует и API такую операцию отклоняет.

Разделы панели

  • Правила: разрешить, запретить или отклонить TCP/UDP; порт/диапазон, IP/подсеть, комментарий и приоритет. Меньший приоритет выполняется раньше.
  • Время и окна портов: открыть сейчас на заданный срок, в конкретную дату или ежедневно. Можно поставить окно на паузу и удалить его.
  • Certbot: хуки, ежедневное время обновления, проверка продления и статус.
  • Сетевой экран: выбор/установка UFW, firewalld, nftables или iptables; выбор зоны firewalld.
  • Политика и включение: включить/выключить выбранный backend, задать политику прочего входящего трафика, подтвердить или отменить изменение.
  • Диагностика: все системные правила, процессы на слушающих портах, журнал ядра и журнал планировщика.
  • Копии и история: снимки настроек и постоянных правил VPSWall, восстановление с таймером отката и журнал действий.

Управление: ↑↓/J/K — выбор, Enter — открыть; Tab/↑↓ — поля формы, ←→ — варианты; Esc — отмена/домой; Q — выход. В длинном результате работают PgUp/PgDn. Подтверждение по умолчанию стоит на «Отмена».

Как менеджер работает с существующими правилами

VPSWall создаёт и редактирует свои правила. Существующие чужие правила показываются отдельно в диагностике и автоматически не присваиваются менеджеру. Это сохраняет настройки, созданные вручную, Docker, Fail2ban и другими программами. Правила версии 0.1.0 тоже остаются обычными системными правилами UFW.

  • UFW: правила с меткой VPSWall:<ID>; конфликт с идентичным чужим правилом не присваивается менеджеру. Политика входящих и состояние UFW управляются явно.
  • firewalld: rich rules с зарезервированными отрицательными приоритетами в выбранной зоне. Постоянные правила записываются в runtime и permanent; временные — только в runtime с native timeout. Чужие зоны, службы и правила сохраняются; глобальный reload не выполняется.
  • nftables: только таблица inet vpswall. Проверка синтаксиса и атомарное применение выполняются через nft. flush ruleset в рабочем адаптере нет. Чужие входящие base chains блокируют включение: их drop может отменить accept другой таблицы, поэтому требуется ручная миграция.
  • iptables: только цепочки VPSWALL_IN для IPv4/IPv6 и помеченные переходы из INPUT. Изменения применяются через iptables-restore --noflush; остальные цепочки не сбрасываются. Поддерживается системный iptables backend, включая nft.

В nftables/iptables базово разрешены loopback, установленные соединения и ICMP, включая ICMPv6. При «разрешить прочий трафик» nftables использует accept в своей таблице, iptables — RETURN в своей цепочке; чужие ограничения всё ещё могут действовать. В firewalld политика «запретить прочий трафик» добавляет поздние drop rich rules: штатные разрешения зоны и её служб остаются. «Разрешить» снимает эти drop rules, но не меняет чужую базовую политику зоны.

Параллельно запускать независимые менеджеры фильтрации не следует. Активный UFW/firewalld блокирует выбор другого backend. Автоматической миграции правил нет. Для смены удалите свои правила/окна и отключите старый backend; конфигурация чужих правил остаётся на диске. Docker-публикации и firewall хостинга проверяйте отдельно: приложение не обещает контролировать их через INPUT.

Временный порт и расписания

Пример: «Время и окна портов» → «Ежедневное окно» → TCP 80, 03:00, Europe/Moscow, длительность 1h. Разрешение действует с 03:00 до 04:00. Часовой пояс указывается явно, независимо от часового пояса VPS. Длительность вводится как 30m, 1h, 2h; от 1 минуты до 24 часов. Ежедневное окно должно быть короче 24 часов.

Планировщик запускается каждые 15 секунд и работает без открытой панели или SSH. Начало/закрытие имеет задержку до 15 секунд плюс время системных команд. После перезагрузки активные окна восстанавливаются, истёкшие снимаются, целиком пропущенные одноразовые окна не открываются задним числом. Ежедневное окно обрабатывается в выбранном IANA-поясе, включая переход через полночь.

Пересекающиеся одинаковые окна не закрывают порт до завершения последнего. Закрытие снимает только временное разрешение VPSWall. Если порт уже разрешён постоянным или чужим правилом, он продолжит быть доступен — такое правило нужно отдельно убрать, если требуется режим «только по расписанию». Уже установленные соединения могут продолжаться: автоматическое закрытие ограничивает новые подключения. Открытие в firewall не запускает слушающий сервис.

Состояние хранится на диске. Перед созданием окна проверяется, что worker timer включён и запущен. При ошибках команды повторяются; смотреть их можно в панели или через journalctl -u vpswall-worker.service. Сбой systemd, диска или самой системы не покрывается гарантией закрытия; для firewalld дополнительно действует его собственный timeout временного rich rule.

Certbot: порт 80 только для продления

Для уже настроенного Certbot выберите «Сертификаты · Certbot» → «Подключить хуки». Менеджер создаст только свои исполняемые файлы:

  • /etc/letsencrypt/renewal-hooks/pre/50-vpswall — временно разрешить TCP 80;
  • /etc/letsencrypt/renewal-hooks/post/50-vpswall — снять это разрешение после попытки продления, включая неуспешную.

Хуки Certbot выполняются при попытке получения/продления, а не при каждом запуске проверки, когда продлевать нечего. Если процесс оборвётся и post-hook не выполнится, аварийное окно истекает через один час. Существующие сертификаты и остальные хуки сохраняются. Каталог Certbot здесь стандартный /etc/letsencrypt.

«Задать время обновления» создаёт отдельный ежедневный vpswall-certbot.timer, запускающий certbot renew --quiet, и отключает включённые стандартные timers certbot.timer / snap.certbot.renew.timer. Их прежнее состояние сохраняется и возвращается при удалении интеграции. Другие cron-задачи/внешние планировщики не изменяются. Поддерживается Certbot из /usr/bin или /snap/bin.

После настройки выполните пункт «Проверить продление» (certbot renew --dry-run). Certbot должен уже уметь продлевать сертификаты без ввода; выпуск первого сертификата и настройка challenge остаются в Certbot. Для standalone нужен свободный порт 80; для webroot/nginx/apache — правильно настроенный HTTP-обработчик. VPSWall не останавливает веб-сервер автоматически. HTTP-01 требует доступный снаружи TCP 80 также в firewall хостинга; wildcard-сертификаты обычно используют DNS-01.

Откат изменений и SSH

Постоянные правила, политика, включение/выключение и восстановление копии применяются в транзакции с независимым таймером systemd на 120 секунд. Без подтверждения настройки и правила VPSWall восстанавливаются. Выход из панели и разрыв SSH таймер не отменяют.

При включении сначала появится выбор: оставить текущий SSH-порт открытым (по умолчанию) или перейти на новый SSH-порт. В первом случае настройки SSH не меняются; добавляется только разрешение: реальный серверный порт и IP текущего клиента из SSH_CONNECTION. Если переменной нет, включение из панели останавливается: сначала запустите её с сохранением переменной. Для локальной консоли добавьте разрешение вручную и настройте состояние средствами firewall.

После изменения откройте новое SSH-подключение и выполните выданную команду:

sudo --preserve-env=SSH_CONNECTION vpswall confirm ВЫДАННЫЙ_КОД

Доступ сайта/базы проверяйте отдельно. Подтверждение только отменяет откат; сами правила уже сохранены. Резервные копии новой панели содержат правила/настройки VPSWall, а не полный снимок всех сторонних таблиц, сертификатов или расписаний. Незавершённая транзакция 0.1.0 распознаётся; её можно подтвердить/отменить теми же CLI-командами.

Смена SSH-порта

Пункт «SSH-порт» также доступен в разделе «Политика и включение». Мастер разрешает новый TCP-порт для IP текущего клиента и запускает отдельный OpenSSH listener vpswall-ssh-НОМЕР.service, использующий текущий /etc/ssh/sshd_config. Основной ssh/sshd.service, ssh.socket, ключи, пароли и старый порт (в том числе 22) сохраняются. Это переход с сохранением старого доступа.

Войдите ssh -p НОВЫЙ_ПОРТ USER@SERVER и подтвердите изменение из этого подключения. Подтверждение со старого порта не принимается. Без подтверждения за 120 секунд новый listener удаляется, а правила VPSWall восстанавливаются. Если новый порт занят или настройка SSH не проходит проверку, изменение не выполняется. Конфигурации с ListenAddress, закреплённым за другим портом, требуют ручной настройки. На системах с SELinux разрешение SSH на новом порту может потребовать отдельной настройки.

Старый порт автоматически не закрывается. После проверки нового подключения его разрешение можно отдельно удалить или задать явный запрет в firewall. Учитывайте существующие сторонние правила и firewall хостинга. Вход по ключу также требует открытого SSH-порта. Дополнительный listener сохраняется после подтверждения и запускается при загрузке; при полном удалении VPSWall его службу нужно отдельно остановить/отключить и удалить её unit-файл.

CLI и диагностика

vpswall --version
vpswall --help
vpswall --demo
sudo vpswall status
sudo vpswall rollback
sudo vpswall worker
sudo vpswall recover
sudo vpswall certbot-open
sudo vpswall certbot-close
systemctl status vpswall-worker.timer
journalctl -u vpswall-worker.service -u vpswall-recover.service

Состояние и копии доступны только root. Секреты SSH и учётные данные хостингов менеджер не хранит; управление несколькими VPS — запуск панели на каждом сервере.

Проверки и сборка

Веб-API проверено HTTP-тестами: токен, смена/истечение токена, Origin/Host, loopback, запрет HTTP-подтверждения, ограничение тела запроса, конкурирующие операции и защита от устаревшего редактирования. Linux-интеграция дополнительно применяет правило и окно через настоящий HTTP API, проверяя доступность TCP 80/8080 с отдельного клиента.

Go 1.24+, зависимости зафиксированы в go.mod/go.sum. Windows PowerShell 5.1:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\build.ps1

На Linux:

go test ./...
go vet ./...
mkdir -p dist
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -o dist/vpswall-linux-amd64 .
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -o dist/vpswall-linux-arm64 .

Проверены автотестами: валидация, аргументы без shell-интерполяции, отказ timer, откат, SSH-подтверждение, окна через полночь, часовые пояса, пересечения и пропуски при перезапуске, хуки/таймер Certbot, ownership-конфликты и клавиатура/размеры TUI.

Linux-интеграция проверяет настоящие UFW, firewalld, nftables и iptables: отдельный клиент подключается по TCP через veth, постоянный порт доступен, временный TCP 80 сначала закрыт, затем открыт, затем снова закрыт после окончания окна. Проверяется сохранение чужих правил. Используется одноразовый overlay root и отдельные network namespaces; исходная Linux-система не получает пакеты или правила. Запуск на Debian/Ubuntu с root, overlayfs и unshare:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go test -c -o dist/vpswall-linux.test .
sudo sh tests/linux-lab.sh

Лабораторная копия firewalld запускается с IPv6_rpfilter=no: ядро WSL 6.6.87.2 не содержит NFT_FIB_IPV6. В приложении и на VPS этот параметр не отключается. Смена SSH-порта дополнительно проверена настоящим OpenSSH: вход по ключу на старом и новом портах, отказ подтверждения со старого порта и удаление нового listener при откате. Управление systemd в лаборатории подменяется запуском процессов; unit-файлы проверяются отдельно. Настоящий reboot VPS, потеря SSH и выдача/продление сертификата реального домена ещё не испытаны. ARM64 проверен сборкой; native-интеграция выполнена на amd64 Ubuntu 24.04 в WSL.

Удаление

Сначала снимите окна, отключите интеграцию Certbot и завершите транзакцию. Удалите свои правила в панели или выключите backend — это явное действие, которое меняет фильтрацию. Затем отключите vpswall-worker.timer и vpswall-recover.service, удалите их unit-файлы и /usr/local/bin/vpswall. Оставить включённые расписания без менеджера нельзя: временные UFW/nftables/iptables разрешения требуют worker для удаления. Конфигурация и копии остаются в /var/lib/vpswall. Существующий firewall пакет удалять необязательно.

Справка: Certbot hooks, firewalld runtime/permanent, nftables, Docker и firewall.

About

Консольное меню для UFW: правила, резервные копии и автоматический откат изменений на VPS

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages