Total Pageviews

Friday, 18 August 2017

绕过53端口污染&本地缓存 - Dnsmasq配置向导

偶然看到DNSMasQ,你可以把它当成轻量级的DNS服务器。引用Wiki的描述:
Dnsmasq是一个开源的轻量级DNS转发和DHCP、TFTP服务器,使用C语言编写。Dnsmasq针对家庭局域网等小型局域网设计,资源占用低,易于配置。支持的平台包括Debian、Fedora、 Smoothwall、IP-Cop、floppyfw、Firebox、LEAF、Freesco, fli4l、CoyoteLinux 及 Android等,并且在dd-wrt、 openwrt路由器系统中也有使用。
介绍了DNSMasQ这么多还不知道它与Goagent的关系吧。我们都听说过DNS污染,有的杀毒软件描述为DNS投毒攻击,就是干扰我们从DNS服务器获取正确的IP地址。DNSMasQ能够截获DNS请求,并自带静态解析和DSN转发功能。因此我们可以用DNSMasQ给自己的DNS投毒,这么说可能有点儿不恰当,但是目的就是利用DNSMasQ帮我们摆脱来自ISP的DNS投毒攻击,最终达到正确解析IP的目的。DNSMasQ支持WPAD,是PAC的扩展应用,因此我们只要在局域网搭建一台Goagent服务器(当然选择节能设备了)再配置DNSMasQ自动发现代理就可以实现局域网内支持WPAD协议的设备科学上网了.


Dnsmasq是一款小巧且方便地用于配置DNS服务和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能,并且提供本地缓存查询的功能。

Dnsmasq的安装

yum & apt-get



1
2
centos: yum -y install dnsmasq
debian: apt-get -y install dnsmasq

编译安装



1
2
3
4
5
6
7
8
9
10
#编译需要 gcc 支持,若未安装可运行
centos: yum -y install gcc
debian: apt-get -y install gcc-4.9
#编译过程 以下以 2.75 版本 为例
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.75.tar.gz
tar -xf dnsmasq-2.75.tar.gz
cd dnsmasq-2.75
make install
#安装完毕后,查看下 dnsmasq 的版本
dnsmasq -v

配置文件

Dnsmasq 配置文件 /etc/dnsmasq.conf
本篇教程只讲解 配置dns服务
以下部分只指出 dns服务的相关配置 DHCP服务的不予阐述
只需注意以下参数:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
- port=5353
#定义 dnsmasq 的 监听端口 软件默认为53端口 此处填写5353端口
- listen-address=
#定义 dnsmasq 监听地址 若只给本机服务可设置为127.0.0.1 留空表示任何客户都可使用
- address=
#自定义 访问某些地址时使用的解析服务器 可以用于过滤某些网站
#例如填写 address=/www.nanqinlang.com/127.0.0.1 将该域名解析到一台不存在的上游服务器 127.0.0.1
#以屏蔽对该host的访问,同理可以利用此参数 过滤广告和恶意网址
- server=208.67.222.222#5353
#指定DNS解析服务器 此处设置为 opendns: 5353 以防止53端口污染
- bogus-nxdomain=
#不支持填写非53端口解析服务器,若server项填写了例如 208.67.222.222#5353 ,则此参数 应当留空
- cache-size=
#此参数可填入任意十进制整数,表示 允许缓存的查询请求条数

启用DNS服务

以上配置完毕后,需要 重启 dnsmasq 服务
然后 服务端的配置就完成了
在客户端设置dns服务器ip为 你的vps的ip 端口为 你设置的监听端口
大功告成 !
----------------

DNSmasq是一款小巧且方便地用于配置DNS服务和DHCP服务器的工具,适用于小型网络,它提供了DNS解析功能和可选择的DHCP功能,并且提供本地缓存查询请求的功能。
1、安装dnsmasq

CentOS 系统:

yum update
yum install -y dnsmasq

Debian/Ubuntu 系统:

apt-get update
apt-get install -y dnsmasq
2、查看DNSmasq的版本
dnsmasq -v

以下是输出结果,只要不是提示 找不到命令就没事( -bash: dnsmasq: command not found )

Dnsmasq version x.xx Copyright (c) 2000-2012 Simon Kelley
Compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack
This software comes with ABSOLUTELY NO WARRANTY.
Dnsmasq is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2 or 3.
3、配置文件
Dnsmasq的配置文件为:dnsmasq.conf
包管理器 方式安装的配置文件位置为:/etc/dnsmasq.conf
本教程只介绍配置DNS服务,以下部分只指出DNS服务的相关配置。
首先复制一份配置文件的备份,然后清空原配置文件,并根据下面的参数说明写入配置内容:
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
echo "" > /etc/dnsmasq.conf

