Pages

Jan 11, 2012

減少 Server not found 的頻率

前情提要
最近 (2011-12) 因為使用 Firefox 9, 經常發生 Server not found, 心理面懷疑是 FF9 造成的, 乾脆把整個 FF9 徹底移除, 連同硬碟內的目錄, Registry 通通清除之, 然後重新安裝 FF9, 但是 Server not found 的現象並沒有「緩解」, 這代表著 FF9 是無辜的受害者....

既然不是瀏覽器這個層級的問題, 那問題可能出在更上一層, 於是把 dnscache 給清除了 (但這應該是與問題無關, 原因後述). Windows 7 系統裡面的 dnscache 仍然是 DNS Client 服務, 在命令列上下指令 ipconfig /flushdns.

一般而言 DNS Cache 會依照該項目的 TTL 時間, 自動排出快取範圍, 因此 Cache 不至於失控的成長, 但是 Server not found 的問題並不是 dnscache 能做到的, 之所以發生問題是 cache 根本沒有這個資料或是該主機搬家了, 造成 IP 對應 hostname 發生錯誤. 另一個可能是 DNS 主機 timeout, 超過 FF9 內定的最大容忍範圍, 因此 FF9 回報 Server not found.

清了 dnscache 後, 打開 cfosspeed 的 current connections 功能, 會列出實際上正在連線的列表, 我觀察到了 OpenDNS 主機回應 0 的現象, 這正是原因所在.

問題是 OpenDNS 主機是人家的, 已經超過我們能管控的範圍, 每隔幾分鐘就來一陣子主機回應 0 的事情, 就造成 FF9 或 IE9 完全連不上網路, 該如何解決??




自架 DNS Cache
趁著 DNS 還有回應的時候, 搜尋了一下, 找到 MaraDNS 這套 Opensource 並且可以用在 Windows 7 的 DNS server, 發現裡面有一套 Deadwood DNS server 更適合使用, 於是本篇就是 Deadwood 如何取代 Windows 7 內建 DNS Client 的方法

首先要準備幾樣東西:
http://www.maradns.org/

下載 maradns-2-0-04-win32.zip 這個檔案 (有可能繼續更新), 不過原則就是找 win32 結尾的檔案, 解出來之後, 把 Deadwood-3-0-05-win32 子目錄移到我們想要的地方, 必須是開機就能跑的位置, 例如 C:\ 上, 然後設定 dwood3rc.txt


設定 Deadwood DNS Cache
如果純粹是本機使用, 並不服務其他上網的設備, 修改 recursive_acl 這個項目, 改為 "127.0.0.1".

添加 maximum_cache_elements = 16777216 這個項目

我原本上網是用 OpenDNS 當主要 DNS, 現在的主要 DNS 變成 Deadwood, 但本地端的 DNS 並沒有轉譯表, 因此加上:
upstream_servers = {}
upstream_servers["."] = "208.67.222.222, 208.67.220.220,"
upstream_servers["."] += "208.67.222.220, 208.67.220.222"

如果想用 Google Public DNS 的人, 改為:
upstream_servers = {}
upstream_servers["."] = "8.8.8.8, 8.8.4.4"

如果想直接使用 Root server 的話, 改為:
root_servers = {}
root_servers["."] = "198.41.0.4,"
root_servers["."] += "192.228.79.201,"
root_servers["."] += "192.33.4.12,"
root_servers["."] += "128.8.10.90,"
root_servers["."] += "192.203.230.10,"
root_servers["."] += "192.5.5.241,"
root_servers["."] += "192.112.36.4,"
root_servers["."] += "128.63.2.53,"
root_servers["."] += "192.36.148.17,"
root_servers["."] += "192.58.128.30,"
root_servers["."] += "193.0.14.129,"
root_servers["."] += "199.7.83.42,"
root_servers["."] += "202.12.27.33"

上述的 IP 是從 http://en.wikipedia.org/wiki/Root_name_server 的 Root server addresses 直接抄出來的.

請注意: root_servers 項目與 upstream_servers, 不可同時使用

請留下一兩行空白在 dwood3rc.txt 的最後面, 存檔之.

接下來創建一個 dw_cache_bin 的空檔案

一切就緒後, 以系統管理員身分, 執行 install.bat



檢查 Deadwood DNS Cache
Deadwood 服務啟動後, 會自動的更新 dwlog.txt, 我們只要讀取這個檔案, 就知道 Deadwood server 的工作狀態.

例如:
2012年1月11日 上午 11:39:14: ==Deadwood started==
2012年1月11日 上午 11:39:14: Deadwood version 3.0.05
2012年1月11日 上午 11:39:14: Deadwood: A DNS UDP non-recursive cache (IPv4-only)
2012年1月11日 上午 11:39:14: We bound to 2 addresses

這樣就是一切正常的.




修改上網的 DNS 路徑
撥接上網 (浮動 or 固定) 上網的人, 使用如下的方式改變 DNS 查詢的主機位置:

路由器/IP 分享器自動撥接上網的人, 請自行參照手冊設定, 網際網路 DNS 主機位置改為「執行 Deadwood 那台電腦的 LAN IP」, (不可使用 127.0.0.1, 因為路由器/IP 分享器本身沒有執行 Deadwood 服務).




結論
Server not found 的頻率大幅度下降到幾乎不再發生, 而且拜 Local DNS 之賜, 沒有 DNS 主機連結時間, 網路運作的非常順利.

No comments: