在 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

我知道如何使用lsofnetstat以及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

如果您想要变得更加复杂,还有更多的选项和功能。

相关内容