打开配置文件并根据下面的参数说明写入配置内容,按 I键 进入编辑模式,改完后按 ESC键 退出并输入 :wq 保存并退出。

vi /etc/dnsmasq.conf
配置文件参数说明
port=53
 # 指定DNSmasq的监听端口,默认为53端口,也可设置为5353端口从而防止53端口DNS污染(但某些设备如win并不支持非53端口)
 
resolv-file=/xxx/xx.conf
 # 指定DNSmasq获取上游DNS服务器地址的文件,不配置此项则默认从 /etc/resolv.conf(linux默认DNS配置文件) 获取
 
strict-order
 # 严格按照 resolv-file 参数指定的文件中按从上到下的顺序发送DNS解析请求,直至获取解析应答成功为止
 
listen-address=
 # 指定DNSmasq监听的地址,若仅提供为本机使用可设置为 127.0.0.1 ,留空或设置为 0.0.0.0 即任何人都可访问
 
address=/xxx.xx/x.x.x.x
 # 自定义某些地址的解析服务器,可以 过滤或者指定 某些网站(支持ipv6,直接写ipv6的地址即可)
 # 过滤广告或者某域名,例如配置 address=/www.nanqinlang.com/127.0.0.1
 # 把广告域名解析请求发送到错误的解析服务器IP 127.0.0.1 即可屏蔽该域名的访问
 # 也可以把 www.google.com 等指向一个国外的SNI代理IP,即可实现DNS科学上网
 
server=208.67.222.222#5353
 # 指定上游DNS解析服务器,此处推荐设置为可使用5353端口的opendns
 
bogus-nxdomain=208.67.222.222
 # 用于防止DNS污染/劫持,参数和上面 server 项填写相同的 ip ,但不支持非53端口。
 
conf-dir=/etc/dnsmasq.d/
 # 加载 /etc/dnsmasq.d/ 文件夹内的配置文件
配置文件示例:
port=53
strict-order
listen-address=127.0.0.1
server=208.67.222.222#53
bogus-nxdomain=208.67.222.222
conf-dir=/etc/dnsmasq.d/
自定义地址解析 单独建立一个配置文件:
複製代碼
vi /etc/dnsmasq.d/sni.conf
然后按格式写入自定义地址解析,示例如下:
address=/google.com/1.1.1.1
address=/google.com.hk/1.1.1.1
address=/google.co.jp/1.1.1.1
address=/gmail.com/1.1.1.1
address=/youtube.com/1.1.1.1
注意:如果 这个文件或配置文件 修改了,那么需要重启 DNSmasq后才能生效。
4、使用说明
启用DNSmasq服务
service dnsmasq start
停止DNSmasq服务
service dnsmasq stop
重启DNSmasq服务(当修改配置文件后,需要重启)
service dnsmasq restart
------------------------------------------------------------------------------------

用 Dnsmasq 搭建一个简单的 DNS 服务器

本文主要介绍如何通过 Dnsmasq 工具搭建一个简单的 DNS 服务器,搭建完成后就可以马上测试使用了。

Dnsmasq 简介

Dnsmasq 是一个轻量级的 DNS 缓存、DHCP、TFTP、PXE 服务器。

作为域名解析服务器,dnsmasq 可以通过缓存 DNS 请求来提高对访问过域名的解析速度。

作为 DHCP 服务器,Dnsmasq 可以用于为局域网电脑分配内网 IP 地址和提供路由。DNS 和 DHCP 两个功能可以同时或分别单独实现。

Dnsmasq 的应用场景

我们一般使用 Dnsmasq 的 DNS 功能,总结了下基于该功能有如下使用场景:

  • 作为内部局域网的一个 DNS 缓存服务器。通过 DNS 缓存的功能,可以提高应用程序域名解析的速度。比如 Kubernetes 的 kube-dns 组件中就用 dnsmasq 容器作为 DNS 服务器,用 kube-dns 容器作为 dnsmasq 的上游服务器。dnsmasq 本身具有缓存功能,所以可以大大提高集群中服务名的解析速度,而不需要每次解析请求都访问 kube-dns 容器。

  • 实现 DNS 劫持功能。在局域网中,我们有时候可能希望暂时将某个公网域名解析到一个临时的地址,不走公网 DNS。

Dnsmasq 的工作原理

Dnsmasq 在接受到用户的一个 DNS 请求时,首先会查找 /etc/hosts 这个文件,如果 /etc/hosts 文件没有请求的记录,然后查找 /etc/resolv.conf 中定义的外部 DNS(也叫上游 DNS 服务器,nameserver 配置),外部 DNS 通过递归查询查找到请求后响应给客户端,然后 dnsmasq 将请求结果缓存下来(缓存到内存)供后续的解析请求。

