Проблема: Я пытаюсь определить, какие порты открыть для определенных программ
У меня есть несколько программ, которым нужно получить доступ к службам на удаленных хостах, но я не знаю, какие порты они пытаются использовать для этой цели. Вместо того, чтобы открывать брандмауэр до 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
Если вы хотите чего-то более сложного, есть гораздо больше опций и функций.