Unbound + Dnsdist + DOH C/S 搭建DNS Over TLS 以及 DNS Over HTTPS服务器


Unbound 简介

Unbound是一个验证,递归,缓存DNS解析器。它设计为快速和精简,并结合了基于开放标准的现代功能。

项目地址:https://nlnetlabs.nl/projects/unbound/about/


Dnsdist 简介

Dnsdist是一个高度DNS,DoS和滥用感知的负载均衡器。它的目标是将流量路由到最佳服务器,为合法用户提供最佳性能,同时分流或阻止滥用流量。

项目地址:https://dnsdist.org


方案说明:

GeekDNS目前采用的架构是 4台解析服务器 4台上游服务器【两台国内,两台国外】

解析服务器上主要安装Unbound + Dnsdist +DOH C/S ,Unbound 用来处理用户【TCP/UDP 53 + TLS 853】请求,将国外域名查询转发到本地的DOH Client交付于国外上游进行查询,将ChinaList里面的域名交付于DNSDIST 通过负载策略向两台国内上游进行查询。使用DOH Server 对用户提供DNS Over HTTPS服务。

上游服务器:国内安装Unbound ,国外安装Unbound+DOH Server。


安装过程:

安装环境:Centos 7 

一:环境安装

yum install -y wget gcc tar zip redhat-lsb gawk unzip net-tools psmisc glibc-static expect telnet
yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake
yum install -y  automake autoconf libtool make build-essential curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel git asciidoc xmlto
yum -y install epel-release 
yum -y install bind-util libevent libevent-devel
yum install perl-core zlib-devel -y
yum group install 'Development Tools' -y

以上脚本安装一些需要的依赖环境

二:升级Openssl

如果想DNS Over TLS服务支持TLS1.3请执行以下步骤如果不需要请跳过

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar zxvf openssl-1.1.1a.tar.gz
mv openssl-1.1.1a openssl
cd openssl
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl --libdir=lib shared zlib -Wl,-R,'$(LIBRPATH)' -Wl,--enable-new-dtags  enable-ec_nistp_64_gcc_128 enable-tls1_3
make && make install
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
echo /usr/local/ssl/lib >> /etc/ld.so.conf

三:安装加密库

cd /root
wget -N --no-check-certificate https://github.com/jedisct1/libsodium/releases/download/1.0.17/libsodium-1.0.17.tar.gz
tar xf libsodium-1.0.17.tar.gz && cd libsodium-1.0.17
./configure && make -j2 && make install
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
rm -rf /root/libsodium-1.0.17.tar.gz
rm -rf /root/libsodium-1.0.17

四:安装Go 【DOH C/S是GO语言

cd /root
wget https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.11.linux-amd64.tar.gz
mkdir -p /root/go

接着编辑/etc/profile

vi /etc/profile

在结尾加入以下代码

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/root/go

接着运行以下命令

source /etc/profile

运行完成后可以使用go version查看当前GO版本

五:安装Unbound
cd /root
wget https://nlnetlabs.nl/downloads/unbound/unbound-1.9.0.tar.gz
tar -zxvf unbound-1.9.0.tar.gz
cd unbound-1.9.0
./configure --enable-subnet --with-libevent --with-pthreads  --with-ssl --enable-dnscrypt
make && sudo make install
cd /usr/local/etc/unbound
wget ftp://ftp.internic.net/domain/named.cache

上面configure 参数中--enable-subnet是启用ECS,--with-ssl是启用DNS over TLS

安装好后配置文件在/usr/local/etc/unbound/unbound.conf

如果要启用DNSSEC的话安装完成后运行,会生成/usr/local/etc/unbound/root.key

unbound-anchor
六:安装Dnsdist
wget https://repo.powerdns.com/centos/x86_64/7/dnsdist-master/dnsdist-0.0.15847-0.ge02abfb425.1pdns.el7.x86_64.rpm
yum install -y dnsdist-0.0.15847-0.ge02abfb425.1pdns.el7.x86_64.rpm

dnsdist配置文件在/etc/dnsdist/dnsdist.conf

七:安装DOH C/S
cd /root
git clone https://github.com/m13253/dns-over-https.git
unzip dns-over-https.zip
cd dns-over-https
make
sudo make install
sudo systemctl start doh-server.service
sudo systemctl enable doh-server.service
sudo systemctl start doh-client.service
sudo systemctl enable doh-client.service

Server 配置文件在/etc/dns-over-https/doh-server.conf

Client 配置文件在/etc/dns-over-https/doh-client.conf


八:配置Unbound

以下是配置文件内容【因编辑器原因缩进丢失,自行缩进以及删除注释,下面一堆东西懒得注释了自己去官方文档找】

server:
verbosity: 1
interface: 0.0.0.0@53 #监控ipv4上的53端口
interface: ::0@53 #监控ipv6上的53端口
interface: 0.0.0.0@853 #监控ipv6上的853端口用于DNS Over TLS
interface: ::0@853 #监控ipv6上的853端口用于DNS Over TLS
username: "root"#运行的用户
access-control: 0.0.0.0/0 allow #允许所有用户使用
access-control: ::1 allow #允许所有用户使用
do-ip4: yes 
do-ip6: yes
do-udp: yes #是否开启UDP
do-tcp: yes #是否开启TCp
log-servfail: no
num-threads: 1  #线程数
do-not-query-localhost: no
aggressive-nsec: yes
harden-glue: yes
qname-minimisation: yes
qname-minimisation-strict: no
rrset-roundrobin: yes
prefetch: yes#消息缓存元素在它们到期之前被预取以保持缓存是最新的
msg-cache-size: 64m #消息缓存的字节数。 默认值为4 MB。
rrset-cache-size: 128m #RRset缓存的字节数。
outgoing-num-tcp: 1024#为每个线程分配的传出TCP缓冲区数
incoming-num-tcp: 2048#为每个线程分配的传入TCP缓冲区数
jostle-timeout: 300
neg-cache-size: 20m
    