配置 Dnsmasq 为 DNS 缓存服务器,同时在 /etc/hosts 文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询 hosts 文件,这就等于将 /etc/hosts 共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑 hosts 文件或者添加 Bind DNS 记录,仅编辑一个 hosts 文件,这简直太容易了。

Dnsmasq 安装

Dnsmasq 的安装特别简单,以 Centos7 下安装为例:

1
sudo yum install -y dnsmasq

Dnsmasq 配置及启动

配置

Dnsmasq 的所有的配置都在 /etc/dnsmasq.conf 这一个文件中完成 。官方在配置文件 /etc/dnsmasq.conf 中针对选项和参数等做了比较好的注释说明,我们可以将配置做一次备份,以便以后查阅。默认情况下 dnsmasq.conf 中只开启了最后 include 项,因此可以在 /etc/dnsmasq.conf 的前提下,将自定义的配置放到 /etc/dnsmasq.d 目录下的一个任意名字的配置文件当中。

注意: /etc/dnsmasq.d/*.conf 的优先级大于 /etc/dnsmasq.conf

关于 dnsmasq 的配置项非常多,具体配置项含义在 /etc/dnsmasq.conf 中有详细的说明,本文如下配置实现一个简单的 DNS 服务器(配置文件放到了 /etc/dnsmasq.d/ 目录下,命名为 dnsmasq.conf):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#dnsmasq 启动监听的端口号
port=53

#从不转发格式错误的域名
domain-needed

#默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,
#则Dnsmasq则会严格按照/etc/resolv.conf中的 DNS Server 顺序进
#行查询,直到第一个成功解析成功为止。
strict-order

# dnsmasq 缓存大小,默认 150
cache-size=8192

#address 可以将指定的域解析为一个IP地址,即泛域名解析。
# 将 *.taobao.com 解析到 10.10.10.10
address=/taobao.com/10.10.10.10

#把所有.cn的域名全部通过 114.114.114.114 这台国内DNS服务器来解析
server=/cn/114.114.114.114

为了验证 /etc/hosts 文件解析是否起作用,我们也向 hosts 文件添加几条记录:

1
2
10.4.29.106      ansible
10.4.24.116 www.baidu.com

注意:/etc/hosts 文件修改后需要重启 dnsmasq,否则修改不会生效。
重启方法:systemctl restart dnsmasq

启动

1
2
3
4
# 设置为开机自启动
systemctl enable dnsmasq
# 启动 dnsmasq 服务
systemctl start dnsmasq

测试使用 Dnsmasq

我们搭建的 DNS 服务器地址为:192.168.10.200

使用 dig 命令指定 DNS 服务器地址来查看解析是否生效:

1
2
3
dig @192.168.10.200 ansible
dig @192.168.10.200 www.taobao.com
dig @192.168.10.200 ip.cn

验证 Dnsmasq 缓存功能是否生效

首先使用 dig 查询一个之前未查询过的域名,然后看响应时间是多少:
第一次 dig:

1
2
3
4
5
6
dig @192.168.10.200 qhh.me
......
;; Query time: 478 msec
;; SERVER: 192.168.10.200#53(192.168.10.200)
;; WHEN: Sat Apr 27 21:45:24 CST 2019
;; MSG SIZE rcvd: 56

第二次 dig:

1
2
3
4
5
6
dig @192.168.10.200 qhh.me                                                                                                                                   
......
;; Query time: 0 msec
;; SERVER: 192.168.10.200#53(192.168.10.200)
;; WHEN: Sat Apr 27 21:45:32 CST 2019
;; MSG SIZE rcvd: 67

可以看到两次同样的 dig 查询的时间不一样,第一次 478 ms,第二次 0 ms,说明第二次直接是从缓存中取的数据,没有向上游服务器发起请求。

Dnsmasq 的缓存在哪里?如何查看?

dnsmasq 的缓存并不是保存在本地磁盘的某个文件,而是存储在内存中,因此是无法直接查看的。当然作为一个 Geek,想要查看缓存的内容也是有办法的:

  1. dnsmasq 启动参数添加 –log-queries

    1
    2
    vi /usr/lib/systemd/system/dnsmasq.service
    ExecStart=/usr/sbin/dnsmasq -k 改为:ExecStart=/usr/sbin/dnsmasq -k --log-queries
  2. 重新加载 Systemd Unit 配置文件

    1
    systemctl daemon-reload
  3. 重启 dnsmasq

    1
    systemctl restart dnsmasq
  4. 执行如下命令 dump 出来缓存内容到 journal 日志

    1
    kill -SIGUSR1 <PID>
  5. 查看 dump 出来的 dns 记录(dnsmasq 当前缓存的内容)

    1
    journalctl -u dnsmasq

参考资料

http://www.thekelleys.org.uk/dnsmasq/doc.html | dnsmasq 官方文档
https://www.hi-linux.com/posts/30947.html | 一篇比较全面的博客
https://yq.aliyun.com/articles/582537 | 一篇比较精简的博客
http://flux242.blogspot.com/2012/06/dnsmasq-cache-size-tuning.html | 介绍了 dnsmasq 的基本概念、缓存淘汰机制等相关内容

-------------------------------

编译安装dnsmasq(如果用包管理器安装失败)

编译

服务器环境 Ubuntu 16.04.4 LTS,其他发行版可能有所差别。
先安装一些依赖库,可能不完整

apt update
apt install nettle-dev pkg-config

下载源代码解压

wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.79.tar.gz
tar vxzf dnsmasq-2.79.tar.gz
cd dnsmasq-2.79

make
make install

生成的二进制文件在/usr/local/sbin/dnsmasq

如果需要开启DNSSEC功能,按照文档提示使用
make COPTS=-DHAVE_DNSSEC 这样就可以,但是编译报错。
还可以手动修改src/config.h 文件,把/* #define HAVE_DNSSEC */ 这一行的注释去掉也行。
编译成功后执行dnsmasq -v 就会看到已经启用DNSSEC

