文章

dnsmasq 搭建自己的DNS服务器

  编辑于:2019-02-27
文章目录

前言

平时我们都是使用的默认的DNS解析服务器,但是最近本地的DNS服务器出了一些问题,导致打开某些网站的速度变得很慢,所以就打算自己搭建一个dns服务器,这里采用dnsmasq,因为他的使用非常简单。

安装dnsmasq

很多发行版已经可以直接安装dnsmasq了,可以用apt-get install dnsmasq -y或者yum install dnsmasq -y来安装。
这里也介绍一下debian9上编译安装的方法。
在这里查看最新的dnsmasq:http://www.thekelleys.org.uk/dnsmasq/

apt-get update
apt-get install make gcc xz-utils -y
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.80.tar.xz
tar -xvf dnsmasq-2.80.tar.xz
cd dnsmasq-2.80
make
make install
cp dnsmasq.conf.example /etc/dnsmasq.conf

设置dnsmasq

编译安装或者aptyum均是修改下面的文件
配置文件是/etc/dnsmasq.conf,修改vi /etc/dnsmasq.conf
只是简单的使用,修改以下的内容即可。

resolv-file=/etc/resolv.conf

strict-order

#listen-address=192.168.153.128

address=/demon.com/192.168.153.128

#server=114.114.114.114

#bogus-nxdomain=114.114.114.114

对参数的解释
resolve-file 定义dnsmasq从哪里获取上游DNS服务器的地址, 默认是从/etc/resolv.conf获取。

strict-order 表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。

listen-address 定义dnsmasq监听的地址,默认是监控本机的所有网卡上。局域网内主机若要使用dnsmasq服务时,指定本机的IP地址,如果你的DNS服务器和你欲使用该DNS的设备不在同一个局域网则把你的公网地址放上去,如果你还需要为本机的其他程序提供解析,则需要把127.0.0.1放上去,这里可以同时设置多个IP。

listen-address=127.0.0.1,192.168.1.1,8.8.8.8

address 启用泛域名解析,即自定义解析a记录,如下配置为demon.com这个域名:

address=/demon.com/127.0.0.1  #访问demon.com时的所有域名都会被解析成127.0.0.1

bogus-nxdomain 为防止DNS污染,使用参数定义的DNS解析的服务器。注意:如果是阿里云服务器上配置dnsmasq要启用此项。

server 指定dnsmasq程序使用哪个DNS服务器进行解析。 对于不同的网站可以使用不同的域名对应解析如下配置

server=/google.com/8.8.8.8    #表示对于google的服务,使用谷歌的DNS解析。

因为这里的编译安装没有设置开机自启,我们设置一下开机自启,如果你采用apt或者yum方法来安装的话,不需要执行以下步骤。
不支持systemd的系统,这里利用cron来实现。

crontab -e

加入以下内容

#开机自启动dnsmasq
@reboot /usr/local/sbin/dnsmasq -C /etc/dnsmasq.conf
#每隔三十分钟检测dnsmasq进程,如果不存在,则重启dnsmasq
*/30 * * * * [[ -z $(ps -e | grep dnsmasq) ]] && /usr/local/sbin/dnsmasq -C /etc/dnsmasq.conf

支持systemd的系统(debian8/ubuntu16.04以上),将一下内容一起复制执行,不要单行复制

echo -e "[Unit]
Description=dnsmasq servier
After=network.target
     
[Service]
ExecStart=/usr/local/sbin/dnsmasq -C /etc/dnsmasq.conf --keep-in-foreground
Restart=always
    
[Install]
WantedBy=multi-user.target" > /etc/systemd/system/dnsmasq.service

以上配置完毕后,需要设置自启动并,重启dnsmasq服务,重启完毕后其他机器,就可以通过该DNS服务器解析公网的域名。

systemctl enable dnsmasq && systemctl restart dnsmasq

通过netstat -lntp查看dnsmasq是否监听53端口。如果提示-bash: netstat: command not found,则可以通过apt-get install net-tools -y进行安装。
dnsmasq的debug模式

 dnsmasq --no-daemon --log-queries

补充

在debian系的新系统中,有一个systemd-resolved的服务会占用53端口,可通过systemctl disable systemd-resolved && systemctl stop systemd-resolved来禁用该服务。
自定义DNS地址,修改/etc/netplan目录下以.yaml结尾的文件。将nameserver:后的addresses: -"8.8.8.8"(或者其他地址)修改为addresses: [DNS1,DNS2],然后运行

sudo netplan try

来测试设置是否正确,如果设置不正确,可能会导致服务器无法联网,自然你也就无法通过ssh来连接这台服务器了。
由于部分上游DNS会根据你发起解析请求的IP返回一个最近的解析地址,而这个地址可能只是距离你的服务器比较近,但并不适用于你的个人电脑,这就可能导致,部分网站无法正常打开(例如通过119.29.29.29解析腾讯的qq.com和gtimg.com),这个时候可以通过server=/域名/114.114.114.114(或者别的公共DNS)来解决问题。
dnsmasq的缓存设置是cache-size
dnsmasq还有更强大的功能,具体内容可以查看官方文档:http://www.thekelleys.org.uk/dnsmasq/doc.html
参考链接:
https://www.cnblogs.com/demonxian3/p/7472300.html

发表回复

  • 评论2则,共1页,当前第1
    • Henry

      首先感谢大佬的指导,成功用国外VPS搭建了DNS服务器,并且解析到了家里公网ip
      想必大佬知道,最近电信查家用宽带私设web,很凶,nas通过ddns域名远程登录就会被封停宽带,用群晖官方QC的ddns也会被查到
      所以作为小白的我想到了用私有DNS服务器的方式来实现域名登录,避免域名在公共dns解析,如此一来应该不会被检测到家用宽带被绑定域名在使用
      大佬可以出一个群晖下用脚本自动更新IP到远程DNS服务器的教程吗,小白也在学习。。。目前网上暂时找不到群晖脚本更新dnsmasq解析记录的方法。。[undefined]

      • 由于我没有群晖,没有办法测试,所以可能没办法帮助你了。