2015年1月3日 星期六

dnsmasq 的加速法

dnsmasq 可用來加速 DNS 的查詢,預設 Ubuntu 安裝都會附加一個,隨著 dhclient 和 NetworkManager 跟著抓取適當的 DNS 伺服器,並且扮演前端與使用者溝通的角色,然後在本地端暫存經常查詢的資料,以便下次提供直接的答案,就像一個本地端的 DNS proxy。

不過 Ubuntu 預設安裝的 dnsmasq 並不是那麼容易設定,因此我習慣都會關掉它,並且自己安裝 dnsmasq。

關掉的方法很簡單,只要開啟 /etc/NetworkManager/NetworkManager.conf,並且把 dns=dnsmasq 這一行註解掉就可以了,例如:
#dns=dnsmasq

不要因此移除任何 Ubuntu 上預設安裝的 package,像是 dnsmasq-base,那可能會導致一些其他的異常狀況出現。

接著我們可以安裝自己的 dnsmasq,像是單純的 apt-get install dnsmasq 即可完成這個簡單的步驟,並且試情況修改 /etc/dnsmasq.conf,一個值得嘗試的選項是 cache-size,也由於我沒有看到有針對這個數值的實驗數據,只有一些支字片語提到最好不要設定太大,所以我自己是設定為 4096。

另外比較少為人所知的是,dnsmasq 提供一個選項 --all-servers,它會將 /etc/dnsmasq.conf 裡面的每一個 server 做一個同步查詢的動作,比如說設定了三個 servers,分別是 8.8.8.8、8.8.4.4、168.95.1.1,那只要 --all-servers 有被指定,那 dnsmasq 就會一次全部向這些 servers 送出 DNS 請求,看誰先回應就用誰的,有點像是平行處理的行為,雖然這樣可能會增加一些 DNS 的網路流量。

指定 --all-servers 的方法是在 dnsmasq 啟動時指定,因此我的方法是直接修改 /etc/init.d/dnsmasq 這個 script 檔案,在 119 行下方新增 --all-servers 的參數。原本那一個段落長這樣:
108     start-stop-daemon --start --quiet --pidfile /var/run/dnsmasq/$NAME.pid --exec $DAEMON -- \
109         -x /var/run/dnsmasq/$NAME.pid \
110             ${MAILHOSTNAME:+ -m $MAILHOSTNAME} \
111         ${MAILTARGET:+ -t $MAILTARGET} \
112         ${DNSMASQ_USER:+ -u $DNSMASQ_USER} \
113         ${DNSMASQ_INTERFACES:+ $DNSMASQ_INTERFACES} \
114         ${DHCP_LEASE:+ -l $DHCP_LEASE} \
115         ${DOMAIN_SUFFIX:+ -s $DOMAIN_SUFFIX} \
116         ${RESOLV_CONF:+ -r $RESOLV_CONF} \
117         ${CACHESIZE:+ -c $CACHESIZE} \
118             ${CONFIG_DIR:+ -7 $CONFIG_DIR} \
119         ${DNSMASQ_OPTS:+ $DNSMASQ_OPTS} \

我們在 119 行下方新增一行,變成這樣:
108     start-stop-daemon --start --quiet --pidfile /var/run/dnsmasq/$NAME.pid --exec $DAEMON -- \
109         -x /var/run/dnsmasq/$NAME.pid \
110             ${MAILHOSTNAME:+ -m $MAILHOSTNAME} \
111         ${MAILTARGET:+ -t $MAILTARGET} \
112         ${DNSMASQ_USER:+ -u $DNSMASQ_USER} \
113         ${DNSMASQ_INTERFACES:+ $DNSMASQ_INTERFACES} \
114         ${DHCP_LEASE:+ -l $DHCP_LEASE} \
115         ${DOMAIN_SUFFIX:+ -s $DOMAIN_SUFFIX} \
116         ${RESOLV_CONF:+ -r $RESOLV_CONF} \
117         ${CACHESIZE:+ -c $CACHESIZE} \
118             ${CONFIG_DIR:+ -7 $CONFIG_DIR} \
119         ${DNSMASQ_OPTS:+ $DNSMASQ_OPTS} \
120         --all-servers \

之後重新啟動就完成了:
sudo service dnsmasq restart。

正常的話,隨便一個 DNS 請求,都會平行送出給每個指定的 server,像以下圖中指定四個 servers,當我查詢 tw.yahoo.com 的時候,可以看到請求以及回應被平行送出與處理:

沒有留言:

張貼留言