Своя нода

Защита ноды

Как включить 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 в меню. Скрипт выполнит такие действия:

  1. Проверит наличие nftables
  2. Спросит, нужно ли ограничить SSH по IP allowlist
  3. Если SSH allowlist включен, попробует определить текущий SSH IP
  4. Добавит текущий SSH IP, IP из панели и дополнительные IP, которые вы введете
  5. Сгенерирует правила, где 80/443 открыты всем, а остальные входящие подключения закрыты
  6. Проверит конфигурацию командой nft -c
  7. Сделает backup старых GUJ-правил
  8. Применит новые правила

Рекомендуемый ответ по 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.

Помогла ли эта статья?

Ваш ответ поможет сделать документацию понятнее