Как открывать порты в системе Linux

Порт — это конечная точка соединения. В операционной системе порт открывается или закрывается для передачи пакетов данных определенных процессов или сетевых служб.

Обычно порты определяют конкретную присвоенную им сетевую службу. Это можно изменить вручную, настроив службу на использование другого порта, но в целом можно оставить значения по умолчанию.

Первые 1024 порта (номера портов от 0 до 1023) называются общеизвестными или системными и зарезервированы для часто используемых служб. К ним относятся SSH (порт 22), HTTP (порт 80), HTTPS (порт 443) и тому подобное.

Номера портов выше 1024 называются эфемерными портами.

  • Порты с номерами от 1024 до 49151 называются зарегистрированными/пользовательскими.
  • Номера портов с 49152 по 65535 называются динамическими/частными портами.

В этом мануале мы откроем эфемерный порт в Linux, поскольку общие службы используют известные порты.

Требования

Для выполнения туториала нужно уметь пользоваться терминалом.

Читайте также: Основы работы с терминалом Linux

Проверка открытых портов

Прежде чем открыть порт в Linux, нужно проверить список всех открытых портов и выбрать эфемерный порт, которого нет в этом списке.

С помощью команды netstat можно получить список всех открытых портов, включая TCP и UDP — это распространенные протоколы для передачи пакетов на сетевом уровне.

netstat -lntu

Учитывая используемые флаги, команда выводит следующее:

  • все прослушиваемые сокеты (-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 выводит согласованные выходные данные:

ss -lntu

Получим следующий вывод:

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.

Команды будут выглядеть так:

firewall-cmd --add-port=4000/tcp

Читайте также: Настройка брандмауэра firewalld on CentOS 8

Для других дистрибутивов Linux

Изменить системные правила фильтрации пакетов IPv4 можно с помощью iptables.

iptables -A INPUT -p tcp --dport 4000 -j ACCEPT

Читайте также: Архитектура Iptables и Netfilter

Тестирование порта

После успешного открытия 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.

Читайте также: Использование Top, Netstat, Du и других инструментов для отслеживания ресурсов сервера

Добавить комментарий