Dnsmasq提供DNS緩存和DHCP服務、Tftp服務功能。作為域名解析服務器(DNS),Dnsmasq可以通過緩存DNS請求來提高對訪問過的網址的連接速度。作為DHCP服務器,Dnsmasq可以為局域網電腦提供內網ip地址和路由。DNS和DHCP兩個功能可以同時或分別單獨實現。Dnsmasq輕量且易配置,適用於個人用戶或少於50台主機的網絡。此外它還自帶了一個PXE服務器。
Dnsmasq工作原理
當接受到一個DNS請求時,Dnsmasq首先會查找/etc/hosts
這個文件,然后查找/etc/resolv.con
f中定義的外部DNS。所以說Dnsmasq是一個很不錯的外部DNS中繼。
配置Dnsmasq為DNS緩存服務器,同時在/etc/hosts
文件中加入本地內網解析,這樣一來每當內網機器查詢時就會優先查詢hosts文件,這就等於將/etc/hosts
共享給全內網機器使用,從而解決內網機器互相識別的問題。相比逐台機器編輯hosts文件或者添加Bind DNS記錄,僅編輯一個hosts文件,這簡直太容易了。
安裝Dnsmasq
- Ubuntu/Debian
1 |
$ apt-get install dnsmasq |
- Centos/RHEL
1 |
$ yum install dnsmasq |
配置Dnsmasq
Dnsmasq處理DNS設置與BIND等其他DNS服務有所不同。所有的配置都在一個文件中完成/etc/dnsmasq.conf
。默認情況下dnsmasq.conf中只開啟了最后include項,可以在/etc/dnsmasq.d
中自己寫任意名字的配置文件。
配置文件說明
Dnsmasq配置文件是/etc/dnsmasq.conf
,下面對Dnsmasq中和DNS相關的配置項進行說明。
1 |
用指定的端口代替默認的DNS 53端口,如果設置為0,則完全禁止DNS功能,只使用dhcp服務 |
配置實例
配置上游服務器地址
resolv-file配置Dnsmasq額外的上游的DNS服務器,如果不開啟就使用Linux主機默認的/etc/resolv.conf
里的nameserver。
- 通過下面的選項指定其他文件來管理上游的DNS服務器
1 |
$ vi /etc/dnsmasq.conf |
- 在指定文件中增加轉發DNS的地址
1 |
$ vi /etc/resolv.dnsmasq.conf |
本地啟用Dnsmasq解析
1 |
$ vi /etc/resolv.conf |
添加解析記錄
- 使用系統默認hosts
編輯hosts文件,簡單列舉一下格式
1 |
$ vi /etc/hosts |
hosts文件的強大之處還在於能夠劫持解析,譬如mirror.centos.org是CentOS倉庫所在,幾乎是機器正常必訪問一個域名,我將它解析成一個內網地址,搭建一個內網鏡像站,不僅內網機器也可以及時得到安全更新,每月還可以節省很多流量。
- 使用自定義hosts文件
修改配置,增加自定義hosts文件位置。
1 |
$ vi /etc/dnsmasq.conf |
在/etc/dnsmasq.hosts文件中添加DNS記錄
1 |
$ vi /etc/dnsmasq.hosts |
- 使用自定義conf
1 |
$ vi /etc/dnsmasq.d/address.conf |
注:也可以直接添加到/etc/dnsmasq.conf中,不過/etc/dnsmasq.d/*.conf的優先級大於/etc/dnsmasq.conf。
修改iptables配置
- 允許本機的53端口可對外訪問
1 |
$ iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT |
- 轉發DNS請求
1 |
# 開啟流量轉發功能 |
- 保存規則並重啟
1 |
$ service iptables save |
測試Dnsmasq
- 啟動Dnsmasq
1 |
$ service dnsmasq start |
- 測試Dnsmasq
將其他機器的DNS換成dnsmasq所在的IP即可,就這么容易。
1 |
$ dig @192.168.101.104 www.hi-linux.com |
一些Dnsmasq技巧
Dnsmasq性能優化
我們都知道Bind不配合數據庫的情況下,經常需要重新載入並讀取配置文件,這是造成性能低下的原因。根據這點教訓,我們可以考慮不讀取/etc/hosts
文件。而是另外指定一個在共享內存里的文件,比如/dev/shm/dnsrecord.txt
,這樣就不費勁了,又由於內存的非持久性,重啟就消失,可以定期同步硬盤上的某個內容到內存文件中。
具體實現步驟
- 配置dnsmasq
1 |
$ vim /etc/dnsmasq.conf |
- 解決同步問題
1 |
# 開機啟動 |
Dnsmasq選擇最快的上游DNS服務器
經常會有這樣的情景,Dnsmasq服務器配了一堆上游服務器,轉發本地的dns請求,缺省是Dnsmasq事實上是只挑了一個上游dns服務器來查詢並轉發結果,這樣如果選錯服務器的話會導致DNS響應變慢。
解決方法
1 |
$ vi /etc/dnsmasq.conf |
all-servers表示對以下設置的所有server發起查詢,選擇回應最快的一條作為查詢結果返回。
上面我們設置了兩個dns server,8.8.8.8(谷歌dns)和219.141.136.10(移動的dns),會同時查詢這兩個服務器,詢問dns地址誰返回快就采用誰的結果。
dnsmasq-china-list項目
dnsmasq-china-list項目維護了一張國內常用但是通過國外DNS會解析錯誤的網站域名的列表,保證List中的國內域名全部走國內DNS服務器解析。
項目地址: https://github.com/felixonmars/dnsmasq-china-list
dnsmasq-china-list使用
- 取消dnsmasq.conf里conf-dir=/etc/dnsmasq.d這一行的注釋
- 獲取項目文件
1 |
$ git clone https://github.com/felixonmars/dnsmasq-china-list.git |
- 將accelerated-domains.china.conf, bogus-nxdomain.china.conf,google.china.conf(可選)放到/etc/dnsmasq.d/目錄下(如目錄不存在則建立一個)。
- 將
dnsmasq-update-china-list
放到/usr/bin/
,這是一個批量修改DNS服務器的工具(可選)。
參考文檔
http://www.google.com
http://purplegrape.blog.51cto.com/1330104/1083354
https://i-meto.com/archives/iptables_PREROUTING.html
http://blog.itphp.org/archives/225