Как открывать и закрывать порты в RHEL 8/CentOS 8 Linux
Firewalld — это мощный и простой в использовании инструмент для управления брандмауэром на сервере RHEL 8/CentOS 8 или рабочей станции GNOME. Firewalld позволяет управлять открытием или закрытием портов с помощью предопределенных сервисов, а также открытием и закрытием пользовательских портов.
В этом уроке вы узнаете:
- Как открывать и закрывать порты на RHEL 8/CentOS 8 с помощью Firewalld.
- Как открывать и закрывать службы в RHEL 8/CentOS 8.
- Как перезагрузить конфигурацию брандмауэра.

Открытие и закрытие портов брандмауэра в RHEL 8/CentOS 8 с помощью команды firewall-cmd .
Как открыть порты на RHEL 8/CentOS 8 Linux, пошаговые инструкции
Открытие портов в системе RHEL 8/CentOS 8 — довольно простая процедура. Вот как это происходит шаг за шагом:
-
Сначала проверьте наличие уже открытых портов или включенной службы systemd. Возможно, порт, который вы пытаетесь открыть, уже доступен, и в этом случае делать нечего:
# firewall-cmd --list-all
# firewall-cmd --get-services
# firewall-cmd --get-zones
# firewall-cmd --zone=public --permanent --add-service=http
Если порт, который вы хотите открыть, не является частью предварительно настроенных сервисов, используйте опцию —add-port . Например, откроем TCP-порт 8080 для зоны public :
# firewall-cmd --zone=public --permanent --add-port 8080/tcp
# firewall-cmd --reload
# firewall-cmd --list-all
Как закрыть порты в RHEL 8/CentOS 8 Linux, пошаговая инструкция
Открытие портов в системе RHEL 8 — довольно простая процедура. Вот как это происходит шаг за шагом:
-
Сначала проверьте наличие уже открытых портов или сервисов. Запишите зону, протокол, а также порт или службу, которую вы хотите закрыть:
# firewall-cmd --list-all
# firewall-cmd --zone=public --permanent --remove-service http
Если вы хотите закрыть определенный порт, используйте опцию —remove-port . Например, давайте закроем порт TCP 8080:
# firewall-cmd --zone=public --permanent --remove-port 8080
# firewall-cmd --reload
# firewall-cmd --list-all
iptables Как открыть порты в CentOS 7 Linux или ERR_CONNECTION_TIMED_OUT
В CentOS 7 в качестве фаервола выступает iptables. По-умолчанию он запущен. Чтобы посмотреть текущие правила, нужно ввести команду:
# iptables -L -v -n
В 7-й версии CentOS для управления iptables разработан новый инструмент под названием firewalld и все управление производится через него. firewalld это утилиты для конфигурирования iptables. Но firewalld больше подходит для рабочих станций, чем для серверных сред, поэтому для начала остановим и отключим firewalld.
# systemctl stop firewalld # systemctl disable firewalld rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service' rm '/etc/systemd/system/basic.target.wants/firewalld.service'
Установим утилиты для iptables:
# yum -y install iptables-services
Включим автозапуск iptables:
# systemctl enable iptables
В терминале Centos 6.3 последовательно выполните следующие команды:
#su # iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT # iptables -I INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # iptables -I INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT # service iptables save
# systemctl restart iptables
Открываем порт в Linux с помощью firewalld
Итак, вы купили VDS (виртуальный сервер), установили какой-то сервис, например ftp (File Transfer Protocol — протокол передачи файлов) и у вас не проходят соединения на сервер из внешней сети Интернет, но локально в консоли всё работает. Это означает, что порт скорее всего закрыт файрволом от внешних соединений в целях безопасности.
Почему так происходит
По умолчанию большинство портов закрыто межсетевым краном от внешних соединений в целях безопасности. Системный администратор должен стараться по-максимуму ограничивать доступ к сервисам из вне. Например, в большинстве случаев доступ к СУБД (Система управления базами данных) закрыт для внешних IP-адресов. Если какому-то серверу из вне нужен доступ, то его открывают только для заданного IP-адреса или подсети. Разумно ограничить доступы межсетевым экраном ко всем внутренним службам, которые не должны быть доступны любому пользователю Интернет.
Установка firewalld
firewall-cmd --state #смотрим состояние файрвол, если файрвола нет, то устанавливаем его yum install firewalld #скорее всего он у вас уже установлен systemctl enable firewalld #включаем автоматический запуск фарвол. Это нужно, чтобы он запускался после перезагрузки сервера. systemctl start firewalld #запускаем файрвол firewall-cmd --list-all #смотрим настройки public (active) target: default icmp-block-inversion: no interfaces: ens3 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Как проверить, что порт закрыт именно файрволом?
systemctl stop firewalld #отключаем файрволл и проверяем есть ли соединение из вне systemctl start firewalld #включаем файрвол
Открываем порт для внешних соединений всем пользователям
firewall-cmd --add-port=21/tcp firewall-cmd --remove-port=21/tcp #эту команду используйте, чтобы закрыть порт
Это очевидный, но не самый лучший вариант. Он подойдёт вам, если нужно открыть какой-то конкретный порт. Если же задача разрешить сервис, то лучше подойдёт команда:
firewall-cmd --add-service=ftp firewall-cmd --get-services #эта команда выводит список всех возможных сервисов, которые можно добавлять в файрвол firewall-cmd --remove-service=ftp #эту команду используйте, чтобы закрыть службу
Пока эти команды только изменили текущую конфигурацию файрвола, но эти настройки не вступили в силу. Чтобы они заработали, нужно перезагрузить файрвол мягко без разрыва текущих соединений.
firewall-cmd --reload #перезагружаем без разрыва текущих соединений firewall-cmd --complete-reload #сбросит и текущие соединения firewall-cmd --list-all #смотрим настройки public (active) target: default icmp-block-inversion: no interfaces: ens3 sources: services: dhcpv6-client ftp ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks:
И если эти настройки нам нужны постоянно, то есть и после перезагрузки сервера, то нужно их сохранить.
firewall-cmd --runtime-to-permanent #делаем текущие настройки постоянными
При выполнении команд можно использовать опцию —permanent, чтобы настройки сразу сохранялись глобально. Но лучше так не делать, потому что вы не можете быть на 100% уверены, что ваши команды приведут к задуманному результату. Поэтому вы сначала добавляете настройки в текущую конфигурацию, перезагружаете файрвол, проверяете, что всё работает как требуется и только после тестирования сохраняете настройки глобально. Важно, конечно, не забыть их сохранить, а то после перезагрузки сервера будут проблемы.
Кстати, это распространённая ошибка системных администраторов, что сервер не устойчив к перезагрузкам. Некоторые системные администраторы любят хвастаться UPTIME в не сколько лет. Но у этого есть и обратная сторона, что они не могут быть уверены, что какие-то их команды не носят временный характер до ближайшей перезагрузки.
Открываем сервис для внешних соединений пользователям из заданной подсети
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="ftp" accept'
Как открывать порты в системе Linux
Порт — это конечная точка соединения. В операционной системе порт открывается или закрывается для передачи пакетов данных определенных процессов или сетевых служб.
Обычно порты определяют конкретную присвоенную им сетевую службу. Это можно изменить вручную, настроив службу на использование другого порта, но в целом можно оставить значения по умолчанию.
Первые 1024 порта (номера портов от 0 до 1023) называются общеизвестными или системными и зарезервированы для часто используемых служб. К ним относятся SSH (порт 22), HTTP (порт 80), HTTPS (порт 443) и тому подобное.
Номера портов выше 1024 называются эфемерными портами.
- Порты с номерами от 1024 до 49151 называются зарегистрированными/пользовательскими.
- Номера портов с 49152 по 65535 называются динамическими/частными портами.
В этом мануале мы откроем эфемерный порт в Linux, поскольку общие службы используют известные порты.
Требования
Для выполнения туториала нужно уметь пользоваться терминалом.
Проверка открытых портов
Прежде чем открыть порт в Linux, нужно проверить список всех открытых портов и выбрать эфемерный порт, которого нет в этом списке.
С помощью команды netstat можно получить список всех открытых портов, включая TCP и UDP — это распространенные протоколы для передачи пакетов на сетевом уровне.
Учитывая используемые флаги, команда выводит следующее:
- все прослушиваемые сокеты (-l)
- номер порта (-n)
- TCP-порты (-t)
- UDP-порты (-u)
Active 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 выводит согласованные выходные данные:
Получим следующий вывод:
Netid 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.
Открытие порта для TCP-соединений
Теперь откроем закрытый порт и настроим его на прослушивание TCP-соединений.
В этом туториале мы откроем порт 4000. Но при желании вы можете выбрать другой закрытый порт. Только убедитесь, что его номер больше 1023.
С помощью команды netstat убедитесь, что порт 4000 не используется:
netstat -na | grep :4000
То же самое можно сделать с помощью команды ss:
ss -na | grep :4000
Вывод должен быть пустым, таким образом подтверждается, что порт сейчас не используется, чтобы была возможность вручную добавить правила порта в системный брандмауэр iptables.
Ubuntu и системы на базе ufw
ufw — клиент командной строки для брандмауэра UncomplicatedFirewall.
Команда будет выглядеть следующим образом:
sudo ufw allow 4000
CentOS и системы на базе firewalld
firewall-cmd — клиент командной строки для брандмауэра firewalld.
Команды будут выглядеть так:
Для других дистрибутивов Linux
Изменить системные правила фильтрации пакетов IPv4 можно с помощью iptables.
iptables -A INPUT -p tcp —dport 4000 -j ACCEPT
Тестирование порта
После успешного открытия TCP-порта нужно его протестировать.
При отправке вывода ls любому подключенному клиенту, сначала запустите netcat (nc) и прослушивайте (-l) порт (-p) 4000:
ls | nc -l -p 4000
Теперь клиент получит вывод ls после того, как он откроет TCP-соединение на порту 4000. Пока оставьте этот сеанс.
Откройте другой терминал на той же машине.
Поскольку мы открыли TCP-порт, мы можем протестировать TCP-подключения с помощью telnet. Если у вас этой команды нет, установите ее с помощью менеджера пакетов.
Введите IP вашего сервера и номер порта (в данном случае 4000) и выполните следующую команду:
telnet localhost 4000
Эта команда пытается открыть TCP-соединение на локальном хосте через порт 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
Эта команда проверит открытый порт:
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
Как видите, вы успешно открыли новый порт в Linux.
Примечание: nmap выводит список только открытых портов, на которых в данный момент есть прослушивающее приложение. Если вы не используете приложение для прослушивания (например netcat), то порт 4000 будет отображаться как закрытый, поскольку в настоящее время на этом порту нет ни одного прослушивающего приложения. Аналогично не будет работать и telnet, поскольку этой команде также нужно прослушивающее приложение. Именно по этой причине nc такой полезный инструмент. Он имитирует такие среды с помощью простой команды.
Но порт открыт временно, так как изменения будут сбрасываться при каждой перезагрузке системы.
Сохранение правил брандмауэра
Способ, который мы рассмотрели в этом мануале только временно обновляет правила брандмауэра, пока система не выключится или не перезагрузится. Поэтому для повторного открытия того же порта после перезагрузки необходимо повторить эти шаги. Однако правила брандмауэра можно сохранить навсегда.
Для брандмауэра ufw
Правила ufw не сбрасываются при перезагрузке. Это происходит потому, что он интегрирован в процесс загрузки, и ядро применяет соответствующие конфигурационные файлы и сохраняет правила брандмауэра ufw.
Для firewalld
Необходимо применить флаг –permanent, чтобы правила были действительны после перезагрузки системы.
Для iptables
Чтобы сохранить правила конфигурации, рекомендуется использовать iptables-persistent.
Подводим итоги
В этом туториале мы разобрали, как открыть новый порт в Linux и настроить его для входящих соединений, а также поработали с netstat, ss, telnet, nc и nmap.