Своя нода
Защита ноды
Как включить firewall и проверить статус защиты собственной ноды
Что делает защита
harden-node-host.sh защищает сервер, на котором установлена GUJ-нода.
GUJ-нода принимает публичный HTTP/HTTPS-трафик защищенных доменов, поэтому порты 80 и 443 должны оставаться открытыми для посетителей сайтов. SSH при этом лучше ограничить по IP allowlist.
Скрипт управляет отдельной nftables table inet guj_node и отдельным файлом правил /etc/nftables.d/guj-node.nft. Чужие firewall-таблицы и правила не редактируются.
Что делает harden-node-host.sh
- Создает отдельный файл правил
/etc/nftables.d/guj-node.nft - Создает отдельную nftables table
inet guj_node - Закрывает входящие подключения по умолчанию
- Оставляет
80и443открытыми для сайтов - Спрашивает, ограничивать ли SSH по IP allowlist
- Пытается добавить текущий SSH IP автоматически
- Позволяет добавлять и удалять IP/CIDR для SSH
- Записывает sysctl-настройки в
/etc/sysctl.d/99-guj-node.conf - Записывает лимиты открытых файлов в
/etc/security/limits.d/99-guj-node.conf - Делает backup старых GUJ-правил перед применением
- При отключении удаляет только правила и файлы, созданные этим скриптом
Когда запускать
Запускайте этот скрипт отдельным шагом после установки ноды. install.sh не меняет firewall автоматически, чтобы не закрыть SSH без явного подтверждения владельца сервера.
Если запуск идет по SSH, скрипт пытается определить текущий SSH IP и добавить его в allowlist.
Запускайте скрипт вручную, если в карточке ноды указан статус защиты Нет или если firewall на сервере меняли вручную.
Команда запуска
Выполните на сервере ноды:
curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo shОбычный запуск открывает меню управления:
| Пункт | Что делает |
|---|---|
| 1 - Включить/переустановить полную защиту | Генерирует и применяет правила GUJ-ноды |
| 2 - Отключить полную защиту GUJ | Удаляет только guj_node table и файлы, созданные скриптом |
| 3 - Показать текущий статус | Показывает файл правил, активную nftables table и состояние SSH allowlist |
| 4 - Включить ограничение SSH по allowlist | Открывает SSH только для разрешенных IP/CIDR |
| 5 - Отключить ограничение SSH | Оставляет SSH открытым для всех, остальные GUJ-правила сохраняются |
| 6 - Добавить IP/CIDR в SSH allowlist | Добавляет адреса и переустанавливает правила |
| 7 - Удалить IP/CIDR из SSH allowlist | Удаляет адреса и переустанавливает правила |
| 0 - Выход | Выходит без изменений |
Включение полной защиты
Выберите пункт 1 в меню. Скрипт выполнит такие действия:
- Проверит наличие nftables
- Спросит, нужно ли ограничить SSH по IP allowlist
- Если SSH allowlist включен, попробует определить текущий SSH IP
- Добавит текущий SSH IP, IP из панели и дополнительные IP, которые вы введете
- Сгенерирует правила, где
80/443открыты всем, а остальные входящие подключения закрыты - Проверит конфигурацию командой
nft -c - Сделает backup старых GUJ-правил
- Применит новые правила
Рекомендуемый ответ по SSH - Да. Если SSH IP определить не удалось и allowlist пустой, скрипт остановится, чтобы не отрезать доступ.
Если SSH не на 22 порту
Укажите свой SSH-порт и IP, которым разрешен SSH:
curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
GUJ_NODE_SSH_PORT=2222 \
GUJ_NODE_SSH_ALLOWED_IPS="198.51.100.10" \
shУправление SSH allowlist
SSH allowlist управляется отдельно от web-портов. Порты 80/443 остаются открытыми для сайтов, а SSH можно включать, выключать и обновлять отдельно.
При включенном SSH allowlist доступ к SSH будет разрешен:
- с текущего SSH IP, если он определен
- с IP из
/api/v1/infrastructure/ssh-allowlist.txt - с IP/CIDR, которые вы ввели вручную
Добавить IP через меню можно пунктом 6. Удалить IP - пунктом 7. Если после удаления список станет пустым, скрипт оставит SSH открытым, чтобы не закрыть доступ к серверу.
Неинтерактивные команды
Для автоматизации используйте GUJ_NODE_ACTION. Эти команды можно запускать повторно.
| Команда | Назначение |
|---|---|
GUJ_NODE_ACTION=apply | Включить или переустановить полную защиту |
GUJ_NODE_ACTION=disable | Отключить GUJ-защиту ноды |
GUJ_NODE_ACTION=status | Показать текущий статус |
GUJ_NODE_ACTION=ssh-on | Включить SSH allowlist |
GUJ_NODE_ACTION=ssh-off | Отключить SSH allowlist и оставить SSH открытым |
GUJ_NODE_ACTION=add-ssh-ip | Добавить IP/CIDR в SSH allowlist |
GUJ_NODE_ACTION=remove-ssh-ip | Удалить IP/CIDR из SSH allowlist |
Пример добавления SSH IP без меню:
curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
GUJ_NODE_ACTION=add-ssh-ip \
GUJ_NODE_SSH_ADD_IPS="198.51.100.10" \
shПример удаления SSH IP:
curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo env \
GUJ_NODE_ACTION=remove-ssh-ip \
GUJ_NODE_SSH_REMOVE_IPS="198.51.100.10" \
shОтключение защиты
Пункт меню 2 или GUJ_NODE_ACTION=disable удаляет только то, что создал скрипт:
- файл
/etc/nftables.d/guj-node.nft - nftables table
inet guj_node - файл sysctl-настроек
/etc/sysctl.d/99-guj-node.conf - файл лимитов
/etc/security/limits.d/99-guj-node.conf
Чужие таблицы nftables, Docker-правила и правила хостинга не удаляются.
Как понять, что все работает
Откройте карточку ноды в панели. Статус Защищена означает: входящие подключения закрыты по умолчанию, 80/443 открыты для сайтов, SSH ограничен allowlist, лишних TCP-портов нет.
Если статус Нет, в карточке будет причина: не найден файл правил, входящие подключения не закрыты по умолчанию, SSH открыт всем или открыт лишний порт.
После ручного запуска скрипта подождите следующий security-report. Обычно статус обновляется после ближайшего отчета агента.
Проверка с сервера
- Откройте статус через пункт меню 3 или
GUJ_NODE_ACTION=status - Проверьте, что сайты открываются через ноду на
80/443 - Проверьте, что SSH доступен с вашего IP
- Откройте карточку ноды в панели и дождитесь статуса Защищена
Не путайте с origin-сервером
Этот скрипт защищает саму ноду GUJ.
Если сайт находится на отдельном origin-сервере, для него используется отдельная инструкция и отдельный скрипт lockdown-origin-host.sh.
Помогла ли эта статья?
Ваш ответ поможет сделать документацию понятнее