Есть ли в Linux способ записать порты, через которые программа пытается установить связь?

Есть ли в Linux способ записать порты, через которые программа пытается установить связь?

Проблема: Я пытаюсь определить, какие порты открыть для определенных программ

У меня есть несколько программ, которым нужно получить доступ к службам на удаленных хостах, но я не знаю, какие порты они пытаются использовать для этой цели. Вместо того, чтобы открывать брандмауэр до 0-1024(или 0-65k), я хотел бы определить, какие порты использует программа во время работы.

Первая программа для проверки — kinit. ИздокументацияЯ понимаю, что мне нужно открыть порт 88для входящего трафика udp и порт 88для исходящего трафика tcp и udp. Но этого, похоже, недостаточно, так как программа отвечает

kinit: Resource temporarily unavailable while getting initial credentials

Открытие всех портов обеспечивает корректный поток аутентификации для kinit:

Using default cache: /tmp/krb5cc_16381
Using principal: *****@******.******.***
Password for *****@******.******.***:
Authenticated to Kerberos v5

Я знаю, как использовать lsof, netstatи ssдля извлечения открытых портов для процессов, которые привязываются к портам на более длительные периоды времени, но, kinitпохоже, в этом списке не упоминается, даже при использовании вместе с таким инструментом, как watch.

Редактировать: Принятый ответ сразу указал мне на виновника: DNS;

strace -e trace=connect kinit <user>@<kdc>
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("<kdc_ip>")}, 16) = 0

Открытие этого порта решило проблему с Kerberos

решение1

Вы можете попробовать strace:

strace -e trace=connect your_program with arguments

Вот пример вывода:

$ strace -e trace=connect ssh somehost -p 8081
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(8081), sin_addr=inet_addr(<host ip address>)}, 16) = 0
connect(4, {sa_family=AF_LOCAL, sun_path="/run/user/1000/keyring/ssh"}, 110) = 0

Вам нужны строки с расширением sa_family=AF_INET.

решение2

Вы можете настроить правила iptables для регистрации трафика и увидеть, какой именно трафик отправлялся в момент запуска определенной программы. Это не будет работать хорошо в загруженной системе, так как фактически не скажет вам, какая программа отправляла какой трафик, но при небольшой нагрузке вы сможете собрать воедино то, что происходит.

Пример ввода и вывода:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT:DROP:" --log-level 6
iptables -A OUTPUT -j DROP

Если вы хотите чего-то более сложного, есть гораздо больше опций и функций.

Связанный контент