
Независимо от того, устраняете ли вы неполадки сетевого подключения или настраиваете брандмауэр, первое, что следует проверить, — какие порты фактически открыты в вашей системе.
В этой статье описываются несколько подходов, позволяющих узнать, какие порты открыты для внешнего использования в вашей системе Linux.
Что такое номер открытого порта
Прослушивающий порт — это сетевой порт, прослушиваемый приложением. Вы можете получить список прослушиваемых портов в вашей системе, запросив сетевой стек с помощью таких команд, как ss , netstat или lsof . Каждый прослушиваемый порт можно открыть или закрыть (отфильтровать) с помощью брандмауэра.
В общих чертах, открытый порт — это сетевой порт, который принимает входящие пакеты из удаленных мест.
Например, если ваш веб-сервер прослушивает порты 80 и 443 , и эти порты открыты на вашем брандмауэре, любой (кроме заблокированных IP-адресов) сможет получить доступ к веб-сайтам, размещённым на вашем веб-сервере, через свой браузер. В этом случае оба порта, 80 и 443 будут открыты.
Открытые порты могут представлять угрозу безопасности, поскольку каждый из них может быть использован злоумышленниками для эксплуатации уязвимости или проведения любой другой атаки. Следует предоставлять доступ только к тем портам, которые необходимы для работы вашего приложения, и закрывать все остальные.
Проверьте открытые порты с помощью nmap
Nmap — мощный инструмент сетевого сканирования, способный сканировать как отдельные хосты, так и крупные сети. Он в основном используется для аудита безопасности и тестирования на проникновение.
Если доступно, nmap должен стать вашим первым инструментом для сканирования портов. Помимо сканирования портов, nmap также может определить MAC-адрес, тип ОС , версию ядра и многое другое.
Следующая команда, введенная с консоли, определяет, какие порты прослушивают TCP-соединения из сети:
sudo nmap -sT -p- 10.10.8.8
Параметр -sT указывает nmap сканировать TCP-порты, а -p- — все 65535 портов. Если -p- не используется, nmap будет сканировать только 1000 самых популярных портов.
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST Nmap scan report for 10.10.8.8 Host is up (0.0012s latency). Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC) Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
Приведенный выше вывод показывает, что в целевой системе открыты только порты 22 , 80 и 8069 .
Для сканирования портов UDP используйте -sU вместо -sT :
sudo nmap -sU -p- 10.10.8.8
Для получения более подробной информации посетите страницу руководства nmap и прочитайте обо всех других мощных возможностях этого инструмента.
Проверьте открытые порты с помощью netcat
Netcat (или nc ) — это инструмент командной строки, который может считывать и записывать данные через сетевые соединения, используя протоколы TCP или UDP.
С помощью netcat вы можете сканировать отдельный порт или диапазон портов.
Например, для сканирования открытых TCP-портов на удаленном компьютере с IP-адресом 10.10.8.8 в диапазоне 20-80 вам следует использовать следующую команду:
nc -z -v 10.10.8.8 20-80
Опция -z указывает nc сканировать только открытые порты, не отправляя никаких данных, а -v — для получения более подробной информации.
Вывод будет выглядеть примерно так:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! ... Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Если вы хотите, чтобы на экране были выведены только строки с открытыми портами, отфильтруйте результаты с помощью команды grep .
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Для сканирования портов UDP передайте команду nc с опцией -u :
nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
Конструкция 2>&1 перенаправляет стандартную ошибку в стандартный вывод.
Проверьте открытые порты с помощью псевдоустройства Bash
Другой способ проверить, открыт или закрыт определенный порт, — использовать псевдоустройство оболочки Bash /dev/tcp/.. или /dev/udp/..
При выполнении команды на псевдоустройстве /dev/$PROTOCOL/$HOST/$IP Bash откроет TCP- или UDP-соединение с указанным хостом на указанном порту.
Следующий оператор if..else проверит, открыт ли порт 443 на kernel.org :
if timeout 5 bash -c '/dev/null' then echo "Port is open" else echo "Port is closed" fi
Port is open
Как работает код выше?
При подключении к порту через псевдоустройство тайм-аут по умолчанию очень большой, поэтому мы используем команду timeout , чтобы завершить тестовую команду через 5 секунд. Если соединение установлено к порту 443 kernel.org тестовая команда вернёт значение true.
Для проверки диапазона портов используйте цикл for :
for PORT in { 20..80 } ; do timeout 1 bash -c " $PORT &>/dev/null" && echo "port $PORT is open" done
Вывод будет выглядеть примерно так:
port 22 is open port 80 is open
Заключение
Мы показали вам несколько инструментов, которые можно использовать для сканирования открытых портов. Существуют также другие утилиты и методы проверки открытых портов, например, модуль socket Python, curl , telnet или wget .
Если у вас есть вопросы или замечания, пожалуйста, оставьте комментарий ниже.
Связанные руководства