2012-06-13 81 views
38

我對DNS緩存感到困惑。我正在編寫一個小型轉發代理服務器,並希望在Linux系統上使用操作系統DNS緩存。在Linux中的DNS緩存

如果我理解正確,那麼在瀏覽器級別有DNS緩存。然後在操作系統級別有DNS緩存(Windows有,我不確定Linux發行版是否默認)。

那麼,瀏覽器/ proxy_server如何使用OS DNS緩存?我試圖找到我是否可以依靠Linux進行DNS緩存,而不是在我的代理內部自行完成。

感謝

+0

依靠操作系統緩存。 –

+0

如果您有代理,則DNS緩存位於代理中。例如,Squid擁有自己的DNS緩存和解析器。 –

回答

62

在Linux(和可能大多數Unix),沒有操作系統級別的DNS緩存,除非nscd安裝並運行。即使如此,至少在Debian中,nscd的DNS緩存功能默認是禁用的,因爲it's broken。實際的結果是,你的linux系統很可能不會執行任何操作系統級別的DNS緩存。

您可以在應用程序中實現自己的緩存(如根據diegows的評論,他們爲Squid所做的那樣),但我會建議您不要這樣做。這是很多工作,很容易弄錯(nscd錯了!!!),它可能不會像專門的DNS緩存那樣容易調整,並且它複製了已經存在於應用程序之外的功能。

如果使用軟件的最終用戶需要DNS緩存,因爲DNS查詢負載足夠大而成爲問題,或者外部DNS服務器的RTT長到足以成爲問題,他們可以安裝緩存DNS服務器(例如Unbound)位於與應用程序相同的機器上,配置爲緩存響應並將未命中轉發給常規DNS解析器。

+0

嘿,謝謝。還有一個問題。你知道它是如何工作在Windows上的瀏覽器。我已經讀過,chrome依賴於操作系統dns緩存。那麼,這是否意味着應用程序可以訪問操作系統dns緩存?一般來說,dns解析的流程是什麼(在緩存環境中)。瀏覽器檢查自己的緩存是否保持一致。那麼它會詢問OS還是它讀取操作系統DNS緩存?如果沒有找到條目,那麼它就會解決。 –

+5

當OS級緩存可用時,除非應用程序繞過標準名稱查詢API('getaddrinfo()'等)並直接實現其自己的DNS查詢,否則它將自動且透明地被所有應用程序使用。這適用於MacOS X無條件的,它適用於Linux,如果有一些機會nscd運行和活動(不能說MS Windows)。如果應用程序實現了自己的緩存,則除了可能存在或不存在的任何操作系統級緩存之外,它還應用(同樣,除非應用程序直接繞過操作系統和查詢)。 – Celada

+2

@Celada你可以提供'在Linux上(也可能是大多數Unix)的源代碼,除非安裝了nscd並運行,否則沒有OS級的DNS緩存。我搜索一下沒有運氣...... – cYrus

19

這裏是可用於DNS緩存在Linux上其他兩個軟件包:

  • 的dnsmasq
  • 綁定

配置DNS轉發和緩存軟件後,你再設置系統的DNS解析器在/etc/resolv.conf中設置爲127.0.0.1。

如果您的系統使用NetworkManager你可以嘗試使用dns=dnsmasq選項/etc/NetworkManager/NetworkManager.conf或者你可以改變你的連接設置爲自動(地址只),然後使用腳本在/etc/NetworkManager/dispatcher.d目錄來獲取DHCP域名服務器,將其設置作爲DNS緩存軟件中的DNS轉發服務器,然後觸發配置重新加載。

+1

現在'systemd' [又是一個](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html),它可以通過'systemctl enable systemd-resolved'啓用。 –

2

Firefox包含一個dns緩存。在約

  1. 打開瀏覽器
  2. 類型: 要禁用DNS高速緩存,在地址欄中配置
  3. 右鍵單擊屬性的列表上,並選擇New>整數在上下文菜單
  4. 輸入'network.dnsCacheExpiration'作爲首選項名稱,0作爲整數值

禁用時,Firefox將使用操作系統提供的DNS緩存。