前言
部署,共计分两步走。
环境:CentOS7
第一:DNScrypt部署(目的:DNS防污染)
第二:部署高性能递归DNS服务器-unbound
1.1 DNScrypt-wrapper部署
DNScrypt-wrapper与Dnscypt-proxy客户端通过密钥交互,实现无污染;
当然,Wrapper也可以不部署,直接使用现成的公共服务器,下载客户端“Simple DnsCrypt”来获取【需要翻墙】
下载:
https://download.libsodium.org/libsodium/releases/old/libsodium-1.0.3.tar.gz
编译安装
dnscrypt-wrapper 依赖 libsodium 和 libevent2;前者一般源里没有,后者一般默认版本不是2而是比较旧的1,我们得先来手动编译这两个库。
安装依赖
wget https://download.libsodium.org/libsodium/releases/old/libsodium-1.0.3.tar.gz
tar -xzvf libsodium-1.0.3.tar.gz
cd libsodium-1.0.3
yum -y groupinstall "Development Tools" //安装编译环境
CFLAGS="-O3 -fPIC" ./configure //编译
make && make install
ldconfig //命令作用:是为了让动态链接库为系统所共享
然后我们从这里下载 libevent2 ,这里我们选择 2.0.22 稳定版:
wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
tar -zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr
make && make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
编译安装dnscrypt-wrapper
搞定两个依赖库之后,就可以开始编译 dnscrypt-wrapper 啦
yum install -y git
git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git
cd dnscrypt-wrapper
make configure
./configure
如果你在 make configure 这一步出错,你可能需要先安装 autoconfig
yum install -y autoconfig
如果没什么问题,那么就可以开始编译安装了:
make && make install
安装完成会出现如下提示:
# make install
install -d -m 755 ‘/usr/local/bin’
install -p dnscrypt-wrapper ‘/usr/local/bin’
至此编译完成。
ln -s /usr/local/sbin/dnscrypt-wrapper /usr/sbin/dnscrypt-wrapper
1.2 dnscrypt-proxy客户端-部署
同样需要安装最开始两个依赖包
下载:https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.9.1.tar.bz2
tar -xf dnscrypt-proxy-1.9.1.tar.bz2
cd dnscrypt-proxy-1.9.1
cd src/libevent-modified/
CFLAGS="-O3 -fPIC" ./configure
make && make install
cd ../..
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
./configure
make -j2 && make install
dnscrypt-proxy启动执行文件 路径默认在/usr/local/sbin/dnscrypt-proxy
/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv中存放了已经支持dnscrypt查询的公共dns
开机启动服务
# cd /etc/init.d/
# vim dnscypt-proxy
#! /bin/sh
### BEGIN INIT INFO
# Provides: dnscrypt-proxy
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: dnscrypt-proxy
# Description: dnscrypt-proxy secure DNS client
### END INIT INFO
# Authors: https://github.com/simonclausen/dnscrypt-autoinstall/graphs/contributors
# Project site: https://github.com/simonclausen/dnscrypt-autoinstall
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DAEMON=/usr/local/sbin/dnscrypt-proxy
NAME=cisco
ADDRESS=208.67.220.220
PNAME=2.dnscrypt-cert.opendns.com
PKEY=B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79
case "$1" in
start)
echo "Starting $NAME"
$DAEMON --daemonize --ignore-timestamps --ephemeral-keys --edns-payload-size=50000 --max-active-requests=100000 --user=root --local-address=127.0.0.1:5353 --resolver-address=$ADDRESS --provider-name=$PNAME --provider-key=$PKEY --logfile=/var/log/dnscrypt.log --pidfile=/var/run/dnscrypt.pid
;;
stop)
echo "Stopping $NAME"
pkill -f $DAEMON
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/dnscrypt-proxy {start|stop|restart}"
exit 1
;;
esac
exit 0
# chmod 755 dnscrypt
# chkconfig --add dnscrypt
# chkconfig dnscrypt on
使用命令测试:
root@MyServer:~# dig @127.0.0.1 -p 5353 twitter.com
发现获取到的 IP 均相同且为真正的正确 IP 地址,服务生效。
2.1 CentOS7 部署unbound
事先安装dnscrypt
下载:https://www.unbound.net/downloads/unbound-1.6.0.tar.gz
1. 安装编译环境插件
# yum update
# yum groupinstall -y "Development tools" openssl-devel expat-devel
编译安装libevent2
# wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
# tar -zxvf libevent-2.0.22-stable.tar.gz
# cd libevent-2.0.22-stable
# ./configure --prefix=/usr
# make && make install
# echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig
2.下载、解压后进入unbound目录
# wget https://www.unbound.net/downloads/unbound-1.6.0.tar.gz
# tar -zxvf unbound-1.6.0.tar.gz
# cd unbound-1.6.0
# ./configure -with-libevent && make && make install
注:libevent可以提高unbound性能,配置文件参数会用到,否则参数无效
3.添加用户和组
# groupadd unbound
# useradd -m -g unbound -s /bin/false unbound
4.关闭firewall开启iptables
# systemctl stop firewalld.service #停止firewall
# systemctl disable firewalld.service #禁止firewall开机启动
# firewall-cmd --state #查看默认防火墙状态
# yum install -y iptables-services #安装iptables
5.编辑配置文件
# vi /usr/local/etc/unbound/unbound.conf
详见“官方优化文档”说明
# unbound-control reload #重新加载配置文件,同时会清理DNS缓存
6. dnsmasq-china-list 来加速国内域名
# yum install -y git
# git https://github.com/felixonmars/dnsmasq-china-list.git
# cd dnsmasq-china-list
# make unbound
# cp ./accelerated-domains.china.unbound.conf /usr/local/etc/unbound/
参考: https://blog.phoenixlzx.com/2016/04/27/better-dns-with-unbound/
7.启动【开机启动】
# unbound-checkconf #检测配置文件是否有语法错误
# unbound # 启动
# whereis unbound # 查找启动文件路径
# cd /etc/init.d/
# vim unbound
#!/bin/bash
# chkconfig: 2345 67 33
# description: unbound service start.
/usr/local/sbin/unbound
# chmod 755 unbound
# chkconfig --add unbound
# chkconfig unbound on
# chkconfig --list
8.注:本机127.0.0.1不提供unbound解析,网卡设置里面正常填写外部国内DNS
9.Dig解析测试
2.2 unbound主配置文件说明
官方文档: https://www.unbound.net/documentation/unbound.conf.html
num-threads: 8 //线程数可以修改为物理核心数
interface: 10.0.0.37 //侦听所有 IPv4 地址(只监听本机IP地址)
//如果只需要本机使用,则一个 interface: 127.0.0.1 即可
verbosity: 4 //日志输出等级,默认1
val-log-level:2 //日志级别
logfile: "unbound_running.log" //学会看日志去解决问题,默认路径/usr/local/etc/unbound目录
so-rcvbuf: 8m #官方建议(4m或8m)
so-sndbuf: 8m #官方建议(4m或8m)
so-reuseport: yes # 提高UDP性能多线程,就写 yes,
msg-cache-size: 50m # msg缓存大小
rrset-cache-size: 100m #msg缓存大小,值设置msv-cache-size的2倍。
由于malloc开销,总内存使用量可能会上升到输入配置的总缓存内存的两倍(或2.5倍)。
msg-cache-slabs: #官方建议配置为“num-threads”的2次幂
rrset-cache-slabs: #官方建议配置为“num-threads”的2次幂
infra-cache-slabs: #官方建议配置为“num-threads”的2次幂
key-cache-slabs: #官方建议配置为“num-threads”的2次幂
cache-max-ttl: 3600 # 最大TTL值,专治各种运营商 DNS 缓存不服
此选项非常重要,可以解决部分网站加载慢的问题
outgoing-num-tcp: 1024 # 限制每个线程向上级查询的 TCP 并发数
incoming-num-tcp: 1024 # 限制每个线程接受查询的 TCP 并发数
edns-buffer-size: 1480 #默认4096,改为1480 可以解决碎片重组问题
# 下面这四个不需要解释了吧,不想用那个就写 no
do-ip4: yes
# do-ip6: yes #这个IPV6参数务必要注释掉!!!
do-udp: yes
do-tcp: yes
tcp-upstream: yes # 强制使用 tcp 协议连上游的话写 yes(防止污染)
access-control: 0.0.0.0/0 allow # 本允许哪个网段可以使用本DNS
注意! 如果监听所有 IPv4 和 IPv6 地址的话,就必须限制允许访问的 IP 地址范围。假设一台主要针对内网,同时为 202.96.0/24 服务的服务器,应配置如下 ACL:
access-control: 0.0.0.0/0 deny # 禁止除下列地址之外的所有IPv4地址
access-control: 202.96.0/24 allow
access-control: 10.0.0.0/8 allow # RFC 1918
access-control: 172.16.0.0/12 allow # RFC 1918
access-control: 192.168.0.0/16 allow # RFC 1918
access-control: 127.0.0.0/8 allow # 允许本机查询
access-control: ::0/0 deny # 禁止除下列地址之外的所有IPv6地址
access-control: (自己的IPv6网段) allow
access-control: ::1 allow # 允许本机查询
access-control: ::ffff:127.0.0.1 allow # 允许本机查询
当然,对于对内网服务的机器来说,应单独指定内网的 IP 地址而不是监听全部可用 IP 地址,以避免暴露攻击面。
include: "/usr/local/etc/unbound/hosts.conf"
#如果需要做内网域名劫持,需要在这个位置配置
root-hints: "/usr/local/etc/unbound/named.cache" #顶c级根域 - 没有的话在
ftp://FTP.INTERNIC.NET/domain/named.cache 下载一份
module-config: "validator iterator" #启用DNSSEC,这两个模块缺一不可
auto-trust-anchor-file: "/usr/local/etc/unbound/root.key" # 开启DNSSEC 自动信任锚文件
提前使用“unbound-anchor -a root.key”命令生成root.key
domain-insecure: "sina.com.cn" #这个参数非常重要,意思是定义的域名不经过DNSSEC检查,加快国内域名访问速度。有几个写几个,最好使用include维护单独一个文件。
hide-identity: yes # 不返回对 id.server 和 hostname.bind 的查询。
hide-version: yes # 不返回对 version.server 和 version.bind 的查询。
接下来配置remote-control【远程控制】
主要作用是可以很方便的使用 unbound-control命令
提前在/usr/local/etc/unbound目录下生成必要的TLS密钥文件
# unbound-control-setup
配置文件开启
remote-control:
control-enable: yes
server-key-file: "/usr/local/etc/unbound/unbound_server.key"
server-cert-file: "/usr/local/etc/unbound/unbound_server.pem"
control-key-file: "/usr/local/etc/unbound/unbound_control.key"
control-cert-file: "/usr/local/etc/unbound/unbound_control.pem"
# unbound-control reload | start | stop #重新加载配置文件,而无需重启DNS服务
# unbound-control -h #显示帮助信息
# 不过下面有 identity 和 version 的自定义选项,不隐藏这些的话,修改下选项还可以卖个萌
harden-glue: yes # 建议打开
unwanted-reply-threshold: 10000 # 官方为建议1000万
do-not-query-localhost: no # 一般是为了防止扯皮丢包开着,不过等下要用 DNSCrypt 所以关掉
prefetch: yes # 蛮好用的,开着吧
minimal-responses: yes # 省带宽,开着吧。本机用可以关掉
username: "root" #要求用户运行
# 关键部分来了,把默认查询全部丢给 DNSCrypt。使用 [地址]@[端口] 指定查询地址和端口,默认端口 53。
# 然后把国内的地址丢给国内的缓存服务器。这两个选项的顺序不能错哟。
# 如果使用隧道查询,把这个地址改为隧道对端的地址,或者一个国外的 DNS 服务器都可以,例如 8.8.8.8。
#指定域名让特定DNS解析
forward-zone:
name: "jd.com."
forward-addr: 114.114.114.114
forward-zone:
name: "."
forward-addr: 127.0.0.1@5353
forward-addr: 192.168.10.10@5351
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2017/05/27/高性能递归DNS服务器/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!