问题:我正在尝试确定为特定程序打开哪些端口
我有许多程序需要访问远程主机上的服务,但我不知道它们会尝试使用哪些端口。我不想打开防火墙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
如果您想要变得更加复杂,还有更多的选项和功能。