DNSMASQ服务搭建

我们在浏览器访问一个网页时,一般输入一个网页的地址,比如: www.baidu.com,然后就可以和远程服务器建立HTTP连接传输数据。但是对于网络层来说,它只认识IP地址,并不认识网页地址。所以他们之间有一个转换的过程。这个转换过程是DNS服务完成的。

 

域名

 

网域名称英语:Domain Name),简称域名网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

IP地址Internet主机的作为路由寻址用的数字体标识,人不容易记忆。因而产生了域名这一种字符型标识。

域名是有分级的,顶级域名主要按照组织(com, org, net)和地区(us, cn, hk ,cc)划分。比如我注册的xxxx.cc这个域名,.cc是一个地区顶级域名,xxxx.cc是顶级域名下的一个二级域名。 而www.xxxx.cc, blog.xxxx.cc 这些都是三级域名,而xxx.blog.xxxx.cc是四级域名,依次类推。

 

DNS

 

网域名称系统英文Domain Name System,缩写DNS)是互联网的一项服务。它作为将域名IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCPUDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符

DNS解析过程

 

每天网络的访问量非常的巨大,如果所有的域名都要去DNS服务器解析,那么服务器压力会非常大。所以一般DNS解析都会使用缓存。

当我打开浏览器输入www.xxxx.cc这个域名的时候,浏览器会检查是否之前有缓存过这个域名的IP地址,如果有并且没有过期,那么就直接访问,否则会把这个解析请求发送到机器设置的DNS地址。

我们电脑上网一般都会设置一个DNS,但是大多情况是自动设置的。比如我的电脑设置的是192.168.0.1我的无线路由器的地址。(也可以自己配置其他DNS地址)

我的路由器连接着光猫,光猫的地址是192.168.1.1,路由器配置的DNS也是光猫的地址。所以会把请求直接发送给光猫。因为没有手边光猫登录账号,所以没进去看。里面的的DNS就是设置的ISP运营商提供的DNS。最终这个DNS请求发送给了ISP的DNS服务器进行解析。

 

DNS协议

 

DNS可以用UDP或TCP实现,目前大多是用UDP实现。所以无法验证DNS结果的合法性,很容易被污染和劫持。DNS协议请求和应答格式如下:

  • 标识16bit:唯一的标示了问题号码,用于查询端区别自己的查询
  • 标识16bit: 标示了报文的性质和一些细节
    • QR:0表示查询报文,1表示响应报文
    • opcode:通常为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)
    • rcode:通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。

  • 查询问题:记录要查询的域名的信息,查询名就是域名

查询类型如下,通常是A,表情查询IP地址

查询的结果是放在回、授权里面的,他们的结构是一样的。

关于DNS协议报文,具体推荐看<TCPIP详解 第一卷> 中的DNS。我也不熟悉,就是看过了解而已。

 

搭建DNS服务

 

了解了DNS基本信息,为了解决DNS污染和劫持,我们可以使用一些公共的DNS比如8.8.8.8,但是这个被BAN,不太好用。所以可以自己搭建DNS服务。目前搭建DNS服务器只要使用BIND9或DNSMASQ。

DNSMASQ

 

Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。

相对于dnsmasq,bind9功能更加强大,不过对于个人VPS来说小巧的dnsmasq足够用了。DNSMASQ程序不包含也不可能包含任何DNS数据,所有的数据也都是去DNS服务器请求的。它主要作用是缓存这些DNS结果。启动后会监听指定IP地址的53端口。提供DNS服务。

 

安装

 

sudo apt-get install dnsmasq

配置

 

安装成功后,DNSMASQ配置文件在/etc/dnsmasq.conf。 文件中有详细的配置信息介绍,配置都是注释掉的。所以在开头添加一下配置:

#指定解析的DNS的上游服务器文件,可以随便指定一个文件

resolv-file=/etc/resolv.dnsmasq.conf

#按照resolv-file中指定的服务器顺序解析

strict-order

#DNSMASQ服务监听的地址如果本机用可以是127.0.0.1,如果提供给其他机器用要指定IP比如你VPS的地址,监听端口是53

listen-address=127.0.0.1, 192.168.1.1

#解析的host文件可以没有

addn-hosts=/etc/dnsmasq.hosts

#其他配置文件目录

conf-dir=/etc/dnsmasq.d

#缓存DNS数据条数

cache-size=10000

