Сетевой порт — это «дверь» в процесс на сервере. Любой сервис привязывается к адресу и порту и начинает принимать соединения: откроете лишнее — расширите поверхность атаки, закроете нужное — пользователи не смогут подключиться.
В статье разбираем универсальные команды для Debian-семейства (Ubuntu, Debian, Astra Linux и др.), RHEL-семейства (RHEL, AlmaLinux, Rocky, Fedora) и Arch Linux: научимся быстро смотреть, кто и где слушает, проверять доступ извне и правильно менять правила фаервола в UFW, firewalld и nftables.
Зачем вообще управлять портами:
- Безопасность. Чем меньше открытых «дверей», тем меньше атач-поверхность.
- Доступность. Закрытый нужный порт = недоступный сервис.
- Управляемость. Предсказуемые релизы и быстрая диагностика инцидентов.
Диапазоны и типы портов (шпаргалка)
- Общий диапазон: 0–65535 (16-бит).
- Well-Known (0–1023): стандартные службы — 21/FTP, 22/SSH, 80/HTTP, 443/HTTPS.
- Registered (1024–49151): приложения — 3306/MySQL, 5432/PostgreSQL и т. п.
- Dynamic/Private (49152–65535): эфемерные пользовательские соединения.
Чуть подробнее — в «List of TCP and UDP port numbers».
Как быстро проверить порты
Обычно нужно понять две вещи: слушает ли нужный процесс на сервере, и доходит ли до него соединение «снаружи». Сначала смотрим локально, потом проверяем извне.
Проверка локально
# TCP: кто слушает
sudo ss -lptn
# UDP: кто слушает
sudo ss -lpnu
# Фильтр по конкретному порту
sudo ss -lptn 'sport = :80'
# Кто занял порт
sudo lsof -i :80 -nP
127.0.0.1:80
означает, что сервис доступен только локально; 0.0.0.0:80
или :::80
— слушает на всех интерфейсах IPv4/IPv6. Если сервис «не там» или не слушает вовсе, правим его listen/bind и перезапускаем службу.
Проверка снаружи
# TCP: быстрая проверка соединения
nc -vz 203.0.113.10 443
# HTTP(S): увидеть код ответа/ошибку TLS
curl -I https://your.server.example
# Диагностика диапазона/статуса (только на своих хостах!)
nmap -p 22 203.0.113.10
nmap -p 1-1024 203.0.113.10
# UDP: лучше прикладной проверкой (например, DNS)
nc -uvz 203.0.113.10 1194
sudo nmap -sU -p 53 203.0.113.10
Как открыть или закрыть порт: выбираем инструмент
В Ubuntu/Debian/Astra чаще встречается UFW (часто установлен, но выключен), в RHEL/AlmaLinux/Fedora — firewalld. Существует современная универсальная основа, на которой, в частности, работает firewalld — Nftables.
Вариант A — UFW
(Ubuntu/Debian/Astra; доступен в Arch)
Проверка правил и текущего состояния UFW
Прежде чем добавлять правила, UFW должен быть установлен и включён. Проверьте установку командой:
ufw version
Если в ответ команда вернула версию, то ufw уже присутствует в системе. Если же по какой-то причине ufw не был предустановлен, то его необходимо установить вручную при помощи команд:
sudo apt install -y ufw
В любое время вы можете проверить состояние UFW с помощью команды:
sudo ufw status verbose
По умолчанию UFW отключен, так что вы должны увидеть что-то вроде Status: inactive
Также это означает, что все порты в системе открыты.
Для запуска ufw нужно действовать аккуратно: сначала разрешаем нужный порт SSH и включаем UFW.
# разрешить 22/TCP (allow = разрешить)
sudo ufw allow 22/tcp
# политики по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing
# включаем ufw
sudo ufw enable
Политики требуются, чтобы указать, какие действия будут применяться к пакетам, если они не подпадают под созданные правила ufw. Все входящие пакеты мы отклоняем, а исходящие пропускаем.
После включения вы получите похожее предупреждение:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
Это означает, что запуск этого сервиса может разорвать текущее ssh соединение.
Но, так как мы его уже добавили ssh в правила, этого не произойдет. Поэтому просто введите y
.
Теперь можно еще раз проверить состояние ufw, и если UFW включен, то в консоли будут перечисляться заданные правила. Например, если firewall настроен таким образом — SSH (порт 22) соединение из любой точки мира, консоль может выглядеть следующим образом:
Как открыть порт в UFW
Примеры (одиночный порт, диапазон, UDP):
# открыть сразу несколько портов (надежный синтаксис)
sudo ufw allow proto tcp from any to any port 80,443
# или двумя командами (максимально совместимо)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Диапазон портов (пример: 10000–10100/TCP)
sudo ufw allow 10000:10100/tcp
# UDP-пример (DNS)
sudo ufw allow 53/udp
Также вместо числового значения портов можно указать имя протокола или сервиса. ufw считывает поддерживаемые значения из файла /etc/services
:
Например, откроем порт для сервиса HTTP, который по умолчанию использует 80 порт:
sudo ufw allow http
Однако открыть сразу несколько портов, используя только имена сервисов не получится, при попытке использовать более одного имени сервиса ufw вернет ошибку: ERROR: Port ranges must be numeric
Чтобы разрешить IPv6: проверьте файл /etc/default/ufw
, параметр IPV6=yes
, затем выполните sudo ufw reload
.
Как закрыть порт в UFW
Три подхода — запретить, «отвергнуть», удалить правило:
# Запретить (тихий дроп)
sudo ufw deny 8080/tcp
# Отвергнуть (явный отказ клиенту)
sudo ufw reject 113/tcp
# Удалить ранее добавленное правило
sudo ufw delete allow 80/tcp
# Также можно использовать имя сервиса вместо номера порта.
sudo ufw deny ftp
deny
vs reject
в UFW
deny
— тихо дропает пакеты (клиент ждёт таймаут).reject
— активно отвечает отказом (RST/ICMP), клиент сразу видит «закрыто».
Пример:sudo ufw reject 113/tcp
Для удаления правила по номеру выполните команду:
sudo ufw status numbered
После этого выполните команду ufw delete и укажите номер правила, которое следует удалить:
sudo ufw delete 2
Вариант B — firewalld
(RHEL/AlmaLinux/Fedora; пакеты есть и под Debian/Arch)
Проверка текущего состояния firewalld
Прежде чем добавлять правила, firewalld должен быть установлен и включён. Проверьте установку командой:
firewall-offline-cmd -V
Если в ответ вернулась версия, то firewalld присутствует в системе. Если программа не установлена, то ее необходимо установить вручную:
# RHEL/Alma/Fedora:
sudo dnf install -y firewalld && sudo systemctl enable --now firewalld
# Debian/Ubuntu:
sudo apt install -y firewalld && sudo systemctl enable --now firewalld
#Arch:
sudo pacman -Syu firewalld && sudo systemctl enable --now firewalld
Проверить состояние firewalld можно командой:
firewall-cmd --state
По умолчанию firewalld выключен в системе. Вы увидите not running
Для запуска firewalld используйте команду:
sudo systemctl enable --now firewalld
Перед созданием правил, обратите внимание, у firewalld есть важное понятие — зоны. Это профили правил, которые назначаются интерфейсам или источникам. В проде чаще используют
public
как исходную;block
иdrop
различаются тем, отправляет ли система явный отказ, аtrusted
разрешает всё и в публичных сетях не подходит. Посмотреть активные и дефолтную можно так:firewall-cmd --get-active-zones
иfirewall-cmd --get-default-zone
.
Если интерфейс должен жить в другой зоне (например, internal для приватной сети), привяжите его:
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1 && sudo firewall-cmd --reload
Как открыть порт в firewalld
Можно по номеру порта или по имени сервиса.
# По номерам (в зоне public)
sudo firewall-cmd --permanent --zone=public --add-port=22/tcp
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
# Диапазон (пример: 10000–10100/TCP)
sudo firewall-cmd --permanent --zone=public --add-port=10000-10100/tcp
# По именам сервисов (аналогично)
sudo firewall-cmd --permanent --zone=public --add-service=ssh
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
# Применить и проверить
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all
Где:
--zone=public
— определяет зону, для которой будет действовать правило;--add-port=8080/tcp
— задает порт, который будет открыт, а также протокол. В качестве протокола поддерживаются значения tcp и udp;--permanent
— сохраняет правила firewalld при каждой перезагрузке сервера. Если не использовать данный параметр, то изменения будут действовать только до следующей перезагрузки.
Как закрыть порт в firewalld
Во firewalld «закрыть» = удалить разрешение из зоны и перезагрузить.
# Удалить порт/сервис
sudo firewall-cmd --permanent --zone=public --remove-port=8080/tcp
sudo firewall-cmd --permanent --zone=public --remove-service=http
# Применить и проверить
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all
Если правило отсутствует — порт блокируется базовой политикой зоны (например, public по умолчанию всё запрещает, кроме разрешённого).
Вариант C — nftables
(Современный универсальный стек для всех дистрибутивов)
nftables — подсистема фильтрации пакетов в Linux (замена iptables).
- Логика строится из: таблиц → цепочек → правил.
- Base-цепи «подвешиваются» к системным хукам (
input
,output
,forward
,prerouting
,postrouting
) и имеют policy (напримерdrop
/accept
). - Семейства таблиц:
inet
(удобно — работает и для IPv4, и для IPv6 в одном месте),
ip
(только IPv4),ip6
(только IPv6),
другие:arp
,bridge
,netdev
(хуки уровня интерфейса). - Все изменения применяются атомарно: одна команда — одна транзакция.
Проверка правил и текущего состояния nftables
Проверьте установку командой:
nft --version
Если в ответ вернулась версия, то nftables присутствует в системе. Если программа не установлена, то ее необходимо установить вручную:
# Debian/Ubuntu
sudo apt install nftables
# RHEL/CentOS Stream/Fedora
sudo dnf install nftables
# Arch Linux
sudo pacman -S nftables
Для запуска nftables используйте команду:
sudo systemctl enable --now nftables
Важно про firewalld: На Fedora/RHEL по умолчанию активен firewalld, который сам управляет nftables. Если хотите писать правила вручную, либо используйте firewall-cmd, либо остановите firewalld и работайте напрямую:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl enable --now nftables
Перед созданием правил требуется выполнить необходимые настройки.
Первый вариант (начинающим проще)
Создаём таблицу/цепи с безопасной политикой accept, добавляем нужные простые правила по портам, потом переключаем политику на drop:
# 1) каркас (policy accept, чтобы не отрезать SSH)
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0; policy accept; }'
sudo nft 'add chain inet filter forward { type filter hook forward priority 0; policy accept; }'
sudo nft 'add chain inet filter output { type filter hook output priority 0; policy accept; }'
# 2) базовые правила
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif "lo" accept
sudo nft add rule inet filter input ip protocol icmp accept
sudo nft add rule inet filter input ip6 nexthdr icmpv6 accept
# 3) открываем нужные TCP-порты поштучно
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport 80 accept
sudo nft add rule inet filter input tcp dport 443 accept
# Примеры UDP (DNS и NTP)
sudo nft add rule inet filter input udp dport 53 accept
sudo nft add rule inet filter input udp dport 123 accept
# 4) ужесточаем: теперь можно включить «закрыто по умолчанию»
sudo nft 'chain inet filter input { policy drop; }'
sudo nft 'chain inet filter forward { policy drop; }'
# 5) проверяем и сохраняем в файл (переживёт ребут)
sudo nft -a list chain inet filter input
sudo sh -c 'nft list ruleset > /etc/nftables.conf'
Любые правки «на лету» действуют сразу, но не переживут ребут, пока вы не сохраните ruleset:
sudo sh -c 'nft list ruleset > /etc/nftables.conf'
Второй вариант (более профессионально): файл с набором (set)
Сразу кладём в файл набор портов и одну строку, которая его разрешает. В будущем меняем состав набора, а не плодим правила.
Отредактируйте файл /etc/nftables.conf
и вставьте содержимое:
table inet filter {
# Списки (sets) открытых портов
set allowed_tcp { type inet_service; elements = { 22, 80, 443 } }
set allowed_udp { type inet_service; elements = { 53, 123 } } # DNS, NTP как пример
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
# Разрешения по протоколам
tcp dport @allowed_tcp accept
udp dport @allowed_udp accept
# Пинги v4/v6 (диагностика и PMTUD)
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
}
chain forward { type filter hook forward priority 0; policy drop; }
chain output { type filter hook output priority 0; policy accept; }
}
И примените изменения:
sudo nft -f /etc/nftables.conf
Если вы были в SSH, соединение не оборвётся, потому что все правила и политика вступают в силу одновременно.
Далее проверьте, что правила применились:
# -a покажет handle правил (удобно для удаления)
sudo nft -a list chain inet filter input
Как открыть порт в nftables
Первый вариант — простые правила (по одному на порт)
# TCP
sudo nft add rule inet filter input tcp dport 8443 accept
# UDP (одиночный порт)
sudo nft add rule inet filter input udp dport 1194 accept # пример: OpenVPN/UDP
# Ограничить источник (IPv4)
sudo nft add rule inet filter input udp dport 53 ip saddr 203.0.113.5 accept
sudo nft add rule inet filter input tcp dport 22 ip saddr 203.0.113.0/24 accept
# Ограничить источник (IPv6)
sudo nft add rule inet filter input udp dport 53 ip6 saddr 2001:db8::/32 accept
Второй вариант — через наборы (sets)
# Добавить TCP-порт/диапазон в набор
sudo nft add element inet filter allowed_tcp { 8443 }
sudo nft add element inet filter allowed_tcp { 10000-10100 }
# Добавить UDP-порт/диапазон в набор
sudo nft add element inet filter allowed_udp { 50000-50010 } # пример: RTP/медиа
# Проверить
sudo nft -a list chain inet filter input
Если изначально шли по «простым правилам», можно перейти на sets: создайте
allowed_tcp/allowed_udp
, добавьтеtcp dport @allowed_tcp
иudp dport @allowed_udp
в цепочку, затем постепенно перенесите порты в наборы.
После внесения изменений, зафиксируйте текущий набор правил в конфиг, чтобы он пережил перезагрузку:
sudo sh -c 'nft list ruleset > /etc/nftables.conf'
Как закрыть порт в nftables
В nftables «закрыть» = удалить соответствующее правило accept.
Если порт открыт отдельным правилом: удаляем по handle.
sudo nft -a list chain inet filter input
sudo nft delete rule inet filter input handle <ID>
Если используете наборы: убираем элемент из соответствующего набора (TCP или UDP).
# TCP пример
sudo nft delete element inet filter allowed_tcp { 8443 }
# UDP пример (включая диапазон)
sudo nft delete element inet filter allowed_udp { 50000-50010 }
# Синхронизировать файл
sudo sh -c 'nft list ruleset > /etc/nftables.conf'
Сохранение и автозагрузка (когда это нужно)
Если вы меняли правила «на лету» командами (nft add/delete rule
, nft add/delete element
), то зафиксируйте текущий набор правил в конфиг, чтобы он пережил перезагрузку:
sudo sh -c 'nft list ruleset > /etc/nftables.conf'
Если вы правили сам файл /etc/nftables.conf
, просто примените его:
sudo nft -f /etc/nftables.conf
Вариант D — iptables (опционально)
Рекомендуем постепенно мигрировать на nftables/firewalld.
В отличие от ufw и firewalld, iptables уже предустановлен во многих дистрибутивах Linux, включая такие как Ubuntu, Debian, RHEL, Rocky Linux, AlmaLinux.
Как открыть порт с помощью iptables
Откроем порт 80 для входящих соединений. Для этого воспользуемся следующей командой:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Где:
-A INPUT
— ключ -A используется для добавления одного или более правил. INPUT означает таблицу, в которую будет добавлено правило. В данном случае мы добавляем в таблицу входящих соединений.-p tcp
– указывает протокол, для которого будет открыт порт. Поддерживаются такие значения, как tcp, udp, udplite, icmp, esp, ah, sctp.--dport 80
— указывается порт, который будет открыт или закрыт.-j ACCEPT
— означает действие, которое будет применено к заданному порту. ACCEPT означает, что через открытый порт будет проходить сетевой трафик.
Чтобы открыть порт для исходящего соединения, необходимо использовать таблицу OUTPUT:
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
Также iptables позволяет задать диапазон портов, которые можно открыть. Для этого используется опция --match multiport
:
iptables -A INPUT -p tcp --match multiport --dports 1024:2000 -j ACCEPT
Как закрыть порт с помощью iptables
Чтобы закрыть порт, необходимо использовать опцию -D
и в качестве действия прописать DROP. Например, закроем ранее открытый порт 80 для входящего соединения:
# закрыть порт добавлением правила DROP (важен порядок в цепочке)
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
# удалить ранее добавленное правило (закрытие больше не действует)
sudo iptables -D INPUT -p tcp --dport 80 -j DROP
Сохранение
Созданные правила iptables будут действовать только до первого перезапуска сервера. Чтобы сохранить их перманентно, необходимо установить утилиту iptables-persistent.
#Для APT-дистрибутивов команда установки будет следующей:
apt -y install iptables-persistent
#Для DNF дистрибутивов достаточно выполнить:
dnf -y install iptables-persistent
Чтобы сохранить все созданные правила iptables в системе, необходимо выполнить команду:
iptables-save
После перезагрузки сервера правила будут автоматически загружены.
Чтобы просмотреть все правила, которые присутствуют в iptables, используется команда:
iptables -L -v -n
IPv6 и UDP: что помнить на практике
- IPv6 не «откроется сам» вслед за IPv4. В UFW включите IPv6 в конфиге и перезагрузите правила; в nftables используйте семейство inet; во firewalld проверьте зону и интерфейс.
- UDP без рукопожатия. Открытость подтверждают прикладные тесты (например, DNS-запрос), в спорных случаях помогает дамп:
sudo tcpdump -ni any udp port 53
Системные ограничения
SELinux
(RHEL/Alma/Fedora; опционально на Debian)
Что это: политика на уровне ядра, способная запретить демону слушать «нестандартный» порт.
Как проявляется: сервис настроен и запущен, фаервол открыт, но порт снаружи недоступен; в логах — AVC-отказы.
Что делать: можно отключить SELinux. Если не хотите отключать SELinux, то разрешите порт для типа службы, например для веб-демона на 8080/TCP:
sudo semanage port -a -t http_port_t -p tcp 8080
→ перезагрузить демон.
На время диагностики допустим sudo setenforce 0
, но в проде верните Enforcing
.
AppArmor
(Ubuntu/Debian/Astra)
Что это: профили, ограничивающие действия процессов.
Как проявляется: демон не может сделать bind/сетевые операции.
Что делать: временно перевести профиль в complain
, посмотреть логи, поправить правила, вернуть enforce:
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
→ правки → sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
Порты ниже 1024 (привилегированные)
Порты с 0 до 1023 являются зарезервированными. В частности, их используют такие популярные протоколы и сетевые службы, как SSH (22 порт), FTP (21 порт), HTTP (80 порт), HTTPS (443) и многие другие. С полным списком зарезервированных портов можно ознакомиться по ссылке.
Симптом: приложение без root не может слушать 80/443.
Решение: выдать бинарю capability вместо запуска всего демона от root:
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/yourapp
После обновления проверьте, не слетели ли права.
Где чаще всего ломается и как это чинить
- Сервис не слушает или слушает только
127.0.0.1
→ проверьтеss -lptn
, поправьтеlisten/bind
, перезапустите. - Локальный фаервол не пускает → добавьте разрешение в UFW/firewalld/nftables и примените изменения.
- Путь режется вне сервера → проверьте security groups/роутер/NAT и сделайте проверку «снаружи» (
nc
,curl
,nmap
). - Особенности стека → открыли в IPv4 — проверьте IPv6; для UDP используйте прикладные тесты или
tcpdump
. - Системные политики/права → проверьте SELinux/AppArmor и capability для портов ниже 1024.
Практические советы по безопасности
- Минимизируйте количество открытых портов — только то, что реально нужно.
- Регулярно проверяйте карту портов и правила:
ss -lptun
+ выгрузка текущей конфигурации фаервола. - Обновляйте сервисы, слушающие снаружи: новые версии закрывают известные уязвимости.
- Перед изменениями правил делайте быстрый бэкап:
# ufw
sudo ufw status numbered > ufw-$(date +%F).txt
# firewalld
sudo firewall-cmd --list-all > fw-$(date +%F).txt
# nftables
sudo nft list ruleset > nft-$(date +%F).conf.
Итоги
Алгоритм всегда одинаков: убедитесь, что сервис действительно слушает нужный адрес и порт; корректно разрешите трафик в выбранном фаерволе, не забыв про особенности зоны или семейства адресов. Проверьте доступ извне и, при необходимости, учтите системные политики безопасности и правила для портов ниже 1024. С такой последовательностью настройка и диагностика занимают минуты, а не часы.