Если вы устраняете проблемы с подключением к сети или настраиваете брандмауэр, первое, что нужно проверить, — это то, какие порты действительно открыты в вашей системе.
В этой статье описывается несколько подходов к выяснению того, какие порты открыты извне в вашей системе 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-порты, передайте параметр -u
команде nc
:
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/tcp/kernel.org/443 &>/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 "</dev/tcp/10.10.8.8/$PORT &>/dev/null" && echo "port $PORT is open"
done
Результат будет выглядеть примерно так:
port 22 is open
port 80 is open
Выводы
Мы показали вам несколько инструментов, которые вы можете использовать для поиска открытых портов. Существуют также другие утилиты и методы для проверки открытых портов, например, вы можете использовать модуль socket
Python, curl
, telnet
или wget
.
Если у вас есть вопросы или замечания, пожалуйста, оставьте комментарий ниже.