firewalld это менеджер межсетевого экрана по умолчанию в AlmaLinux 9 и Rocky Linux 9. На вашем VPS Linux Infrawire он позволяет открыть только нужные службы, ограничить SSH вашим IP и перенаправлять порты, не трогая правила nftables вручную.
Главный риск оборвать собственную SSH-сессию. Руководство построено вокруг этого: любое рискованное изменение сначала проверяется в конфигурации runtime и только потом делается постоянным.
📋 Требования
- VPS с AlmaLinux 9 или Rocky Linux 9
- Доступ по SSH под root (IP и пароль root есть в вашем личном кабинете)
- Вторая SSH-сессия, которую нужно держать открытой во время правки правил
1. Установка и запуск firewalld
Bashdnf install -y firewalld systemctl enable --now firewalld firewall-cmd --state
Последняя команда должна вывести running. Зона по умолчанию public: она уже разрешает SSH, Cockpit и клиент DHCPv6, а остальные входящие соединения отбрасывает.
2. Зоны, службы и порты
Зона это набор правил, применяемый к интерфейсу. Служба это именованная группа портов (ssh это 22/tcp, http это 80/tcp, https это 443/tcp).
Bashfirewall-cmd --get-default-zone firewall-cmd --get-active-zones firewall-cmd --list-all firewall-cmd --get-services | tr ' ' '\n' | head -20
Есть две конфигурации. Runtime действует сразу и исчезает после перезагрузки правил или системы. Постоянная (--permanent) хранится на диске, но вступает в силу только после firewall-cmd --reload.
3. Открытие служб и портов
Bash# Службы firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # Свой порт firewall-cmd --permanent --add-port=8080/tcp # Диапазон портов firewall-cmd --permanent --add-port=30000-30100/udp # Применить постоянную конфигурацию firewall-cmd --reload
Чтобы что-то закрыть, используйте соответствующую опцию --remove-service или --remove-port. Уберите службу cockpit, если не пользуетесь веб-консолью: firewall-cmd --permanent --remove-service=cockpit.
4. SSH только с вашего IP через rich rule
Rich rules позволяют задавать условия, например адрес источника. Никогда не удаляйте общее правило SSH, пока не убедитесь, что ограниченное работает.
Bash# 1. Добавьте правило только в runtime (подставьте ВАШ публичный IP) firewall-cmd --add-rich-rule='rule family="ipv4" source address="YOUR_IP/32" service name="ssh" accept' # 2. Откройте НОВЫЙ терминал и убедитесь, что SSH по-прежнему работает с YOUR_IP # 3. Сделайте правило постоянным, затем уберите службу SSH, открытую для всех firewall-cmd --runtime-to-permanent firewall-cmd --permanent --remove-service=ssh firewall-cmd --reload
Если ваш IP изменится, вы потеряете доступ: держите под рукой консоль VPS в личном кабинете как путь восстановления. Для адреса IPv6 напишите family="ipv6" и сам адрес IPv6.
5. Перенаправление порта
Чтобы направить входящий трафик порта 80 на приложение, слушающее порт 8080 на том же сервере:
Bashfirewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080 firewall-cmd --reload
Для перенаправления на другую машину добавьте toaddr=TARGET_IP в опцию forward-port и включите маскарадинг командой firewall-cmd --permanent --add-masquerade. Ядро также должно разрешать пересылку, о чём firewalld заботится при маскарадинге.
6. Проверка конфигурации
Bashfirewall-cmd --list-all firewall-cmd --list-rich-rules firewall-cmd --permanent --list-all ss -tlnp
Сравните списки runtime и постоянной конфигурации: после перезагрузки правил они должны совпадать. С другой машины проверьте порт командой nc -zv VPS_IP 80. Служба, слушающая порт (ss -tlnp), доступна, только если межсетевой экран разрешает её порт.
🛠️ Устранение неполадок
FirewallD is not running: запустите его командой systemctl enable --now firewalld и посмотрите ошибки в journalctl -u firewalld.
Новое правило не действует: вы использовали --permanent без перезагрузки правил. Выполните firewall-cmd --reload.
INVALID_SERVICE или INVALID_ZONE: опечатка в имени. Допустимые имена покажут firewall-cmd --get-services и --get-zones.
SSH на нестандартном порту отклоняется, хотя порт открыт: SELinux должен знать этот порт. Выполните semanage port -a -t ssh_port_t -p tcp 2222 (сначала установите policycoreutils-python-utils), откройте порт в firewalld и перезапустите sshd.
Доступ потерян: воспользуйтесь консолью VPS из личного кабинета, затем выполните firewall-cmd --permanent --add-service=ssh и firewall-cmd --reload. Не используйте firewall-cmd --panic-on: он блокирует весь трафик, включая вашу сессию.
🔒 Теперь ваш VPS открывает только то, что вы выбрали, а SSH остаётся под рукой!