Настройка файрвола в Linux: UFW и firewalld на VPS (IPv4 и IPv6)
Только что установленный Linux-сервер отвечает на любом порту, который открыла какая-либо служба, поэтому файрвол — одна из первых вещей, которые нужно настроить. В этой инструкции показано, как настроить файрвол Linux с помощью UFW в Debian и Ubuntu и firewalld в CentOS, Rocky Linux и AlmaLinux: сначала разрешить SSH, открыть веб-порты, ограничить важные службы по IP источника, не забыть про IPv6 и восстановить доступ, если вы себя заблокировали. У каждого облачного сервера JUSTG в Йоханнесбурге, Москве, Токио и Сеуле есть бесплатный IPv6, поэтому правила для IPv6 важны так же, как и для IPv4.
Шаг 1: Проверьте открытые порты и порт SSH
Прежде чем писать правила, выясните, какие службы реально слушают порты и на каком порту работает SSH. Если вы перенесли SSH на нестандартный порт, во всех правилах ниже используйте его вместо 22.
# Which ports are services actually listening on?
ss -tulpn
# Which port does SSH use?
sshd -T | grep -i '^port'
Шаг 2: Подготовьте страховку перед включением файрвола
Одно неверное правило может оборвать SSH-сессию. Фоновый таймер, который через несколько минут снова выключит файрвол, вернёт доступ автоматически. Отмените его, когда убедитесь, что можете войти из нового терминала.
# Safety net: turn the firewall off again in 10 minutes unless you cancel it
nohup sh -c 'sleep 600; ufw disable' >/dev/null 2>&1 & # UFW
nohup sh -c 'sleep 600; systemctl stop firewalld' >/dev/null 2>&1 & # firewalld
# Everything works? Cancel the timer:
pkill -f 'sleep 600'
Шаг 3: Настройте UFW в Debian и Ubuntu
UFW (Uncomplicated Firewall) — простая оболочка над файрволом ядра. Установите политику «запрещать входящие», затем сначала разрешите SSH и только потом включайте файрвол. ufw limit разрешает SSH, но временно блокирует адрес, который открывает слишком много соединений за короткое время.
apt update && apt install -y ufw
# Make sure IPv6 rules are managed too
grep '^IPV6' /etc/default/ufw # should print IPV6=yes
ufw default deny incoming
ufw default allow outgoing
# SSH FIRST (use your real SSH port if you changed it)
ufw limit 22/tcp # allow + basic brute-force rate limit
# Web server
ufw allow 80,443/tcp
ufw enable # answer "y"
ufw status verbose
Шаг 4: Ограничьте доступ в UFW по IP источника (IPv4 и IPv6)
Базы данных, панели администрирования и агенты мониторинга никогда не должны быть открыты всему Интернету — разрешайте их только с известных адресов. UFW проверяет правила по порядку, поэтому запрещающее правило нужно вставлять выше более широкого разрешающего.
# Allow MySQL only from one office IPv4 and one IPv6 network
ufw allow from 198.51.100.25 to any port 3306 proto tcp
ufw allow from 2001:db8:10::/64 to any port 3306 proto tcp
# Block an abusive network (insert at the top so it is matched first)
ufw insert 1 deny from 203.0.113.0/24
# List rules with numbers and delete one
ufw status numbered
ufw delete 4
Шаг 5: Настройте firewalld в CentOS, Rocky Linux и AlmaLinux
firewalld работает с зонами; сетевой интерфейс обычно находится в зоне public, где SSH уже разрешён. Правила с --permanent сохраняются после перезагрузки, но вступают в силу только после --reload.
dnf install -y firewalld # CentOS 7: yum install -y firewalld
systemctl enable --now firewalld
firewall-cmd --get-default-zone # usually "public"
# SSH FIRST (or: --add-port=2222/tcp for a custom port)
firewall-cmd --permanent --add-service=ssh
# Web server
firewall-cmd --permanent --add-service=http --add-service=https
# Close what you do not use
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload
firewall-cmd --list-all
--add-port до удаления службы ssh. В Rocky и AlmaLinux порт также нужно разрешить в SELinux.Шаг 6: Ограничьте доступ в firewalld по IP с помощью rich rules
Rich rule позволяет указать адрес источника, порт и действие в одной строке. Каждое правило относится к одному семейству адресов, поэтому пишите отдельное правило для IPv4 и для IPv6.
# Allow MySQL from one IPv4 address and one IPv6 network only
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.25" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="2001:db8:10::/64" port port="3306" protocol="tcp" accept'
# Drop all traffic from an abusive network
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" drop'
firewall-cmd --reload
firewall-cmd --list-rich-rules
Шаг 7: Убедитесь, что IPv6 тоже фильтруется
Частая ошибка — идеальный набор правил для IPv4, при котором те же службы полностью открыты по IPv6. UFW управляет IPv6 только при IPV6=yes (в выводе ufw status появятся строки «(v6)»); зоны и службы firewalld охватывают оба семейства автоматически. Проверьте с другой машины:
# Your server's IPv6 address
ip -6 addr show scope global
# From ANOTHER machine: test a port over IPv4 and IPv6
nc -vz 203.0.113.50 443
nc -vz 2001:db8:50::10 443
nc -vz 2001:db8:50::10 3306 # should fail from a non-allowed address
Шаг 8: Учитывайте опубликованные порты Docker
Docker добавляет собственные правила iptables, поэтому порт, опубликованный через -p 8080:80, может быть доступен даже тогда, когда UFW или firewalld должны его блокировать. Публикуйте контейнеры на 127.0.0.1 и ставьте перед ними обратный прокси либо управляйте цепочкой DOCKER-USER.
# Publish a container port on localhost only, then proxy it with Nginx
docker run -d -p 127.0.0.1:8080:80 nginx
Шаг 9: Восстановление доступа после блокировки файрволом
Если после изменения SSH перестал отвечать, дождитесь срабатывания таймера из шага 2. Иначе используйте VNC-консоль: войдите в личный кабинет JUSTG → Мои продукты и услуги → выберите сервер → панель управления (если консоль не нашлась, создайте тикет). Войдите как root и снова разрешите SSH:
# Debian / Ubuntu (UFW)
ufw allow 22/tcp # or: ufw disable
# CentOS / Rocky / AlmaLinux (firewalld)
firewall-cmd --panic-off 2>/dev/null
firewall-cmd --add-service=ssh # runtime only; add --permanent once fixed
# last resort
systemctl stop firewalld
Частые вопросы
Можно ли использовать UFW и firewalld одновременно?
Нет. Оба управляют одними и теми же таблицами ядра и будут конфликтовать. В Debian/Ubuntu используйте UFW, в CentOS/Rocky/AlmaLinux — firewalld, а второй отключите, если он установлен.
Правила firewalld пропали после перезагрузки. Почему?
Они были добавлены без --permanent и изменили только текущую конфигурацию. Сохраните действующие правила командой firewall-cmd --runtime-to-permanent.
Можно ли заблокировать IP, с которого идёт атака?
Да: в UFW — ufw insert 1 deny from 203.0.113.66, в firewalld — rich rule с действием drop. От крупных объёмных атак файрвол на сервере не спасёт — обратитесь в поддержку.
Если с настройкой файрвола Linux остались проблемы, создайте тикет по адресу https://www.justg.com/submitticket.php — техническая поддержка JUSTG поможет.