問題:我正在嘗試確定為特定程式打開哪些端口
我有許多程式需要存取遠端主機上的服務,但我不知道它們嘗試使用哪些連接埠來實現此目的。我不想將防火牆打開到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
如果您也想變得更複雜,還有更多選項和功能。