创建文件/etc/resolv.dnsmasq.conf文件,这个文件中记录的是上游DNS服务器的地址,也就是DNSMASQ去那里解析域名。如果前面配置文件指定了strict-order, 那么会安装你写的顺序去解析,第一个失败了采用后面的。如果没设置strict-order,那就任意选择。文件中填入的是google的DNS

nameserver 8.8.8.8

nameserver 8.8.4.4

nameserver 2001:4860:4860::8888

nameserver 2001:4860:4860::8844

编辑/etc/resolv.conf 文件,这个文件是系统使用的,和我们在windows和Mac上手动设置DNS是一样的。默认所有请求都是走这个文件中的DNS服务器请求。 因为我们搭建了DNSMASQ,所以把这个文件修改为:

nameserver 127.0.0.1

意思就是本机所有域名解析都交给 127.0.0.1:53端口,也就是DNSMASQ处理。

 

UBUNTU上要注意的配置

 

在ubuntu上完成以上配置完,开机自动启动后发现并没有效果(手动指定conf文件启动没问题),用ps -aux查看进程,发现开机启动使用DNSMASQ使用的并不是指定的/etc/dnsmasq.conf配置文件。网上查询发现:

# Note that if the resolvconf package is installed it is not possible to  override it just by configuration in /etc/dnsmasq.conf, it is necessary to set IGNORE_RESOLVCONF=yes in /etc/default/dnsmasq.

如果系统安装了resolvconf包,自动启动dnsmasq时不会读取/etc/dnsmasq.conf,按照上面写的,设置一下就OK了。

启动和停止DNSMASQ

 

sudo service dnsmasq start/restart/stop

启动后通过命令查看:

chengchao@189554:~$ ps -aux | grep dns
dnsmasq 9989 2.5 0.7 37504 7424 ? S 05:21 2:45 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new

 

测试

 

使用dig命令可以进行dns测试

chengchao@189554:~$ dig www.163.com

; <<>> DiG 9.9.5-3-Ubuntu <<>> www.163.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25298 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.163.com. IN A ;; ANSWER SECTION: www.163.com. 221 IN CNAME www.163.com.lxdns.com. www.163.com.lxdns.com. 145 IN CNAME opthw.xdwscache.speedcdns.com. opthw.xdwscache.speedcdns.com. 49 IN A 220.243.237.154

;; Query time: 56 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jan 31 07:12:47 2017
;; MSG SIZE rcvd: 128

第一次请求解析www.163.com,返回了IP地址,和TTL = 49s,查询时间是56ms,查询的服务器是本地的,也就是DNSMASQ,说明查询过成功。并且打印出了请求报文和应答报文信息。

chengchao@189554:~$ dig www.163.com

; <<>> DiG 9.9.5-3-Ubuntu <<>> www.163.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16776 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.163.com. IN A ;; ANSWER SECTION: www.163.com. 216 IN CNAME www.163.com.lxdns.com. www.163.com.lxdns.com. 140 IN CNAME opthw.xdwscache.speedcdns.com. opthw.xdwscache.speedcdns.com. 44 IN A 220.243.237.154

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jan 31 07:12:52 2017
;; MSG SIZE rcvd: 123

再次请求,查询时间变为3ms,说明本地缓存生效。我们发现TTL时间变成了44S,也就是这个DNS结果会在44秒之后失效,到时候再次请求时又会从服务器去获取了。

 

SS和DNSMASQ

 

安装好了DNSMASQ之后,我们使用SS的时候,所有DNS解析请求都通过DNSMASQ,可以减少几十毫秒的网络请求时间。如果通过ss进行全局代理,访问国内网站也会走VPS,然后VPS要去查询DNS,国外DNS服务查询最终可能又绕回到国内,这个延迟可能达到 500ms以上,所以作为优化,可以在DNSMASQ中设置,让国内域名直接使用国内的DNS服务器来解析。

https://github.com/felixonmars/dnsmasq-china-list 这里维护了国内域名和DNS服务器的数据信息。在DNSMASQ中使用如下:

利用wget命令从github上下载下面3个文件

accelerated-domains.china.conf

bogus-nxdomain.china.conf

dnsmasq-update-china-list

前两个文件放进/etc/dnsmasq.d/ ,最后一个扔进/usr/bin/。然后重启DNSMASQ服务,生效设置!

提供远程DNS服务

 

前面都是在VPS上提供本地的DNS解析,主要是给Shadowssock使用的,我们可以配置城一台DNS服务器,这样自己电脑也可以使用了。修改/etc/dnsmasq.conf文件

