При работе с сетью в Linux может потребоваться открыть или наоборот закрыть сетевой порт. Контроль за портами осуществляется с целью обеспечения безопасности — чем меньше открытых портов присутствует в системе, тем меньше векторов атаки доступно. Также при закрытом порте атакующий не сможет получить информацию о сервисе, который запущен на выбранном сетевом порте.
Сегодня мы рассмотрим, как закрыть или открыть порт в таких дистрибутивах Linux, как Ubuntu/Debian и CentOS/RHEL, используя файрволы ufw
, firewalld
и iptables
.
В статье мы будем использовать два дистрибутива Linux: Ubuntu версии 22.04 и CentOS 9 версии. Все команды из данной статьи будут работать на любых Debian-based- и RHEL-based-дистрибутивах, включая Astra Linux, AlmaLinux, Arch Linux и другие.
❯ Что такое сетевой порт
Порты используются для доступа к определенным приложениям и протоколам. Например, на одном сервере могут быть развернуты веб-сервер и база данных. Чтобы система поняла, к какому именно сервису нам необходимо получить доступ, используются порты. В техническом плане под сетевым портом понимают целое неотрицательное число в диапазоне начиная от 0 до 65535. При этом порты с 0 до 1023 являются зарезервированными. В частности, их используют такие популярные протоколы и сетевые службы, как SSH (22 порт), FTP (21 порт), HTTP (80 порт), HTTPS (443) и многие другие. С полным списком зарезервированных портов можно ознакомиться по ссылке.
Порты в диапазоне с 1024 до 49151 являются регистрируемыми портами (пользовательскими). Данные порты могут использоваться конкретными приложениями в коммуникационных целях.
Последняя группа портов с 49151 до 65536 является динамической. Порты в данной группе используются для временных соединений и могут динамически назначаться приложениям.
❯ Как открыть порт в Debian-based-дистрибутивах Linux
Для того чтобы открыть или закрыть сетевой порт используют межсетевой экран (он же firewall — файрвол). В дистрибутивах на основе APT (Ubuntu, Debian, Linux Mint и др.) можно использовать файрвол ufw (Uncomplicated Firewall).
Открыть порт в ufw
По умолчанию ufw
уже предустановлен практически во всех популярных APT дистрибутивах. Чтобы проверить, установлен ли ufw
в системе, достаточно использовать команду для вывода версии утилиты:
ufw version
Если в ответ команда вернула версию (см. скриншот выше), то ufw
уже присутствует в системе. Если же по какой-то причине ufw
не был предустановлен, то его необходимо установить вручную при помощи команд:
apt update && apt -y install ufw
По умолчанию ufw
находится в статусе inactive (неактивный). В этом можно убедиться, если сразу после первого входа на сервер ввести команду:
ufw status
Также это означает, что все порты в системе открыты.
Чтобы включить ufw
, необходимо использовать команду:
ufw enable
Далее необходимо ввести y
, чтобы активировать ufw
. Обратите внимание, что при включении будет выведено предупреждение о том что включение ufw
может прервать текущие SSH соединения. Политика ufw
по умолчанию следующая: весь входящий трафик запрещен и разрешен весь исходящий. Это означает, что никто не сможет отправить какой-либо сетевой запрос к серверу, в то время как вы можете отправлять исходящие запросы, используя любое приложение или службу.
По умолчанию для протокола SSH уже открыт стандартный сетевой порт 22.
Также проверить стандартную политику ufw
можно, используя конфигурационный файл ufw:
cat /etc/default/ufw
Чтобы открыть, порт используется команда ufw allow
, которая в качестве аргументов принимает как номера портов, так и наименования некоторых сетевых служб и протоколов. Например, чтобы открыть порт 22 для протокола SSH, достаточно выполнить команду:
ufw allow 22
Также можно открыть сразу несколько портов, перечислив их через запятую, а в конце обязательно указав протокол через символ слэша. В качестве протокола можно указать tcp
или udp
. Например, откроем порты 80, 443, 8081 и 8443 для протокола TCP:
ufw allow 80,443,8081,8443/tcp
Для протокола UDP команда будет следующей:
ufw allow 80,443,8081,8443/udp
Также вместо числового значения портов можно указать имя протокола или сервиса. ufw считывает поддерживаемые значения из файла /etc/services
:
Например, откроем порт для сервиса telnet
, который по умолчанию использует 23 порт:
ufw allow telnet
Однако открыть сразу несколько портов, используя только имена сервисов не получится, при попытке использовать более одного имени сервиса ufw
вернет ошибку:
ERROR: Port ranges must be numeric
Также можно открыть диапазон портов. Для этого используется синтаксис начало диапазона:конец диапазона/протокол
. Откроем диапазон с 8000 порта по 8080 для протокола TCP:
ufw allow 8000:8080/tcp
Чтобы вывести список всех открытых/закрытых портов в системе, используется команда:
ufw status
Закрыть порт в ufw
Чтобы закрыть порт, используется команда ufw deny
. Например, чтобы закрыть порт 80:
ufw deny 80
Также можно использовать имя сервиса вместо числового обозначения порта. Например, закроем порт 21, указав имя сервиса ftp
(порт 21 по умолчанию используется протоколом FTP):
ufw deny ftp
❯ Как открыть порт в RHEL-based-дистрибутивах Linux
В RHEL-дистрибутивах (CentOS 7+, RHEL 7+, Fedora 18+, OpenSUSE 15+) по умолчанию используется файрвол firewalld.
Чтобы убедиться, что firewalld
установлен в системе, достаточно выполнить команду для вывода версии утилиты:
firewall-offline-cmd -V
Если в ответ вернулась версия, то firewalld
присутствует в системе. Если программа не установлена, то ее необходимо установить вручную:
dnf install firewalld
Открыть порт в firewalld
По умолчанию firewalld
выключен в системе. Это можно проверить, выполнив команду:
firewall-cmd --state
Чтобы включить firewalld
, необходимо выполнить команду:
systemctl start firewalld
Для того чтобы открыть порт 8080 для протокола TCP, необходимо выполнить команду:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
Где:
--zone=public
— определяет зону, для которой будет действовать правило;--add-port=8080/tcp
— задает порт, который будет открыт, а также протокол. В качестве протокола поддерживаются значенияtcp
иudp
;--permanent
— сохраняет правилаfirewalld
при каждой перезагрузке сервера. Если не использовать данный параметр, то изменения будут действовать только до следующей перезагрузки.
Также вместо числового обозначения порта можно указывать имя необходимого сервиса. Например, командой ниже можно открыть порт для протокола HTTP (80 порт по умолчанию), указав только сам протокол:
firewall-cmd --zone=public --add-service=http --permanent
Закрыть порт в firewalld
Порт можно закрыть, также используя или числовое значение, или имя протокола/сервиса.
Для закрытия порта команда выглядит следующей:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
Чтобы закрыть порт, используя имя сервиса, необходимо выполнить команду:
firewall-cmd --zone=public --remove-service=http --permanent
Также после того, как порт был открыт или наоборот закрыт, необходимо перезапускать firewalld
:
firewall-cmd --reload
Открытие порта при помощи iptables
В отличие от ufw
и firewalld
, iptables уже предустановлен во многих дистрибутивах Linux, включая такие как Ubuntu, Debian, RHEL, Rocky Linux, AlmaLinux.
Откроем порт 8182 для входящих соединений. Для этого воспользуемся следующей командой:
iptables -A INPUT -p tcp --dport 8182 -j ACCEPT
Где:
-A INPUT
— ключ-A
используется для добавления одного или более правил.INPUT
означает таблицу, в которую будет добавлено правило. В данном случае мы добавляем в таблицу входящих соединений.-p tcp
– указывает протокол, для которого будет открыт порт. Поддерживаются такие значения, какtcp
,udp
,udplite
,icmp
,esp
,ah
,sctp
.--dport 8182
— указывается порт, который будет открыт или закрыт.-j ACCEPT
— означает действие, которое будет применено к заданному порту.ACCEPT
означает, что через открытый порт будет проходить сетевой трафик.
Чтобы открыть порт для исходящего соединения, необходимо использовать таблицу OUTPUT
:
iptables -A OUTPUT -p tcp --dport 8182 -j ACCEPT
Также iptables
позволяет задать диапазон портов, которые можно открыть. Для этого используется опция --match multiport
:
iptables -A INPUT -p tcp --match multiport --dports 1024:2000 -j ACCEPT
❯ Закрытие порта при помощи iptables
Чтобы закрыть порт, необходимо использовать опцию -D
и в качестве действия прописать DROP
. Например, закроем ранее открытый порт 8182 для входящего соединения:
iptables -A INPUT -p tcp --dport 8182 -j DROP
Если необходимо закрыть диапазон портов, то используется тот же синтаксис, что и для открытия диапазона, но действие заменяется на DROP
:
iptables -A INPUT -p tcp --match multiport --dports 1024:2000 -j DROP
Также стоит отметить, что созданные правила iptables
будут действовать только до первого перезапуска сервера. Чтобы сохранить их перманентно, необходимо установить утилиту iptables-persistent
.
Для APT-дистрибутивов команда установки будет следующей:
apt update && apt -y install iptables-persistent
Для DNF дистрибутивов достаточно выполнить:
dnf -y install iptables-persistent
Теперь, чтобы сохранить все созданные правила iptables
в системе, необходимо выполнить команду:
iptables-save
После перезагрузки сервера правила будут автоматически загружены.
Чтобы просмотреть все правила, которые присутствуют в iptables
, используется команда:
iptables -L -v -n
Также можно отдельно просмотреть правила только для протокола IPv4, используя команду:
iptables -S
И отдельно для протокола IPv6:
ip6tables -S
❯ Заключение
Сегодня на примере трех различных утилит мы рассмотрели, как можно открывать и закрывать сетевые порты в дистрибутивах Linux. Контроль за портами позволяет уменьшить потенциальные сетевые атаки на ваш сервер, а также скрывать информацию о сервисах, которые используют порт.
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
? Читайте также:
Комментарии (18)
kneaded
18.11.2024 16:47А есть где-то список рекомендуемого для открытия? Типа 22 ssh, 23 ftp,что там ещё бывает / может быть?
kma21
18.11.2024 16:47настоятельно рекомендую всё закрыть. а потом, хорошо подумав и разобравшись зачем, открыть что-то конкретное.
Jsxii
18.11.2024 16:47Стандартные порты сервисов можно посмотреть в упомянутом в статье файле /etc/services
Jsxii
18.11.2024 16:47Увидел заголовок, удивился, зашел почитать, а оказывается, просто первая глава "файерволл в линуксе [для чайников/за 21 день]".
nagibat0r
18.11.2024 16:47Целая статья о том, как открыть порт? Серьёзно? Куда катится этот Мир...
wwq_deezer
18.11.2024 16:47Целая статья о том, как открыть порт? Серьёзно? Куда катится этот Мир...
И даже в этом обманули:
Заголовок - Как открыть порт. Реальность - Как разрешить/запретить доступ к порту.
Порт же попрежнему остался закрыт. Стоит ли файрволл или не стоит. Порт себя сам не откроет.
mynameco
18.11.2024 16:47вспоминается прикол времен доса, где на вопрос на форуме - как открыть 21 порт. ответили, что нужно отправиися в прошлое, заняться бизнесом, разбогатеть, и начинать открывать порты, и после 20 открытых портов, можно будет открыть 21-ый
Testman2023
18.11.2024 16:47В отличие от ufw и firewalld, iptables уже предустановлен во многих дистрибутивах Linux, включая такие как Ubuntu, Debian, RHEL, Rocky Linux, AlmaLinux.
27 June 2022 What’s new in Security for Ubuntu 22.04 LTS?
https://ubuntu.com/blog/whats-new-in-security-for-ubuntu-22-04-lts
"nftables as the default firewall backend"
Nftables - Debian Wiki
https://wiki.debian.org/nftables
"nftables is the default framework in use in Debian (since Debian 10 Buster)"
July 16, 2019 Using nftables in Red Hat Enterprise Linux 8
https://www.redhat.com/en/blog/using-nftables-red-hat-enterprise-linux-8
"...In Red Hat Enterprise Linux 8 the preferred low level firewall solution is nftables..."
FSA
18.11.2024 16:47Я использую правило: чтобы не было лишних открытых портов - не открывай их. Слабо представляю для чего лично мне нужен файервол на Linux. Разве что на сервере внести диапазоны IP ГРЧЦ в чёрный список добавить. Так с этим тестовый конфиг nftables отлично справляется. А просто так закрыть порт, чтобы никто не пробрался... А зачем открывал?
mpa4b
18.11.2024 16:47А ещё интересная фишка, что по умолчанию можно снаружи отличить ситуацию, когда порт закрыт,но на нём кто-то слушает от ситуации, когда никто не слушает. Первые будут косплеить чёрную дыру (пакет пришёл и исчез), вторые будут вызывать ICMP-ответ о том, что никого нет дома. Чтоб было неотличимо, надо в конце цепочки INPUT сделать
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
.
trojan218
18.11.2024 16:47Ufw переводчески зависает, хотя и показывает что все ок. Как с этим бороться на длинном пути?
Ivann72
18.11.2024 16:47Тут бы нужно было сказать что ufw предустановлен в основном дистрибутивах основанных на ubuntu, в debian его необходимо отдельно установить. iptables давно считается устаревшим и к использованию не рекомендуется, к тому же его бинарник, в большинстве систем, является оберткой над nftables, современным стеком фильтрации пакетов.
diffdev
18.11.2024 16:47Все команды из данной статьи будут работать на любых Debian-based- и RHEL-based-дистрибутивах, включая Astra Linux, AlmaLinux, Arch Linux и другие.
Arch Linux не базируется на Debian или RHEL
1CUnlimited
А если на машине стоит selinux ;)?