Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Порты используются для доступа к определенным приложениям и протоколам. Например, на одном сервере могут быть развернуты веб-сервер и база данных. Чтобы система поняла, к какому именно сервису нам необходимо получить доступ, используются порты. В техническом плане под сетевым портом понимают целое неотрицательное число в диапазоне начиная от 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 уже предустановлен практически во всех популярных APT дистрибутивах. Чтобы проверить, установлен ли ufw в системе, достаточно использовать команду для вывода версии утилиты:
Если в ответ команда вернула версию (см. скриншот выше), то ufw уже присутствует в системе. Если же по какой-то причине ufw не был предустановлен, то его необходимо установить вручную при помощи команд:
apt update && apt -y install ufwПо умолчанию ufw находится в статусе inactive (неактивный). В этом можно убедиться, если сразу после первого входа на сервер ввести команду:
Также это означает, что все порты в системе открыты.
Чтобы включить ufw, необходимо использовать команду:
Далее необходимо ввести y, чтобы активировать ufw. Обратите внимание, что при включении будет выведено предупреждение о том что включение ufw может прервать текущие SSH соединения. Политика ufw по умолчанию следующая: весь входящий трафик запрещен и разрешен весь исходящий. Это означает, что никто не сможет отправить какой-либо сетевой запрос к серверу, в то время как вы можете отправлять исходящие запросы, используя любое приложение или службу.
По умолчанию для протокола SSH уже открыт стандартный сетевой порт 22.
Также проверить стандартную политику ufw можно, используя конфигурационный файл ufw:
Чтобы открыть, порт используется команда ufw allow, которая в качестве аргументов принимает как номера портов, так и наименования некоторых сетевых служб и протоколов. Например, чтобы открыть порт 22 для протокола SSH, достаточно выполнить команду:
Также можно открыть сразу несколько портов, перечислив их через запятую, а в конце обязательно указав протокол через символ слэша. В качестве протокола можно указать 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 вернет ошибку:
ERROR: Port ranges must be numericТакже можно открыть диапазон портов. Для этого используется синтаксис начало диапазона:конец диапазона/протокол. Откроем диапазон с 8000 порта по 8080 для протокола TCP:
Чтобы вывести список всех открытых/закрытых портов в системе, используется команда:
Чтобы закрыть порт, используется команда ufw deny. Например, чтобы закрыть порт 80:
Также можно использовать имя сервиса вместо числового обозначения порта. Например, закроем порт 21, указав имя сервиса ftp (порт 21 по умолчанию используется протоколом FTP):
Как открыть порт в RHEL-based-дистрибутивах Linux
В RHEL-дистрибутивах (CentOS 7+, RHEL 7+, Fedora 18+, OpenSUSE 15+) по умолчанию используется файрвол firewalld.
Чтобы убедиться, что firewalld установлен в системе, достаточно выполнить команду для вывода версии утилиты:
Если в ответ вернулась версия, то firewalld присутствует в системе. Если программа не установлена, то ее необходимо установить вручную:
По умолчанию firewalld выключен в системе. Это можно проверить, выполнив команду:
Чтобы включить 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Порт можно закрыть, также используя или числовое значение, или имя протокола/сервиса.
Для закрытия порта команда выглядит следующей:
firewall-cmd --zone=public --remove-port=8080/tcp --permanentЧтобы закрыть порт, используя имя сервиса, необходимо выполнить команду:
firewall-cmd --zone=public --remove-service=http --permanentТакже после того, как порт был открыт или наоборот закрыт, необходимо перезапускать firewalld:
Открытие порта при помощи 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, используется команда:
Также можно отдельно просмотреть правила только для протокола IPv4, используя команду:
И отдельно для протокола IPv6:
Нужен сервер для практики? Закажите VPS на Simple-Server — root-доступ, NVMe, DDoS-защита и поддержка 24/7.