
Я тестирую приложение, которое открывает собственные порты (действует как сервер для этих портов, следовательно, прослушивает эти порты) и где это же приложение подключается к портам, связанным с другими приложениями (действует как клиент для этих портов).
Я хотел бы получить общее представление о том, какие порты создает приложение и к каким приложениям и портам оно подключается.
Как я могу это сделать?
решение1
Для этого можно использовать netstat
. Смотрите пример (я искал ssh
):
netstat -putan | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1725/sshd
tcp 0 0 1.2.3.4:45734 1.2.3.5:22 ESTABLISHED 2491/ssh
tcp6 0 0 :::22 :::* LISTEN 1725/sshd
Объяснение:
Я часто использую параметры -putan
(потому что их легко запомнить).
-p
: показать PID приложения/процесса-u
: показать порты/соединения udp-t
: показать порты/соединения TCP-a
: показать как прослушиваемые, так и не прослушиваемые сокеты-n
: числовой вывод (не выполнять DNS-поиск для имен хостов и т. д.)
В выводе выше вы видите, что есть процесс демона ssh ( sshd
) с PID, 1725
прослушивающий порт 22
на всех сетевых интерфейсах ( 0.0.0.0
). Также есть процесс клиента ssh (PID 2491
), подключенный к IP-адресу 1.2.3.5
на порту номер 22
, мой IP-адрес 1.2.3.4
и мой внешний порт 45734
. Вы видите, что соединение установлено. Поэтому я вошел в систему через ssh
.
решение2
Другой инструмент, который может это сделать, —lsof
:
# lsof -i -a -p 1981
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP host.example.com:ssh (LISTEN)
# lsof -i -a -p 1981 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP 10.1.2.3:ssh (LISTEN)
# lsof -i -a -p 1981 -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1981 root 3u IPv4 917 0t0 TCP 10.1.2.3:22 (LISTEN)
#
Используются следующие варианты:
-i
для распечатки интернет-портов, открытых процессом-a
чтобы все варианты были объединены в AND-p 1981
показать вывод для процесса 1981-n
чтобы запретить поиск имени хоста и вместо этого показывать IP-P
чтобы запретить поиск службы и вместо этого показать номер порта
lsof
имеет то преимущество, что вы можете указать процесс для проверки, а не извлекать его из больших выходных данных. netstat
более надежно доступен в системах, хотя lsof
становится более стандартным, чем раньше.
решение3
У нас уже есть хорошие ответы, но они перечисляют только те порты, которые открыты на момент выполнения команды.
strace
является подходящим инструментом для мониторинга соединений, открытых в течение жизненного цикла приложения:
strace -e socket,connect,close -f -o hipchat.strace.txt hipchat
В выходных данных будет показана дополнительная информация, например запросы UDP и открытые, но закрытые соединения.
решение4
ss -a4 | less
Я предполагаю, что вы говорите об IPv4... Если нет, вы можете заменить 4 в предыдущей команде на 6. Параметр -a предназначен для отображения всех портов (прослушиваемых и непрослушиваемых). Вы можете добавить -n к параметрам, если вы не хотите разрешать имена на дисплее.