Как посмотреть открытые порты в 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 порта в Linux
Теперь откроем закрытый порт и настроим его на прослушивание TCP-соединений.
В этом примере мы откроем порт 6163. Но при желании вы можете выбрать другой закрытый порт. Только убедитесь, что его номер больше 1023.
С помощью команды netstat убедитесь, что порт 6163не используется:
netstat -na | grep :6163
То же самое можно сделать с помощью команды ss:
ss -na | grep :6163
Вывод должен быть пустым, таким образом подтверждается, что порт сейчас не используется, чтобы была возможность вручную добавить правила порта в системный брандмауэр iptables.
Ubuntu и системы на базе ufw
ufw — клиент командной строки для брандмауэра UncomplicatedFirewall.
Команда для открытия TCP-порта 6163 будет выглядеть следующим образом:
sudo ufw allow 6163
CentOS и системы на базе firewalld
firewall-cmd — клиент командной строки для брандмауэра firewalld.
Команда для открытия TCP-порта 6163 будет выглядеть так:
firewall-cmd --add-port=6163/tcp
Для других дистрибутивов Linux
Изменить системные правила фильтрации пакетов IPv4 можно с помощью iptables.
iptables -A INPUT -p tcp --dport 6163-j ACCEPT
Тестирование порта на работоспособность
После успешного открытия TCP-порта нужно его протестировать.
При отправке вывода ls любому подключенному клиенту, сначала запустите netcat (nc) и прослушивайте (-l) порт (-p) 6163:
ls | nc -l -p 6163
Теперь клиент получит вывод ls после того, как он откроет TCP-соединение на порту 6163. Пока оставьте этот сеанс.
Откройте другой терминал на той же машине.
Поскольку мы открыли TCP-порт, мы можем протестировать TCP-подключения с помощью telnet. Если у вас этой команды нет, установите ее с помощью менеджера пакетов.
Введите IP вашего сервера и номер порта (в данном случае 6163) и выполните следующую команду:
telnet localhost 6163
Эта команда пытается открыть TCP-соединение на локальном хосте через порт 6163.
Получим следующий вывод, в котором указано, что соединение с программой установлено (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 6163
Эта команда проверит открытый порт:
Starting Nmap 7.60 ( https://nmap.org ) at 2024-09-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 6163/tcp open remoteanything Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
Как видите, вы успешно открыли новый порт в Linux.
Примечание: nmap выводит список только открытых портов, на которых в данный момент есть прослушивающее приложение. Если вы не используете приложение для прослушивания (например netcat), то порт 6163 будет отображаться как закрытый, поскольку в настоящее время на этом порту нет ни одного прослушивающего приложения. Аналогично не будет работать и telnet, поскольку этой команде также нужно прослушивающее приложение. Именно по этой причине nc такой полезный инструмент. Он имитирует такие среды с помощью простой команды.
Но порт открыт временно, так как изменения будут сбрасываться при каждой перезагрузке системы.
Сохранение правил брандмауэра в Linux
Способ, который мы рассмотрели в этом мануале только временно обновляет правила брандмауэра, пока система не выключится или не перезагрузится. Поэтому для повторного открытия того же порта после перезагрузки необходимо повторить эти шаги. Однако правила брандмауэра можно сохранить навсегда.
Для брандмауэра ufw
Правила ufw не сбрасываются при перезагрузке. Это происходит потому, что он интегрирован в процесс загрузки, и ядро применяет соответствующие конфигурационные файлы и сохраняет правила брандмауэра ufw.
Для firewalld
Необходимо применить флаг –permanent, чтобы правила были действительны после перезагрузки системы.
Для iptables
Чтобы сохранить правила конфигурации, рекомендуется использовать iptables-persistent.