
當網路連線中斷時,在筆記型電腦上使用bind9會顯示大量無意義的網域:
Oct 18 19:56:18 lap3 named[1536]: error (network unreachable) resolving './NS/IN': 128.63.2.53#53
Oct 18 19:56:18 lap3 named[1536]: error (network unreachable) resolving 'drgvlofubl/A/IN': 128.63.2.53#53
Oct 18 19:56:18 lap3 named[1536]: error (network unreachable) resolving 'gjpszynvcz/A/IN': 128.63.2.53#53
Oct 18 19:56:19 lap3 named[1536]: error (network unreachable) resolving 'iqgwbuxrbt/A/IN': 192.5.5.241#53
我該如何找出哪個程式正在發出這些查詢?
將“debug”添加到 /etc/resolv.conf 似乎沒有執行任何操作(筆記型電腦正在運行 Arch linux,並且似乎沒有通過調試支援進行編譯?)。
下一步是在啟用偵錯的情況下編譯 libresolv,除非有更好的事情要做。
答案1
考慮到 DNS 工作方式的本質,我認為這是不可能的。 DNS 不知道哪些應用程式正在查詢它,只知道服務在主機連接處打開了一個連接埠(假設是 TCP)或向綁定伺服器發送了 UDP 封包,並且綁定伺服器透過此神秘應用程式回復了一個回應相同的連接。
網路嗅探器
在這種情況下,通常您會使用應用程式來嗅探來回傳輸的網路流量,並且您可以縮小其焦點,以便您只看到與您的情況中的特定協定(DNS) 相關的訊息或在2個端點之間流動的流量(您的 PC 和綁定伺服器),通常使用 IP 位址。
由於您的問題引起了我的興趣,我藉此機會在 Wireshark SE 網站上提出了這個問題。
摘抄如何確定哪個應用程式正在向我的綁定伺服器發送 DNS 查詢?
我正在嘗試弄清楚如何確定 Linux 機器上的哪個應用程式正在向我的 Bind 伺服器發送特定的 DNS 查詢。我一直在玩弄以下命令:
$ tshark -i wlan0 -nn -e ip.src -e dns.qry.name -E separator=";" -T fields port 53 192.168.1.20;ajax.googleapis.com 192.168.1.101;ajax.googleapis.com 192.168.1.20;pop.bizmail.yahoo.com
我怎麼能讓它向我顯示實際的應用程式(連接埠和可能的 PID)? Wireshark就是您用來執行此操作的此類工具,當然還有其他工具。
我收到了這個答案:
對於普通的資料包捕獲,無法從資料包中識別應用程式或 PID,因為您只能看到資料包是從哪個連接埠發送的。
如果您在正在進行通訊的主機上捕獲,您可以嘗試使用磨練項目以獲得此類資訊。在 Windows 上,網路監控器可以做同樣的事情。
否則,您可以嘗試在執行名稱解析的盒子上使用 netstat 並將其與 DNS 查詢使用的端口號進行匹配,但由於它是 UDP 通信,因此端口幾乎立即打開和關閉 - 因此有機會執行 netstat在開放的那一毫秒內,就像試圖贏得彩券一樣。
磨練項目
這種方法看起來是一個非常有前途的線索。這是我遇到的第一個項目,它似乎在網路封包和進程 ID 之間建立連結。
Hone 是一種獨特的工具,用於將資料包與進程關聯起來,以彌合主機與網路之間的鴻溝。
參考
答案2
如果你有可能懷疑程序,追蹤它recvfrom
和sendto
系統呼叫。例如,我對 radheengineering.info 進行了數千次查找,儘管 exim4 的日誌中沒有顯示該名稱,但它是最有可能的罪魁禍首,其主要 pid 為 1813。
因此,使用strace -f -p1813 -erecvfrom,sendto
,我發現確實是 exim4 進行了查詢。然後我封鎖了連接到伺服器的 /24 網絡,問題就解決了。