Настройка файрвола в Linux: UFW и firewalld на VPS (IPv4 и IPv6)

16 мин чтения 3 просмотров 0
Содержание

Только что установленный 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
Если SSH работает на нестандартном порту, добавьте этот порт через --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 поможет.

Помог ли вам данный ответ?

Похожие руководства

root@vps: ~ $ ssh-keygen -t ed25519 -C "laptop-2026"$ ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203…$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 … Linux-сервер Вход по SSH-ключу в Linux: настройка ключей ed25519 и отключение входа по паролю Как настроить вход по SSH-ключу ed25519 на Linux VPS, права authorized_keys и безопасно отключить вход по паролю. 14 мин чтения 7 Читать root@vps: ~ $ openssl rand -base64 18$ passwd root$ ss -tlnp | grep ':2222' || echo "port 2222 is… Linux-сервер Как безопасно сменить порт SSH и пароль root на Linux VPS Смена порта SSH и пароля root в Linux: sshd_config, SELinux semanage, UFW/firewalld, ssh.socket в Ubuntu и откат через VNC. 15 мин чтения 6 Читать root@vps: ~ $ free -h$ swapon --show$ df -h / Linux-сервер Как добавить swap на Linux VPS (тарифы с 512 МБ и 1 ГБ ОЗУ) Добавление swap на Linux VPS с малым объёмом ОЗУ: файл подкачки через fallocate или dd, fstab и настройка swappiness. 12 мин чтения 2 Читать root@vps: ~ $ df -hT$ df -i$ du -xh --max-depth=1 / 2>/dev/null | sort -h … Linux-сервер Диск заполнен в Linux: как найти и освободить место на VPS Диск Linux заполнен? Ищем, что занимает место (df, du, ncdu), и чистим журнал, кэш apt/dnf, Docker, логи и удалённые файлы. 15 мин чтения 2 Читать