《利用Dnsmasq部署DNS服務(wù)》要點(diǎn):
本文介紹了利用Dnsmasq部署DNS服務(wù),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
Dnsmasq提供DNS緩存和DHCP服務(wù)、Tftp服務(wù)功能.作為域名解析服務(wù)器(DNS),Dnsmasq可以通過(guò)緩存DNS請(qǐng)求來(lái)提高對(duì)訪問(wèn)過(guò)的網(wǎng)址的連接速度.作為DHCP服務(wù)器,Dnsmasq可以為局域網(wǎng)電腦提供內(nèi)網(wǎng)ip地址和路由.DNS和DHCP兩個(gè)功能可以同時(shí)或分別單獨(dú)實(shí)現(xiàn).Dnsmasq輕量且易配置,適用于個(gè)人用戶或少于50臺(tái)主機(jī)的網(wǎng)絡(luò).此外它還自帶了一個(gè)PXE服務(wù)器.
當(dāng)接受到一個(gè)DNS請(qǐng)求時(shí),Dnsmasq首先會(huì)查找/etc/hosts
這個(gè)文件,然后查找/etc/resolv.con
f中定義的外部DNS.所以說(shuō)Dnsmasq是一個(gè)很不錯(cuò)的外部DNS中繼.
配置Dnsmasq為DNS緩存服務(wù)器,同時(shí)在/etc/hosts
文件中加入本地內(nèi)網(wǎng)解析,這樣一來(lái)每當(dāng)內(nèi)網(wǎng)機(jī)器查詢時(shí)就會(huì)優(yōu)先查詢hosts文件,這就等于將/etc/hosts
共享給全內(nèi)網(wǎng)機(jī)器使用,從而解決內(nèi)網(wǎng)機(jī)器互相識(shí)別的問(wèn)題.相比逐臺(tái)機(jī)器編輯hosts文件或者添加Bind DNS記錄,僅編輯一個(gè)hosts文件,這簡(jiǎn)直太容易了.
$ apt-get install dnsmasq
$ yum install dnsmasq
Dnsmasq處理DNS設(shè)置與BIND等其他DNS服務(wù)有所不同.所有的配置都在一個(gè)文件中完成/etc/dnsmasq.conf
.默認(rèn)情況下dnsmasq.conf中只開(kāi)啟了最后include項(xiàng),可以在/etc/dnsmasq.d
中自己寫(xiě)任意名字的配置文件.
Dnsmasq配置文件是/etc/dnsmasq.conf
,下面對(duì)Dnsmasq中和DNS相關(guān)的配置項(xiàng)進(jìn)行說(shuō)明.
用指定的端口代替默認(rèn)的DNS 53端口,如果設(shè)置為0,則完全禁止DNS功能,只使用dhcp服務(wù)
port=5353
以下兩個(gè)參數(shù)告訴Dnsmasq過(guò)濾一些查詢:1.哪些公共DNS沒(méi)有回答 2.哪些root根域不可達(dá).
從不轉(zhuǎn)發(fā)格式錯(cuò)誤的域名
#domain-needed
從不轉(zhuǎn)發(fā)不在路由地址中的域名
#bogus-priv
resolv-file配置Dnsmasq額外的向流的DNS服務(wù)器,如果不開(kāi)啟就使用linux主機(jī)默認(rèn)的/etc/resolv.conf里的nameserver,通過(guò)下面的選項(xiàng)指定其他文件.
resolv-file=/etc/dnsmasq.d/upstream_dns.conf
默認(rèn)情況下Dnsmasq會(huì)發(fā)送查詢到它的任何上游DNS服務(wù)器上,如果取消注釋,則Dnsmasq則會(huì)嚴(yán)格按照/etc/resolv.conf中的DNS Server順序進(jìn)行查詢.
#strict-order
以下兩個(gè)參數(shù)控制是否通過(guò)/etc/resolv.conf確定上游服務(wù)器,是否檢測(cè)/etc/resolv.conf的變化,則取消注釋.
如果你不想Dnsmasq讀取/etc/resolv.conf文件或者其他文件,獲得它的servers
# If you don't want dnsmasq to read /etc/resolv.conf or any other
# file, getting its servers from this file instead (see below), then
# uncomment this.
#no-resolv
如果你不允許Dnsmasq通過(guò)輪詢/etc/resolv.conf或者其他文件來(lái)獲取配置的改變,則取消注釋.
#no-poll
增加一個(gè)name server,一般用于內(nèi)網(wǎng)域名
#server=/localnet/192.168.0.1
設(shè)置一個(gè)反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析
#server=/3.168.192.in-addr.arpa/10.1.2.3
增加一個(gè)本地域名,會(huì)在/etc/hosts中進(jìn)行查詢
#local=/localnet/
增加一個(gè)域名,強(qiáng)制解析到你指定的地址上
#address=/double-click.net/127.0.0.1
同上,還支持ipv6
#address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83
增加查詢yahoo google和它們的子域名到vpn、search查找
# Add the IPs of all queries to yahoo.com, google.com, and their
# subdomains to the vpn and search ipsets:
#ipset=/yahoo.com/google.com/vpn,search
你還可以控制Dnsmasq和Server之間的查詢從哪個(gè)網(wǎng)卡出去
# server=10.1.2.3@eth1
指定源地址攜帶10.1.2.3地址和192.168.1.1的55端口進(jìn)行通訊
# and this sets the source (ie local) address used to talk to
# 10.1.2.3 to 192.168.1.1 port 55 (there must be a interface with that
# IP on the machine, obviously).
# server=10.1.2.3@192.168.1.1#55
改變Dnsmasq默認(rèn)的uid和gid
#user=
#group=
如果你想Dnsmasq監(jiān)聽(tīng)某個(gè)端口為dhcp、dns提供服務(wù)
#interface=
你還可以指定哪個(gè)端口你不想監(jiān)聽(tīng)
#except-interface=
設(shè)置想監(jiān)聽(tīng)的地址,如果你本機(jī)要使用寫(xiě)上127.0.0.1.
#listen-address=
如果你想在某個(gè)端口只提供dns服務(wù),則可以進(jìn)行配置禁止dhcp服務(wù)
#no-dhcp-interface=
# On systems which support it, dnsmasq binds the wildcard address,
# even when it is listening on only some interfaces. It then discards
# requests that it shouldn't reply to. This has the advantage of
# working even when interfaces come and go and change address. If you
# want dnsmasq to really bind only the interfaces it is listening on,
# uncomment this option. About the only time you may need this is when
# running another nameserver on the same machine.
#bind-interfaces
如果你不想使用/etc/hosts,則取消下面的注釋
#no-hosts
如果你項(xiàng)讀取其他類(lèi)似/etc/hosts文件,則進(jìn)行配置
addn-hosts=/etc/banner_add_hosts
自動(dòng)的給hosts中的name增加一個(gè)域名
#expand-hosts
給dhcp服務(wù)賦予一個(gè)域名
#domain=thekelleys.org.uk
給dhcp的一個(gè)子域賦予一個(gè)不同的域名
#domain=wireless.thekelleys.org.uk,192.168.2.0/24
同上,不過(guò)子域是一個(gè)范圍
#domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200
dhcp分發(fā)ip的范圍,以及每個(gè)ip的租約時(shí)間
#dhcp-range=192.168.0.50,192.168.0.150,12h
同上,不過(guò)給出了掩碼
#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h
自動(dòng)加載conf-dir目錄下的配置文件
conf-dir=/etc/dnsmasq.d
設(shè)置dns緩存大小,默認(rèn)為150條
cache-size=150
resolv-file配置Dnsmasq額外的上游的DNS服務(wù)器,如果不開(kāi)啟就使用Linux主機(jī)默認(rèn)的/etc/resolv.conf
里的nameserver.
$ vi /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf
$ vi /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ vi /etc/resolv.conf
nameserver 127.0.0.1
編輯hosts文件,簡(jiǎn)單列舉一下格式
$ vi /etc/hosts
127.0.0.1 ?localhost
192.168.101.107 ? web01.mike.com web01
192.168.101.107 ? web02.mike.com web02
hosts文件的強(qiáng)大之處還在于能夠劫持解析,譬如mirror.centos.org是CentOS倉(cāng)庫(kù)所在,幾乎是機(jī)器正常必訪問(wèn)一個(gè)域名,我將它解析成一個(gè)內(nèi)網(wǎng)地址,搭建一個(gè)內(nèi)網(wǎng)鏡像站,不僅內(nèi)網(wǎng)機(jī)器也可以及時(shí)得到安全更新,每月還可以節(jié)省很多流量.
修改配置,增加自定義hosts文件位置.
$ vi /etc/dnsmasq.conf
addn-hosts=/etc/dnsmasq.hosts
在/etc/dnsmasq.hosts文件中添加DNS記錄
$ vi /etc/dnsmasq.hosts
192.168.101.107 ? web01.mike.com ? ?web01
192.168.101.107 ? web02.mike.com ? ?web02
$ vi /etc/dnsmasq.d/address.conf
# 指定dnsmasq默認(rèn)查詢的上游服務(wù)器,此處以Google Public DNS為例.
server=8.8.8.8
server=8.8.4.4
# 把所有.cn的域名全部通過(guò)114.114.114.114這臺(tái)國(guó)內(nèi)DNS服務(wù)器來(lái)解析
server=/cn/114.114.114.114
# 給*.apple.com和taobao.com使用專(zhuān)用的DNS
server=/taobao.com/223.5.5.5
server=/.apple.com/223.5.5.5
# 把www.hi-linux.com解析到特定的IP
address=/www.hi-linux.com/192.168.101.107
在這里hi-linux.com相當(dāng)于*.mike.com泛解析
address=/hi-linux.com/192.168.101.107
注:也可以直接添加到/etc/dnsmasq.conf中,不過(guò)/etc/dnsmasq.d/*.conf的優(yōu)先級(jí)大于/etc/dnsmasq.conf.
$ iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
# 開(kāi)啟流量轉(zhuǎn)發(fā)功能
$ echo '1' > /proc/sys/net/ipv4/ip_forward
$ echo '1' > /proc/sys/net/ipv6/ip_forward ? # IPv6 用戶選用
# 添加流量轉(zhuǎn)發(fā)規(guī)則,將外部到53的端口的請(qǐng)求映射到Dnsmasq服務(wù)器的53端口
$ iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
$ iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
# 如果要限制只允許內(nèi)網(wǎng)的請(qǐng)求,方法如下
$ iptables -t nat -A PREROUTING -i eth1 -p upd --dport 53 -j REDIRECT --to-port 53
$ service iptables save
$ service iptables restart
$ service dnsmasq start
將其他機(jī)器的DNS換成dnsmasq所在的IP即可,就這么容易.
$ dig @192.168.101.104 www.hi-linux.com
我們都知道Bind不配合數(shù)據(jù)庫(kù)的情況下,經(jīng)常需要重新載入并讀取配置文件,這是造成性能低下的原因.根據(jù)這點(diǎn)教訓(xùn),我們可以考慮不讀取/etc/hosts
文件.而是另外指定一個(gè)在共享內(nèi)存里的文件,比如/dev/shm/dnsrecord.txt
,這樣就不費(fèi)勁了,又由于內(nèi)存的非持久性,重啟就消失,可以定期同步硬盤(pán)上的某個(gè)內(nèi)容到內(nèi)存文件中.
具體實(shí)現(xiàn)步驟
$ vim /etc/dnsmasq.conf
no-hosts
addn-hosts=/dev/shm/dnsrecord.txt
# 開(kāi)機(jī)啟動(dòng)
$ echo "cat /etc/hosts > /dev/shm/dnsrecord.txt" >>/etc/rc.local
# 定時(shí)同步內(nèi)容
$ crontab -e
*/10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt
經(jīng)常會(huì)有這樣的情景,Dnsmasq服務(wù)器配了一堆上游服務(wù)器,轉(zhuǎn)發(fā)本地的dns請(qǐng)求,缺省是Dnsmasq事實(shí)上是只挑了一個(gè)上游dns服務(wù)器來(lái)查詢并轉(zhuǎn)發(fā)結(jié)果,這樣如果選錯(cuò)服務(wù)器的話會(huì)導(dǎo)致DNS響應(yīng)變慢.
解決方法
$ vi /etc/dnsmasq.conf
all-servers ?
server=8.8.8.8 ?
server=219.141.136.10
all-servers表示對(duì)以下設(shè)置的所有server發(fā)起查詢,選擇回應(yīng)最快的一條作為查詢結(jié)果返回.
上面我們?cè)O(shè)置了兩個(gè)dns server,8.8.8.8(谷歌dns)和219.141.136.10(移動(dòng)的dns),會(huì)同時(shí)查詢這兩個(gè)服務(wù)器,詢問(wèn)dns地址誰(shuí)返回快就采用誰(shuí)的結(jié)果.
dnsmasq-china-list項(xiàng)目維護(hù)了一張國(guó)內(nèi)常用但是通過(guò)國(guó)外DNS會(huì)解析錯(cuò)誤的網(wǎng)站域名的列表,保證List中的國(guó)內(nèi)域名全部走國(guó)內(nèi)DNS服務(wù)器解析.
項(xiàng)目地址: https://github.com/felixonmars/dnsmasq-china-list
dnsmasq-china-list使用
$ git clone https://github.com/felixonmars/dnsmasq-china-list.git
dnsmasq-update-china-list
放到/usr/bin/
,這是一個(gè)批量修改DNS服務(wù)器的工具(可選).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
文/Mike
文章出處:運(yùn)維之美
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/4464.html