Dnsmasq version 2.79  Copyright (c) 2000-2018 Simon Kelley
Compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC loop-detect inotify
...

配置

创建/etc/dnsmasq.conf 配置文件,dnsmasq会默认读取此文件,有关配置的详细文档查看 http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
/etc/dnsmasq.conf

bogus-priv
domain-needed

#不自动同步文件更改
no-poll

#上游配置
resolv-file=/etc/resolv.dnsmasq.conf

#按顺序从上游dns查找
strict-order

#dns缓存大小
cache-size=1000

#如果想启用dnssec请配置添加下面配置,不用就删掉
dnssec
trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D
dnssec-check-unsigned

继续新建/etc/resolv.dnsmasq.conf 文件,配置上游dns服务,会按顺序解析,根据喜好自行选择配置。

nameserver 8.8.8.8
nameserver 119.29.29.29
nameserver 114.114.114.114

运行

以前台调试模式运行,会输出查询日志
dnsmasq -d -q

然后我们登录另一个终端使用dig命令解析

dig qq.com @127.0.0.1

输出类似如下,表示dns服务已经搭建成功

dnsmasq: query[A] qq.com from 127.0.0.1
dnsmasq: forwarded qq.com to 119.29.29.29
dnsmasq: reply qq.com is 125.39.240.113
dnsmasq: reply qq.com is 61.135.157.156

现在在你本机使用 dig qq.com @your_server_public_ip 也可以解析到了。

开机启动和守护进程管理可以通过Supervisor 启动
/etc/supervisor/conf.d/dnsmasq.conf

[program:dnsmasq]
command=/usr/local/sbin/dnsmasq -k
autorestart=false
user=root

如果要输出dnsmasq日志做后续分析,加上-q参数,日志输出到了/var/log/syslog 文件中,可以通过journalctl -f 查看实时输出的日志

然后supervisor更新一下

supervisorctl update
supervisorctl status

输出
...
dnsmasq RUNNING pid 13035, uptime 0:04:18

优化

此时 dnsmasq 已经在正常运行,可以设置电脑dns server为自己服务器ip了,但是解析国内地址访问不太理想。

  • 借助dnsmasq-china-list项目的dns配置加速解析,默认使用的是114.114.114.114解析国内域名,可以通过项目自带的dnsmasq-update-china-list 脚本替换为其他的dns服务器。
    手动安装,更多用法查看项目说明

    mkdir /etc/dnsmasq.d
    wget -P /etc/dnsmasq.d https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf

    修改/etc/dnsmasq.conf 配置文件,在后面添加一行conf-dir=/etc/dnsmasq.d

  • 使用EDNS-CLIENT-SUBNET 优化自用线路
    建议使用阿里公共DNS 223.5.5.5 解析速度比较理想。

最后重启dnsmasq生效

supervisorctl restart dnsmasq

测试

http://tools.cloudxns.net/index.php/Index/Diag

参考:
http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions
https://github.com/felixonmars/dnsmasq-china-list/

 

No comments:

Post a Comment