Файрвол: сетевая фильтрация и ufw/firewalld на сервере
Как работают два уровня фильтрации и как настроить ufw или firewalld, не заблокировав себя.
На этой странице
Входящий трафик к вашему серверу BLACKBOX проходит через два уровня фильтрации: сетевую фильтрацию, которой управляет BLACKBOX, и файрвол операционной системы, который настраиваете вы сами (ufw в Ubuntu и Debian, firewalld в AlmaLinux и CentOS Stream). В панели app.blackbox.md настроек файрвола нет, поэтому все команды ниже выполняются на самом сервере — по SSH, под root.
Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX. Другие порты в сетевой фильтрации — по запросу через поддержку.
Два уровня фильтрации
| Уровень | Кто управляет | На новом сервере | Как изменить |
|---|---|---|---|
| Сетевая фильтрация | BLACKBOX | пропускаются SSH (22), HTTP (80), HTTPS (443) и ping | напишите в поддержку; настроек файрвола в панели нет |
Файрвол в системе (ufw или firewalld) |
вы | выключен или не установлен: BLACKBOX не настраивает его при создании сервера | командами из этой статьи |
Трафик дойдёт до вашего приложения, только если порт открыт на обоих уровнях. Например:
- Сайт на портах 80 и 443: сетевая фильтрация их уже пропускает. Если вы включите
ufwилиfirewalld, разрешите их и там. - Приложение на порту 3000, 8000 или 8080 недоступно из интернета, даже если разрешить порт в
ufw: его отсекает сетевая фильтрация. Опубликуйте приложение через nginx на 80/443 (Приложения Node.js, Python и другие сервисы: nginx как обратный прокси) или попросите поддержку открыть порт.
Чтобы открыть другой порт в сетевой фильтрации, напишите в поддержку: укажите IP-адрес сервера, номер заказа (BBX-…), порт, протокол (TCP или UDP) и для чего он нужен. Каналы связи: Как связаться с поддержкой BLACKBOX.
Внимание Веб- и VNC-консоли для клиентов нет: сервером управляют только по SSH. Прежде чем включать или менять файрвол, откройте вторую SSH-сессию и не закрывайте её, пока не убедитесь, что новое подключение проходит. Если доступ всё же потерян, напишите в поддержку: Потерян доступ к серверу (пароль или ключ).
Оставьте порт 22 открытым для BLACKBOX
Кнопки панели (например, «Сбросить пароль», «Добавить SSH-ключ», «Отключить вход по паролю») и AI-ассистент подключаются к серверу по SSH на порт 22 под root с ключом управления. Если разрешить порт 22 только для вашего IP-адреса, эти функции перестанут работать.
- Разрешите порт 22 для любых адресов, а SSH защитите ключами, ограничением
ufw limit(см. ниже) и fail2ban: Защита от подбора паролей с помощью fail2ban. - Не переносите SSH на другой порт: и сетевая фильтрация, и панель работают с портом 22.
- Если всё же хотите ограничить SSH по IP-адресам, сначала согласуйте это с поддержкой. Подробнее: Ключи BLACKBOX на вашем сервере.
Ubuntu и Debian: ufw
В Ubuntu ufw уже установлен, но выключен. В Debian его может не быть — первая команда ниже его установит.
Обновите список пакетов, установите
ufw(в Ubuntu команда установки лишь сообщит, что пакет уже есть) и проверьте состояние. Ожидаемый результат —Status: inactive.apt update apt install -y ufw ufw statusРазрешите SSH до включения файрвола. ufw ответит «Rules updated» (или «Rule added», если файрвол уже включён). Вместо
22/tcpможно указать имя профиляOpenSSH; тогда используйте ту же форму и для ограничения, описанного ниже.ufw allow 22/tcpЕсли на сервере работает сайт, разрешите HTTP и HTTPS:
ufw allow 80,443/tcpВключите файрвол. На вопрос «Command may disrupt existing ssh connections. Proceed with operation (y|n)?» ответьте
y. Подтверждение: «Firewall is active and enabled on system startup».ufw enableПроверьте правила:
ufw status verboseРезультат будет примерно таким:
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80,443/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 80,443/tcp (v6) ALLOW IN Anywhere (v6)Не закрывая текущую сессию, подключитесь из нового терминала:
ssh root@IP_СЕРВЕРА
Строка Default показывает правила по умолчанию: всё входящее, что явно не разрешено, блокируется, а исходящий трафик проходит.
Ограничение попыток подключения по SSH
ufw limit 22/tcpКоманда заменяет правило allow для порта 22 (сообщение «Rule updated»). После этого ufw отклоняет адрес, с которого за 30 секунд открыто 6 и более подключений. Ограничение действует и на панель, и на AI-ассистента: они открывают новое подключение для каждого действия. Если после нескольких быстрых действий подряд очередное завершилось ошибкой, подождите 30 секунд и повторите.
Удаление правила
Выведите пронумерованный список правил:
ufw status numberedУдалите правило по номеру из первой колонки (подставьте его вместо
НОМЕР). ufw покажет правило, которое собирается удалить, и спросит «Proceed with operation (y|n)?»: проверьте его и ответьтеy. Подтверждение: «Rule deleted».ufw delete НОМЕР
После каждого удаления номера сдвигаются, поэтому перед следующим удалением выведите список заново. Правила для IPv6 показываются отдельно, с пометкой (v6), и удаляются тоже отдельно. Не удаляйте правила для порта 22.
Если вы ошиблись в правилах, а сессия ещё открыта, файрвол можно полностью выключить (ответ «Firewall stopped and disabled on system startup») и настроить заново:
ufw disableAlmaLinux и CentOS Stream: firewalld
Установите и запустите firewalld, затем проверьте состояние. Ожидаемый результат —
running. Зона по умолчанию уже разрешает SSH, так что запуск не разорвёт подключение.dnf install -y firewalld systemctl enable --now firewalld firewall-cmd --stateРазрешите SSH, HTTP и HTTPS на постоянной основе и перезагрузите правила. Каждая команда отвечает
success. Если служба уже была разрешена (обычноssh), перед этим появится предупреждениеWarning: ALREADY_ENABLED: ssh— это не ошибка.firewall-cmd --permanent --add-service=ssh --add-service=http --add-service=https firewall-cmd --reloadПроверьте: в строке
services:должны бытьssh,httpиhttps.firewall-cmd --list-allНе закрывая текущую сессию, подключитесь из нового терминала — так же, как в случае ufw.
Правило, добавленное с --permanent, начинает действовать после firewall-cmd --reload. Без --permanent правило применяется сразу, но пропадает при перезагрузке правил или сервера.
Другие частые операции (выполните только нужную строку, затем перезагрузите правила):
# открыть порт
firewall-cmd --permanent --add-port=8080/tcp
# закрыть ранее открытый порт
firewall-cmd --permanent --remove-port=8080/tcp
# убрать службу из списка
firewall-cmd --permanent --remove-service=http
# применить изменения
firewall-cmd --reloadУ firewalld нет простого аналога ufw limit. Для защиты от повторяющихся попыток входа по SSH используйте fail2ban.
Чувствительные порты — только с вашего адреса
Базы данных (3306 для MariaDB/MySQL, 5432 для PostgreSQL) и панели администрирования, работающие на собственных портах, не должны быть открыты для всего интернета.
- Надёжнее всего не открывать их вовсе: пусть служба слушает
127.0.0.1, а вы подключаетесь через SSH-туннель (Базы данных: MariaDB/MySQL и PostgreSQL). - Если порт должен быть доступен извне, попросите поддержку открыть его в сетевой фильтрации: по умолчанию такие порты там закрыты.
- Узнайте свой IP-адрес (Инструмент «Ваш публичный IP-адрес») и разрешите порт в файрволе системы только для этого адреса.
Ubuntu и Debian:
ufw allow from ВАШ_IP to any port 3306 proto tcpAlmaLinux и CentOS Stream:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="ВАШ_IP" port port="3306" protocol="tcp" accept'
firewall-cmd --reloadЕсли ваш интернет-адрес динамический, обновляйте правило при каждой его смене. Страницу администрирования, которая работает на 80/443 (например, /phpmyadmin), ограничивают в настройках веб-сервера, а не в файрволе.
Docker обходит ufw
Когда вы публикуете порт контейнера (-p 8080:80 или ports: в Docker Compose), Docker добавляет собственные правила iptables, которые срабатывают раньше правил ufw: ufw status их не показывает, а правило deny в ufw их не закрывает. Сетевая фильтрация по-прежнему отсекает все порты, кроме 22, 80 и 443, но контейнер, опубликованный на 80/443 или на порту, открытом по вашему запросу, доступен из интернета независимо от ufw.
Публикуйте контейнер только на
127.0.0.1, а наружу выводите через nginx на 80/443:docker run -d -p 127.0.0.1:8080:80 nginxТо же в Docker Compose:
services: app: ports: - "127.0.0.1:8080:80"Для более тонкой фильтрации добавляйте правила в цепочку
DOCKER-USER, как описано в документации Docker об iptables.
Установка и остальные настройки: Установка Docker и Docker Compose.
Частые проблемы
| Что вы видите | Вероятная причина | Что делать |
|---|---|---|
После включения ufw новые SSH-подключения завершаются ошибкой Connection timed out |
порт 22 не разрешён | из оставшейся открытой сессии разрешите порт 22 (шаг 2 в разделе про ufw). Если открытой сессии нет, напишите в поддержку: «Перезагрузить» не поможет — ufw остаётся включённым и после перезагрузки |
| Сайт перестал открываться после включения файрвола | 80 и 443 не разрешены в файрволе системы | разрешите HTTP и HTTPS (шаг 3 в разделе про ufw или шаг 2 в разделе про firewalld). Другие причины: Сайт не открывается |
| Приложение на 3000 или 8080 не отвечает извне, хотя ufw его разрешает | порт отсекает сетевая фильтрация | опубликуйте приложение через nginx на 80/443 или попросите поддержку открыть порт |
Кнопки панели возвращают reset_failed, ssh_key_push_failed или «Не удалось изменить вход по паролю.» после изменения файрвола |
порт 22 разрешён только для отдельных адресов или сработало ограничение ufw limit |
разрешите порт 22 для любых адресов; если сработало ограничение, подождите 30 секунд и повторите |
| Сертификат Let's Encrypt не выпускается или не продлевается | порт 80 закрыт в файрволе системы | разрешите порт 80: через него проходит проверка Let's Encrypt (Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt) |
Частые вопросы
Могу ли я сам открыть порт в сетевой фильтрации? Нет. Настроек файрвола в панели нет, сетевую фильтрацию меняет команда BLACKBOX. Напишите в поддержку, указав порт, протокол и IP-адрес сервера.
Показывает ли панель, включён ли файрвол? Нет. Страница «Мониторинг» показывает загрузку серверов с услугой «Мониторинг» (CPU, ОЗУ, диск, нагрузка, процессы), а не состояние файрвола: Страница «Мониторинг». Состояние проверяйте на самом сервере командами проверки, приведёнными выше.
Будет ли сервер отвечать на ping после включения файрвола? Да. ufw и firewalld по умолчанию пропускают ping, сетевая фильтрация тоже.
Нужно ли разрешать исходящий трафик? Нет: ufw и firewalld по умолчанию пропускают весь исходящий трафик. Если вы его ограничиваете, оставьте как минимум HTTP (80), HTTPS (443), DNS (53) и NTP (123/UDP): от них зависят обновления системы, точное время на сервере, Let's Encrypt и агент услуги «Мониторинг» (Услуга «Мониторинг»: агент на сервере).
У меня тариф «VPS hosting» с панелью управления. Включать ufw?
У панели управления хостингом может быть собственный файрвол. Прежде чем включать ufw или firewalld, загляните в документацию установленной панели или спросите поддержку.
У меня выделенный сервер. Здесь всё так же? Команды для ufw и firewalld те же. Какие порты открыты в сети для выделенного сервера, уточните в поддержке.