使用dnsmasq搭建DNS Server

作者 zzzmode 日期 2018-03-31
使用dnsmasq搭建DNS Server

前段时间腾讯云活动撸了个1核2G内存云服务器,上海二区使用上海电信ping值不超过8ms左右,但带宽只有1M,适合玩玩,想着搭建一个自用DNS服务器。

按照网上的很多文章,都是直接用apt install dnsmasq 安装的,我这样安装后死活不行,最多本地解析可以,而且会自动替换成本地dns服务器,简单看来下是启动脚本改的,我的目的只想开放53端口对外服务就可以,但是外网就是不可以,nmap可以扫描的udp53端口是打开着的,始终不通,所有放弃,最后自己编译安装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/