Терминальное приложение с русским интерфейсом: рамки, цветовые акценты, формы, стрелки, 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 отключает цвета.
Веб-интерфейс встроен в бинарник: 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 выберите «Сертификаты · 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.
Постоянные правила, политика, включение/выключение и восстановление копии применяются в транзакции с независимым таймером 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-порт» также доступен в разделе «Политика и включение».
Мастер разрешает новый 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-файл.
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.