Top.Mail.Ru
OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Порты в Linux: как проверить, открыть и закрыть (UFW, firewalld, nftables)

Пошаговый разбор портов в Linux: как увидеть, кто и где слушает, проверить доступ из сети и корректно открыть/закрыть через UFW, firewalld и nftables. Обсуждаем TCP/UDP, IPv6, зоны, SELinux/AppArmor и приёмы с диапазонами и наборами.
Порты в Linux: как проверить, открыть и закрыть (UFW, firewalld, nftables)

Сетевой порт — это «дверь» в процесс на сервере. Любой сервис привязывается к адресу и порту и начинает принимать соединения: откроете лишнее — расширите поверхность атаки, закроете нужное — пользователи не смогут подключиться.

В статье разбираем универсальные команды для 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. С такой последовательностью настройка и диагностика занимают минуты, а не часы.

Поделиться статьей

Вам будет интересно

Как перейти от зарубежного хостинг-провайдера к Российскому: пошаговое руководство

Как перейти от зарубежного хостинг-провайдера к Российскому: пошаговое руководство

В современных условиях многие пользователи задумываются о переходе на российский хостинг. Этот процесс может показаться сложным, н ...
Поиск больших файлов и освобождение места на диске Linux сервера

Поиск больших файлов и освобождение места на диске Linux сервера

В этой статье мы рассмотрим, как найти большие файлы на Linux сервере и освободить место на диске. Узнайте о полезных утилитах, та ...
Как защитить сайт от вирусов и вредоносного ПО

Как защитить сайт от вирусов и вредоносного ПО

Расскажем, как защитить свой сайт от вирусов и хакеров, а также вредоносных программных обеспечений и прочих неприятностей.