公司办公用的DNS服务器,要实现以下几个需求:
1. 公司内部的系统,包括wiki等系统,使用的是内部域名,互联网上不能解析;
2. 访问中国国内网站,使用114和阿里的DNS
3. 访问google等网站,DNS不能被污染
本方案结合使用dnsmasq和dnscache实现上述目标。主要是使用dnsmasq灵活的配置,以及djbdns中dnscache不信任任何上游DNS服务器的特点。单独用dnscache也能实现,但是配置繁琐。
配置过程流水账一下, ubuntu 16.04:
一、安装daemontools和ucspi-tcp
$ sudo apt-get install daemontools daemontools-run
ucspi-tcp
二、编译安装dbndns
1. 确保在软件源配置文件/etc/apt/sources.list中添加了deb-src项
2. 安装dpkg-dev
$ sudo apt-get install dpkg-dev
3. 查询当前镜像站点中是否有该源码包
$ sudo apt-cache showsrc dbndns
4. 将源码包下载到用户当前目录
$ sudo apt-get source dbndns
源码包中通常包含3个文件,分别以dsc,orig.tar.gz和diff.gz为后缀名。
5. 构建依赖(dbndns其实不需要此步骤,可跳过)
$ sudo apt-get build-dep dbndns
6. 修改djbdns的补丁
$ vi
djbdns-1.05/dbndns/diff/0002-Apply-fefe-s-djbdns-1.05-test23-ipv6-patch.diff
找到diff --git a/dnscache.c
b/dnscache.c这一行,将下边4行中的53改成853如下:
if (x->port < 1024)
if (x->port != 853) return;
if (x->port < 1024)
if (x->port != 853) { close(x->tcp); return; }
+ if
(socket_bind6_reuse(udp53,myipincoming,853,interface) == -1)
+ if
(socket_bind6_reuse(tcp53,myipincoming,853,interface) == -1)
7. 编译deb包
$ cd djbdns-1.05
$ sudo dpkg-buildpackage
8. 使用dpkg安装编译好的包
$ sudo dpkg -i dbndns_1.05-8ubuntu1_amd64.deb
三、配置dnscache
$ groupadd dnscache
$ useradd -g dnscache dnscache
$ useradd -g dnscache dnscachelog
$ dnscache-conf dnscache dnscachelog /etc/dnscache
192.168.0.10
$ touch /etc/dnscache/root/ip/192.168.0
$ ln -s /etc/dnscache /etc/service/
$ svstat /etc/service/dnscache
$ ss -nul|grep 853
四、 安装配置dnsmasq
$ sudo apt-get install dnsmasq
修改配置文件
$ sudo vi /etc/dnsmasq.conf
port=53
domain-needed
bogus-priv
no-resolv
interface=eth0
bind-interfaces
cache-size=512
#log-queries
# 这里配置多个上游服务器,配合all-servers
server=114.114.114.114
server=223.5.5.5
server=223.6.6.6
# 特定域 转交给指定DNS服务器解析
server=/internal.com/192.168.1.1
server=/foo.bar.com/223.5.5.5
# 特定域名 直接返回指定的IP地址
address=/foo.fake.com/10.10.10.10
# 其他被引用的配置文件目录
conf-dir=/etc/dnsmasq.d
为避免污染,将相应的域名指向本机的dnscache解析(853端口)
$ sudo vi /etc/dnsmasq.d/gfw.conf
....
server=/google.com/127.0.0.1#853
server=/zyzc9.com/127.0.0.1#853
....
修改启动脚本,加入--all-servers 参数
$ sudo vi
/etc/systemd/system/multi-user.target.wants/dnsmasq.service
...
ExecStart=/etc/init.d/dnsmasq systemd-exec --all-servers
$ sudo systemctl daemon-reload
$ sudo systemctl start dnsmasq
参考文档:
https://louwrentius.com/secure-caching-dns-server-on-linux-with-djbdns.html
https://blog.csdn.net/MaoshiYIHAO/article/details/70947578
https://www.linux.com/learn/intro-to-linux/2018/2/advanced-dnsmasq-tips-and-tricks
https://ma.ttwagner.com/make-dns-fly-with-dnsmasq-all-servers/