Порт — это логическая конечная точка обмена данными. Порт считается «открытым», когда есть слушающий сокет (процесс привязан к адресу/порту). Фаервол лишь разрешает или блокирует прохождение трафика, но сам по себе порт не «открывает» и не «закрывает»
Связка «порт ↔ служба» не жёсткая: любую службу можно настроить слушать на любом порту. Записи в /etc/services и реестре IANA — это соглашения, а не правило ОС.
Порты 0–1023 — well-known. Бинд к портам <1024 требует root/CAP_NET_BIND_SERVICE. Порты 1024–49151 — зарегистрированные/пользовательские, 49152–65535 — IANA Dynamic/Private. Эфемерные клиентские порты в Linux по умолчанию 32768–60999 (настраиваются в /proc/sys/net/ipv4/ip_local_port_range) и не обязаны совпадать с 49152–65535.
В этом руководстве вы откроете порт >1023, чтобы не требовались привилегии для бинда и чтобы не конфликтовать со стандартными службами на well-known портах.
Список слушающих портов
Прежде чем открывать порт в Linux, выведите список слушающих портов и выберите свободный порт >1023 (например, из зарегистрированного диапазона), которого в этом списке нет.
Используйте команду netstat
, чтобы вывести слушающие TCP/UDP-сокеты — это самые распространённые протоколы передачи пакетов на транспортном уровне.
netstat -lntu
Будет выведено:
все слушающие сокеты (
-l
)числовые адреса и порты (
-n
)TCP-порты (
-t
)UDP-порты (
-u
)
Вывод
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:5432 :::* LISTEN
tcp6 0 0 ::1:6379 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
Примечание: если в вашей дистрибуции нет netstat
, используйте ss
, чтобы вывести список слушающих сокетов.
Убедитесь, что вывод сопоставим, используя команду ss
для списка слушающих сокетов:
ss -lntu
Будет выведено:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::1]:5432 0.0.0.0:*
tcp LISTEN 0 128 [::1]:6379 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 0.0.0.0:*
Это даёт примерно тот же список слушающих портов, что и netstat.
Открытие порта в Linux для разрешения TCP-подключений
Теперь откройте закрытый порт и примите входящие TCP-соединения.
В рамках этого руководства вы откроете порт 4000. Однако если на вашей системе этот порт уже занят, выберите любой другой закрытый порт — главное, чтобы его номер был больше 1023.
Проверьте, что порт 4000 не используется, с помощью команды netstat
:
netstat -na | grep :4000
Или командой ss
:
ss -na | grep :4000
Пустой вывод означает, что на 4000 сейчас никто не слушает — это пригодится для теста с nc. На добавление правила в фаервол это не влияет.
Для пользователей Ubuntu и систем на основе ufw
Используйте ufw
— клиент командной строки для Uncomplicated Firewall.
Ваши команды будут выглядеть примерно так:
sudo ufw allow 4000/tcp
Для CentOS и систем на основе firewalld
Используйте firewall-cmd
— клиент командной строки демона firewalld.
Ваши команды будут выглядеть примерно так:
sudo firewall-cmd --add-port=4000/tcp
Для других дистрибутивов Linux
На современных дистрибутивах по умолчанию используется nftables/iptables-nft
. Предпочтительно управлять через firewalld/ufw
или нативный nft
. Если всё же используете iptables
, вставляйте правило выше возможного DROP и не забывайте про IPv6:
sudo iptables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT
sudo ip6tables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT
Учтите возможные конфликты с firewalld/ufw
; для постоянства используйте iptables-save/iptables-persistent
.
Проверка только что открытого порта для TCP-подключений
Теперь, когда вы успешно открыли новый TCP-порт, его нужно протестировать.
Сначала запустите netcat (nc
) и начните слушать (-l
) порт (-p
) 4000, одновременно отправляя вывод команды ls
любому подключившемуся клиенту:
Для OpenBSD nc:
ls | nc -l 4000
Для ncat (nmap):
ls | ncat -l 4000
Для netcat-traditional:
ls | nc -l -p 4000
Теперь, когда клиент откроет TCP-соединение с портом 4000, он получит вывод ls
. Оставьте этот сеанс как есть.
Откройте другой терминал на той же машине.
Поскольку вы открыли TCP-порт, используйте telnet для проверки TCP-доступности. Если команды нет, установите её через менеджер пакетов.
Укажите IP вашего сервера и номер порта (в примере — 4000) и выполните команду:
telnet
localhost
4000
Эта команда пытается открыть TCP-соединение к localhost на порту 4000.
Вы увидите примерно такой вывод, означающий, что установлено соединение со слушающей программой (nc
):
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
while.sh
Вывод ls
(в данном примере — while.sh) также был отправлен клиенту, что подтверждает успешное TCP-соединение.
Используйте nmap
, чтобы проверить, открыт ли порт (-p
):
nmap
localhost
-p 4000
Эта команда проверит состояние порта на localhost:
Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
4000/tcp open remoteanything
Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
Имя сервиса в nmap берётся из базы соответствий портов и не гарантирует, что именно эта служба реально запущена; это эвристика по номеру порта.
Порт открыт. Вы успешно открыли новый порт в вашей системе Linux.
Примечание: nmap
показывает состояние порта. Если на порту никто не слушает, он обычно будет closed; если трафик фильтруется фаерволом — filtered. Поэтому без слушателя telnet
тоже не сработает; nc
удобен тем, что быстро поднимает слушатель для теста.
Изменения будут временными, если вы не используете персистентную конфигурацию. Для UFW правила сохраняются автоматически; для firewalld нужны --permanent
+ --reload
; для iptables — сохранение правил отдельно.
Сохранение правил
Персистентность зависит от инструмента: ufw — сохраняет правила по умолчанию; в firewalld используйте --permanent && --reload
; iptables — сохраняйте через iptables-save/iptables-persistent
.
Для фаервола ufw
Правила ufw не сбрасываются при перезагрузке. Это связано с тем, что ufw интегрирован в процесс загрузки: его сервис читает конфиги и программирует правила в netfilter (iptables/nftables).
Для firewalld
Если вы хотите добавить порт в постоянную конфигурацию фаервола и сразу применить изменения, используйте флаги --permanent
и --reload
:
sudo firewall-cmd --permanent --add-port=4000/tcp
sudo firewall-cmd --reload
Для iptables
Вам потребуется сохранить конфигурацию правил и воспользоваться пакетом/утилитой iptables-persistent
.
Открытие портов с помощью разных инструментов
Открытие конкретных портов с помощью iptables
Чтобы открыть конкретный порт с помощью iptables, используйте команду:
sudo iptables -I INPUT 1 -p tcp --dport <port_number> -j ACCEPT
Замените <port_number>
на фактический номер порта, который нужно открыть. Например, чтобы открыть порт 4000:
sudo iptables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT
Эта команда добавляет новое правило в цепочку INPUT, разрешающее входящий TCP-трафик на указанный порт.
Управление портами с помощью ufw (Uncomplicated Firewall) в системах Debian/Ubuntu
Чтобы открыть порт с помощью ufw
, выполните:
sudo ufw allow <port_number>/tcp
Замените <port_number>
на нужный номер. Например, чтобы открыть порт 4000:
sudo ufw allow 4000/tcp
Эта команда добавляет новое правило, разрешающее входящий трафик на указанный порт.
Использование firewalld для управления портами в системах RHEL/CentOS
Чтобы открыть порт с помощью firewalld, выполните:
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --add-port=4000/tcp --permanent
sudo firewall-cmd --reload
(подставьте нужную зону вместо public
, либо используйте --zone=$(firewall-cmd --get-default-zone)
).
Замените <port_number>
на фактический номер. Например, чтобы открыть порт 4000:
sudo firewall-cmd --add-port=4000/tcp --permanent
sudo firewall-cmd --reload
Первая команда добавляет новое правило, разрешающее входящий TCP-трафик на указанный порт, а вторая перезагружает конфигурацию фаервола, чтобы применить изменения.
Список слушающих портов
Команды для вывода списка слушающих портов
Чтобы вывести список слушающих портов, используйте следующие команды:
netstat:
netstat -lntu
ss:
ss -lntu
netstat:
netstat -tlnp
Эта команда отобразит все слушающие сокеты, включая протокол, локальный адрес, внешний адрес, состояние и PID/имя программы процесса, который слушает сокет.
nc (Netcat):
nc -z -v -n
localhost
1-1024
Команда проверит, какие порты открыты/закрыты на localhost. Метку filtered
корректно определяет nmap
(когда трафик блокируется фаерволом/ACL), nc
этого статуса не показывает.
Проверка правил фаервола и активных сервисов
Чтобы проверить правила фаервола и активные сервисы, используйте:
iptables:
sudo iptables -L
ufw:
sudo ufw status
firewalld:
sudo firewall-cmd --list-all
Эти команды выведут текущую конфигурацию фаервола, включая разрешённые и заблокированные правила и сервисы.
Распространённые ошибки и отладка
Устранение проблем, когда порт остаётся закрытым после конфигурации
Если после настройки порт остаётся закрытым, причины могут быть разными, в том числе:
Сервис фаервола не запущен или настроен некорректно.
Порт уже занят другой службой или процессом.
Изменения конфигурации не применены или были переопределены другой настройкой.
Для диагностики проблемы выполните:
Проверьте статус сервиса фаервола и убедитесь, что он запущен.
Используйте
netstat
илиss
, чтобы проверить, не занят ли порт.Проверьте конфигурационные файлы фаервола и убедитесь, что изменения применены корректно.
Если порт по-прежнему не открыт, попробуйте следующее:
Проверьте системные журналы на предмет ошибок, связанных с фаерволом.
Временно отключите фаервол и проверьте, откроется ли порт. Если да — вероятно, какое-то правило его блокирует.
Убедитесь, что нет конфликтов между инструментами управления фаерволом (например, ufw, firewalld, iptables).
Обеспечение работы и корректной настройки служб фаервола
Чтобы убедиться, что службы фаервола активны и настроены правильно, выполните следующие шаги:
Проверьте статус службы фаервола командами
systemctl status ufw
илиsystemctl status firewalld
.Убедитесь, что служба включена для автоматического запуска при загрузке:
systemctl enable ufw
илиsystemctl enable firewalld
.Просмотрите конфигурационные файлы фаервола, чтобы убедиться, что настройки корректны и актуальны.
Если служба фаервола не запущена или настроена неверно, выполните следующие действия:
Перезапустите службу фаервола.
Проверьте наличие ошибок в конфигурационных файлах.
Убедитесь, что нужные порты открыты в правилах фаервола.
Проверка конфликтов между инструментами управления фаерволом
Чтобы проверить наличие конфликтов между инструментами управления фаерволом, выполните такие шаги:
Определите все установленные инструменты управления фаерволом (например, iptables, ufw, firewalld).
Убедитесь, что активен и управляет правилами только один инструмент.
Отключите или удалите конфликтующие инструменты, чтобы правилами управлял один выбранный инструмент.
Если проблемы сохраняются, попробуйте следующее:
Проверьте, не использует ли порт какая-то другая служба или процесс.
Просмотрите системные журналы на наличие ошибок, связанных с этим портом.
Если порт занят другой службой, рассмотрите возможность перенастроить её на использование другого порта.
Сравнение инструментов фаервола: плюсы и минусы iptables, ufw и firewalld при открытии портов
Инструмент |
Описание |
Плюсы |
Минусы |
Пример команды |
iptables |
Утилита командной строки для настройки правил фильтрации сетевых пакетов |
Очень настраиваемый, мощный и гибкий. |
Крутая кривая обучения, сложный синтаксис. |
|
ufw |
Простая утилита командной строки для управления фаерволом на базе netfilter. |
Прост в использовании, понятный синтаксис, дружелюбен к пользователю. |
Ограниченные возможности настройки, не столь мощен, как iptables. |
|
firewalld |
Динамический демон для управления правилами фаервола. |
Прост в использовании, поддерживает динамическую конфигурацию и зоны. |
Может быть сложен в управлении для продвинутых пользователей. |
|
Приведённые выше примеры команд открывают порт 4000 (для TCP в указанных командах).
Частые вопросы (FAQ)
Как открыть порт в Linux?
Чтобы открыть порт в Linux, нужно настроить фаервол так, чтобы он разрешал входящий трафик на этом порту. Конкретные шаги зависят от используемого ПО фаервола. Примеры для ufw
, firewalld
и iptables
:
Для
ufw
(Uncomplicated Firewall):sudo ufw allow <port_number>/tcp
Для
firewalld
:sudo firewall-cmd --add-port=<port_number>/tcp --permanent && sudo firewall-cmd --reload
Для
iptables
:sudo iptables -I INPUT 1 -p tcp --dport <port_number> -j ACCEPT
Замените <port_number>
на фактический номер порта, который нужно открыть.
2. Как проверить, открыт ли порт 443 в Linux?
для списка слушающих портов используйте: netstat -lntu
/ ss -lntu
:
С netstat:
netstat -lntu | grep 443
С ss:
ss -lntu | grep 443
Если порт 443 открыт, вы увидите его в выводе.
3. Как проверить, открыт ли порт 22 в Linux?
Проверьте с помощью netstat
, ss
или nc
:
С netstat:
netstat -lntu | grep 22
С ss:
ss -lntu | grep 22
С nc:
nc -z -v -n
localhost
22
Если порт 22 открыт, вы увидите это в выводе.
4. Как проверить, открыт ли произвольный порт?
Используйте netstat
или ss
:
С netstat:
netstat -lntu | grep <port_number>
С ss:
ss -lntu | grep <port_number>
Замените <port_number>
на фактический номер. Порт отобразится, если на нём есть слушатель. Для сетевой доступности используйте nc -z/nmap
и учитывайте статус filtered.
5. Как открыть порт 22 в Linux?
Порт 22 обычно открыт по умолчанию для SSH. Если он закрыт, выполните шаги из пункта 1, подставив номер 22:
Для ufw:
sudo ufw allow 22/tcp
Для firewalld:
sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload
Для iptables:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
6. Можно ли открыть диапазон портов вместо одного?
Да, вы можете открыть диапазон портов. Конкретные шаги зависят от используемого ПО фаервола. Примеры для ufw
, firewalld
и iptables
:
Для ufw (Uncomplicated Firewall):
sudo ufw allow <start_port>:<end_port>/tcp
Для firewalld:
sudo firewall-cmd --add-port=<start_port>-<end_port>/tcp --permanent && sudo firewall-cmd --reload
Для iptables:
sudo iptables -A INPUT -p tcp --dport <start_port>:<end_port> -j ACCEPT
Замените <start_port>
и <end_port>
на фактический диапазон портов, который нужно открыть.
7. Безопасно ли открывать порты в Linux?
Открывать порты можно безопасно, если делать это осознанно. Однако каждый открытый порт увеличивает поверхность атаки и потенциальные риски. Рекомендации:
Открывайте только те порты, которые действительно нужны приложениям или службам.
Используйте надёжные пароли и механизмы аутентификации для служб, слушающих открытые порты.
Регулярно обновляйте систему и ПО фаервола, чтобы иметь актуальные исправления безопасности.
Мониторьте системные журналы на предмет подозрительной активности по открытым портам.
Рассмотрите политику фаервола «по умолчанию запрещать» (default deny), разрешая только явно необходимые входящие соединения.
Заключение
В этом руководстве мы узнали, как открыть новый порт в Linux и настроить приём входящих подключений. Мы также использовали netstat
, ss
, telnet
, nc
и nmap
, чтобы проверить состояние портов и протестировать подключение. Диапазоны портов открывали с помощью ufw
/firewalld
/iptables
.
Готовы к систему обучению Linux? Эти практические программы вам в помощь:
Специализация — для тех, кто хочет с нуля освоить профессию Administrator Linux. Узнать подробнее
Administrator Linux. Professional — научитесь работать с такими операционными системами, как: Debian, Ubuntu, Redhat, Fedora, Oracle Linux, Rocky Linux, OpenSUSE и другими дистрибутивами. Пройти вступительный тест для оценки знаний
VenbergV
Очень жаль, что в статье нет почти ничего про настройку актуального
nftables
.Хотя он старше даже бума ИИ.