在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

如果您也想變得更複雜,還有更多選項和功能。

相關內容