GUJ на своём сервере
Защита сервера GUJ
Как закрыть лишние подключения к серверу GUJ
Что делает защита
Запустите harden-node-host.sh на сервере с GUJ, чтобы закрыть лишние входящие подключения.
Сервер GUJ принимает запросы посетителей по HTTP и HTTPS, поэтому порты 80 и 443 остаются открытыми. Доступ по SSH лучше разрешить только выбранным IP.
Nftables — это системный инструмент для управления сетевым доступом. Скрипт создаёт в нём отдельную таблицу inet guj_node и файл правил /etc/nftables.d/guj-node.nft.
Другие таблицы и правила сетевого доступа скрипт не меняет.
Что делает harden-node-host.sh
- Создает отдельный файл правил
/etc/nftables.d/guj-node.nft - Создает отдельную таблицу nftables
inet guj_nodeс сетевыми правилами для сервера GUJ - Закрывает входящие подключения по умолчанию
- Оставляет
80и443открытыми для сайтов - Спрашивает, разрешать ли SSH только выбранным IP
- Пытается добавить текущий SSH IP автоматически
- Позволяет добавлять и удалять IP/CIDR для SSH
- Записывает системные настройки sysctl в
/etc/sysctl.d/99-guj-node.conf - Записывает лимиты открытых файлов в
/etc/security/limits.d/99-guj-node.conf - Создает резервную копию старых правил GUJ перед применением
- При отключении удаляет только правила и файлы, созданные этим скриптом
Когда запускать
Запускайте этот скрипт после установки GUJ на сервер. install.sh не меняет сетевые правила автоматически, чтобы случайно не закрыть SSH.
При запуске по SSH скрипт пытается определить текущий IP администратора и добавить его в список разрешенных.
Запустите скрипт, если в карточке сервера указано Не настроена или правила сетевого доступа меняли вручную.
Команда запуска
Выполните на сервере GUJ:
curl -fsSL https://files.guj.ru/node/harden-node-host.sh | sudo shОбычный запуск открывает меню управления. Английское слово allowlist в названиях пунктов означает список разрешённых IP.
CIDR — это запись диапазона IP, например 203.0.113.0/24.
| Пункт | Что делает |
|---|---|
| 1 - Включить/переустановить полную защиту | Создаёт и применяет сетевые правила сервера GUJ |
| 2 - Отключить полную защиту GUJ | Удаляет только таблицу nftables guj_node и файлы, созданные скриптом |
| 3 - Показать текущий статус | Показывает файл правил, активную таблицу nftables и список разрешенных IP для SSH |
| 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
- Если ограничение включено, попробует определить текущий SSH IP
- Добавит текущий SSH IP, IP из панели и дополнительные IP, которые вы введете
- Сгенерирует правила, где
80/443открыты всем, а остальные входящие подключения закрыты - Проверит конфигурацию командой
nft -c - Создаст резервную копию старых правил GUJ
- Применит новые правила
Рекомендуемый ответ по SSH - Да. Если SSH IP определить не удалось и список разрешенных IP пуст, скрипт остановится, чтобы не закрыть вам доступ.
Если 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Список разрешенных IP для SSH
Доступ по SSH настраивается отдельно от веб-портов. Порты 80/443 остаются открытыми для сайтов, а SSH можно разрешить только выбранным IP.
Если ограничение включено, SSH будет доступен:
- с текущего SSH IP, если он определен
- с IP из
/api/v1/infrastructure/ssh-allowlist.txt - с IP/CIDR, которые вы ввели вручную
Добавить IP через меню можно пунктом 6, удалить — пунктом 7.
Если список станет пустым, скрипт оставит SSH открытым, чтобы не закрыть доступ к серверу.
Команды для запуска без меню
Для автоматизации используйте GUJ_NODE_ACTION. Эти команды можно запускать повторно.
| Команда | Назначение |
|---|---|
GUJ_NODE_ACTION=apply | Включить или переустановить полную защиту |
GUJ_NODE_ACTION=disable | Отключить сетевые правила GUJ |
GUJ_NODE_ACTION=status | Показать текущий статус |
GUJ_NODE_ACTION=ssh-on | Ограничить SSH списком разрешенных IP |
GUJ_NODE_ACTION=ssh-off | Снять ограничение и оставить SSH открытым |
GUJ_NODE_ACTION=add-ssh-ip | Добавить IP/CIDR в список разрешенных для SSH |
GUJ_NODE_ACTION=remove-ssh-ip | Удалить IP/CIDR из списка разрешенных для SSH |
Пример добавления 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
inet guj_node - файл sysctl-настроек
/etc/sysctl.d/99-guj-node.conf - файл лимитов
/etc/security/limits.d/99-guj-node.conf
Чужие таблицы nftables, Docker-правила и правила хостинга не удаляются.
Как понять, что все работает
Откройте карточку сервера в панели. Статус Настроена означает, что скрипт применил эти правила:
- входящие подключения закрыты по умолчанию
- порты
80и443открыты для сайтов - SSH доступен только с разрешённых IP
- лишние TCP-порты закрыты
Если защита Не настроена, в карточке будет причина: не найден файл правил, входящие подключения не закрыты по умолчанию, SSH открыт всем или открыт лишний порт.
После запуска скрипта подождите новый отчёт от сервера. Затем обновите карточку в панели.
Проверка с сервера
- Откройте статус через пункт меню 3 или
GUJ_NODE_ACTION=status - Проверьте, что сайты открываются через сервер GUJ на
80/443 - Проверьте, что SSH доступен с вашего IP
- Откройте карточку сервера в панели и дождитесь статуса Настроена
Не путайте с сервером сайта
Этот скрипт защищает сервер GUJ.
Если сайт находится на отдельном сервере, для него используется другая инструкция и скрипт lockdown-origin-host.sh.
Помогла ли эта статья?
Ваш ответ поможет сделать документацию понятнее