listen-address=127.0.0.1, 192.168.1.1

加入你的VPS的公网地址,如果是局域网,就加入你局域网中的IP地址,然后重启服务。在自己本地机器上用dig 查看一下google

; <<>> DiG 9.8.3-P1 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37143 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 600 IN A 93.46.8.89 ;; AUTHORITY SECTION: google.com. 99490 IN NS ns3.google.com. google.com. 99490 IN NS ns2.google.com. google.com. 99490 IN NS ns1.google.com. google.com. 99490 IN NS ns4.google.com. ;; ADDITIONAL SECTION: ns1.google.com. 166304 IN A 216.239.32.10 ns2.google.com. 344495 IN A 216.239.34.10 ns3.google.com. 170294 IN A 216.239.36.10 ns4.google.com. 166547 IN A 216.239.38.10 ;; Query time: 12 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Jan 31 15:40:10 2017
;; MSG SIZE rcvd: 184

DNS是我的路由器,时间才12ms,这么快。 因为我的路由器是Linsys WRT 54G刷了的DD-WRT,linux系统,带有DNSMASQ服务,所以可以缓存。 然后把自己本地电脑DNS设置为VPS的地址。在使用dig命令

chengchao@cc-mbp:~$dig www.google.com

; <<>> DiG 9.8.3-P1 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49463 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 3182 IN A 78.16.49.15 ;; Query time: 25 msec
;; SERVER: 192.157.220.239#53(192.157.220.239)
;; WHEN: Tue Jan 31 15:45:40 2017
;; MSG SIZE rcvd: 48

DNS服务的地址已经是VPS地址了。速度这么快? 可能是本地有缓存。然而访问google还是上不了。所以通过修改DNS是不行的,唯一用处就是防DNS劫持。不用看ISP搞的广告。

dig www.baidu.com

; <<>> DiG 9.8.3-P1 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62703 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.baidu.com. IN A ;; ANSWER SECTION: www.baidu.com. 1154 IN CNAME www.a.shifen.com. www.a.shifen.com. 45 IN A 103.235.46.39 ;; Query time: 179 msec
;; SERVER: 192.157.220.239#53(192.157.220.239)
;; WHEN: Tue Jan 31 15:51:03 2017
;; MSG SIZE rcvd: 77

访问一下百度,这个延迟就是我ping VPS的延迟,180ms左右还是太慢了,开网页有明显的等待。所以可以在自己本地或路由也装一个DNSMASQ,把它的上有DNS服务器设置为VPS,这样有了缓存就快多。

 

提供远程服务的问题

 

这两天上VPS发现CPU占用率一直在30%左右,之前基本是百分之几。看了下都是DNSMASQ在使用。搞不清楚为什么。当时没有去看log。log在/var/log/syslog中

Jan 31 15:44:17 189554 dnsmasq[13327]: using nameserver 114.114.114.114#53 for domain 0001688.com
Jan 31 15:44:17 189554 dnsmasq[13327]: using nameserver 114.114.114.114#53 for domain 0000738.com
Jan 31 15:44:17 189554 dnsmasq[13327]: using nameserver 114.114.114.114#53 for domain 00.net
Jan 31 15:44:17 189554 dnsmasq[13327]: using nameserver 114.114.114.114#53 for domain 0-gold.net
Jan 31 15:44:17 189554 dnsmasq[13327]: using nameserver 114.114.114.114#53 for domain 0-6.com
Jan 31 15:44:17 189554 dnsmasq[13327]: read /etc/hosts – 3 addresses
Jan 31 15:44:17 189554 dnsmasq[13327]: read /etc/dnsmasq.hosts – 3 addresses

我吧DNSMASQ服务重启,发现以启动就占用20多,然后持续在30左右。想到我之前有配置提供远程DNS的两个IP地址。于是去掉一个IP地址,重启,发现CPU专用变成15%,在去掉另一个,发现CPU正常了。所以不清楚是什么导致DNSMASQ一直在忙,难道有很多远程请求或是攻击? 晚点在看看之前的log。

关掉了几个多小时在把IP加回去,发现CPU也正常了,所以感觉是有人在攻击?


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

4 评论

  1. 啊 为什么不更新了呢,你的文章是真的详细,对我等小白帮助极大,膜拜

  2. 您好 按照您所写的 我从github上下载了相应的文件并放到对应的目录下 重启以后 dig国内的网站延迟在500以上 有的达到了1000ms 请问这怎么回事呢

于洋进行回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注