cache-min-ttl: 90 #解析最小缓存时间
cache-max-ttl: 43200 #解析最大缓存时间
so-rcvbuf: 8m
so-sndbuf: 8m
so-reuseport: yes #为每个线程的传入查询打开专用侦听套接字。可以更均匀地将传入查询分布到线程
max-udp-size: 4096
edns-buffer-size: 4096
edns-tcp-keepalive: yes
edns-tcp-keepalive-timeout: 60000
send-client-subnet: 0.0.0.0/0
send-client-subnet: ::0/64
module-config: "subnetcache validator iterator"
root-hints: "named.cache"
auto-trust-anchor-file: "/usr/local/etc/unbound/root.key
minimal-responses: yes
tls-service-key: ""#在这设置你的密钥
tls-service-pem: ""#在这设置你的证书
tls-port: 853
include: "/etc/unbound/accelerated-domains.china.unbound.conf"#国内域名交由dnsdist
include: "/etc/unbound/apple.china.unbound.conf"#国内域名交由dnsdist
include: "/etc/unbound/google.china.unbound.conf"#国内域名交由dnsdist
forward-zone:
    name: "."
    forward-addr: 127.0.0.1@5353#国外域名交由DOH Client

配置文件会在附件上,自行修改证书密钥,将 "accelerated-domains.china.unbound.conf","apple.china.unbound.conf","google.china.unbound.conf"三个文件放到/etc/unbound 里面。

九:配置DNSDIST
vi /etc/dnsdist/dnsdist.conf

配置文件说明:

newServer({address="8.8.8.8:53",useClientSubnet=true,maxCheckFailures=30,qps=10000})
#如果你自建上游请修改服务器为你的IP
newServer({address="114.114.114.114:53",useClientSubnet=false,maxCheckFailures=30,qps=2000})
#这个就相当于备胎上面GG用下面的
addACL('0.0.0.0/0')
addACL('::/0')
addLocal('0.0.0.0:8853')#本地监听端口对应unbound 设置的国内域名转发地址
addLocal('[::]:8853')#本地监听端口
setServerPolicy(firstAvailable)#策略
setECSSourcePrefixV4(24)#设置ECS
setECSSourcePrefixV6(56)#设置ECS

上面8.8.8.8:53如果你自建上游可以修改成自己的上游地址

useClientSubnet:是否开启ECS,maxCheckFailures存活检查,qps 每秒频次 ,setServerPolicy(firstAvailable)设置这个策略后基本走qps高的服务器除非这服务器GG了

十:配置DOH C/S

Client配置,配置文件附件有

# DNS listen port
listen = [
    "0.0.0.0:5353",#监听端口,对应unbound 设置的国外域名转发地址
]
upstream_google = [
    "https://dns.233py.com/dns-query",#指定上游查询,你可以设置为你的国外上游DOH 服务地址
    "https://doh.blahdns.com/dns-query",
]
bootstrap = [
    "8.8.8.8:53",#用于解析DOH服务地址
    "8.8.4.4:53",
]
passthrough = [
    "captive.apple.com",
    "connectivitycheck.gstatic.com",
    "detectportal.firefox.com",
    "msftconnecttest.com",
    "nmcheck.gnome.org",
    "pool.ntp.org",
    "time.apple.com",
    "time.asia.apple.com",
    "time.euro.apple.com",
    "time.nist.gov",
    "time.windows.com",
]
timeout = 30
no_cookies = true
no_ecs = false
no_ipv6 = false
verbose = false

Server配置

# HTTP listen port
listen = [
    "127.0.0.1:8053",#监听地址
]
cert = ""#建议将TLS交予Nginx处理
key = ""
path = "/dns-query"
upstream = [
    "127.0.0.1:53",#上游地址Unbound监听端口
]
timeout = 10
tries = 3
tcp_only = false
verbose = false

附上Nginx需要的设置在附件里面,你可以参考

十一:最后调试

DNSDIST需要supervisor

pip install supervisor
rm -rf /etc/supervisord.conf
vi /etc/supervisord.conf

修改文件内容为以下

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
[program:dnsdist]
command=dnsdist --supervised -C /etc/dnsdist/dnsdist.conf
autorestart=true
user=root


放行防火墙端口

firewall-cmd --permanent --zone=public --add-port=53/tcp
firewall-cmd --permanent --zone=public --add-port=853/tcp
firewall-cmd --permanent --zone=public --add-port=53/udp
firewall-cmd --reload


启动Unbound 

killall unbound && unbound -v

重启DOH C/S

sudo systemctl restart doh-client.service
sudo systemctl restart doh-server.service


注意:

安卓P上私人DNS需要域名解析到服务器上

DOH Server 需要自己配置Nginx,步骤并未详细介绍

Unbound需要配置TLS证书,自行生成或者使用HTTPS证书


转载请注明,谢谢

最后于 2天前 被admin编辑 ,原因: Unbound 版本更新
上传的附件:
最新回复 (0)
全部楼主
返回
发新帖