使用Unbound + DOH Server 搭建DNS-OVER-HTTPS && DNS-OVER-TLS && DNSCrypt服务器

admin 8月前 3565

接上篇https://www.4gml.com/thread-66.htm

由于原来方案晚上人多了容易出现解析问题,最近更新了新的方案。

感谢@风痕 提供的GFWLIST思路

现在采用的方案:

系统:Centos 7

架构:Unbound + DOH Server 

说明:Unbound 直接对正常域名进行解析,对于特殊域名采用GFWLIST转发通过 DOT向海外上游进行查询。

Gfwlist列表每天01:30定时从Gayhub上拉取更新.


安装步骤:

一:环境安装

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用于支持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


三:安装加密库(如果不需要DNSCrypt服务可以跳过)

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
cd /root
rm -rf /root/libsodium-1.0.17*


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

wget https://studygolang.com/dl/golang/go1.12.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.12.1.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.1.tar.gz
tar -zxvf unbound-1.9.1.tar.gz
cd unbound-1.9.1
./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

--enable-subnet启用ECS支持 --with-ssl启用DOT --enable-dnscrypt启用DNSCrypt 根据自己需求选择

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

unbound-anchor

如果要启用DNSSEC的话安装完成后运行以上命令【不推荐开启DNSSEC,奇葩问题太多了】

生成的文件会存在 /usr/local/etc/unbound/root.key


六:安装DOH Server

cd /root
git clone https://github.com/m13253/dns-over-https.git
cd dns-over-https
make
sudo make install
sudo systemctl start doh-server.service
sudo systemctl enable doh-server.service

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


七:配置国内Unbound服务器

server:
	verbosity: 1
	interface: 0.0.0.0@53#监听IPV4 53端口
	interface: ::0@53#监听IPV6 53端口
	interface: 0.0.0.0@853
	interface: ::0@853
	interface: 0.0.0.0@22
	interface: ::0@22
	
	username: "root"
	access-control: 0.0.0.0/0 allow
	access-control: ::1 allow
	
	do-ip4: yes
	do-ip6: no #查询是否通过IPV6 如果你服务器没有IPV6请把do-ipv6关闭
	do-udp: yes
	do-tcp: yes
	
	log-servfail: no
	
	num-threads: 1 #改成你服务器核心数
	do-not-query-localhost: no
	aggressive-nsec: yes
	harden-dnssec-stripped: yes
	harden-short-bufsize: yes
	harden-large-queries: yes 
	harden-glue: yes
	harden-below-nxdomain: yes
	harden-referral-path: yes
	hide-trustanchor: yes
	hide-identity: yes
	hide-version: yes
	qname-minimisation: yes
	qname-minimisation-strict: no
	rrset-roundrobin: yes
	prefetch: yes #消息缓存元素在它们到期之前被预取以保持缓存是最新的
	prefetch-key: yes
    
	msg-cache-slabs: 1
	rrset-cache-slabs: 1
	key-cache-slabs: 1
	infra-cache-slabs: 1
	infra-cache-numhosts: 10000
	msg-cache-size: 64m
	rrset-cache-size: 128m
	cache-max-negative-ttl: 20
	
	tcp-idle-timeout: 30000
	outgoing-range: 4096
	outgoing-num-tcp: 1024
	incoming-num-tcp: 2048
	jostle-timeout: 300
	neg-cache-size: 20m
    
	cache-min-ttl: 90
	cache-max-ttl: 43200
	infra-host-ttl: 900
   
	serve-expired-ttl: 86400
	serve-expired: yes
	use-caps-for-id: yes
	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
	max-client-subnet-ipv6: 56
	max-client-subnet-ipv4: 24
	module-config: "subnetcache validator iterator" #如果需要ECS貌似必须三个选项都得填上,可以试试把validator去掉 DNSSEC
	root-hints: "named.cache" 
	
	include: "/etc/unbound/ad.conf" #广告过滤相关
	
	auto-trust-anchor-file: "/usr/local/etc/unbound/root.key" #DNSSEC验证需要的密钥,不需要DNSSEC可以删除这行
	tls-cert-bundle: "/etc/pki/tls/certs/ca-bundle.crt" #向海外上游DOT通信需要的证书
	
	unwanted-reply-threshold: 10000000
	minimal-responses: yes
	
	tls-service-key: ""#DOT 证书密钥文件
	tls-service-pem: "#DOT 证书文件
	tls-port: 853 #DOT 端口
	
	dnscrypt: 
		dnscrypt-enable: yes
		dnscrypt-port: 22
		dnscrypt-provider: 2.dnscrypt-cert.edns.233py.com.
		dnscrypt-secret-key: /usr/local/etc/unbound/dns.key
		dnscrypt-provider-cert: /usr/local/etc/unbound/dns.cert
		
	include: "/etc/unbound/gfwlist.conf" #海外查询域名列表

请自行修改 证书密钥文件,ad.conf 以及 gfwlist.conf如果没文件可以删除


ad.conf 广告过滤模板

local-zone: "0127.adsame.com" redirect
local-zone: "0aqpqdju.me" redirect
local-zone: "0.r.msn.com" redirect

 gfwlist.conf 模板

forward-zone:
  name: "agnesb.fr."
  forward-tls-upstream: yes
  forward-addr: 119.28.68.142@853#hk-dns.233py.com
  forward-addr: 91.188.223.66@853#ru-dns.233py.com
  forward-addr: 176.96.138.211@853#de-dns.233py.com

forward-tls-upstream: yes #使用tls向上游查询

 forward-addr: 119.28.68.142@853#hk-dns.233py.com

指定上游服务器地址,可以使用谷歌或者Cloudflare等上游,当然也可以使用本站的国外上游【不提供任何可靠性保证】


八:配置DOH Server

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

# 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请参考上一篇网站


九:配置DNSCrypt

安装dnscrypt-wrapper用于生成密钥

git clone git://github.com/cofyc/dnscrypt-wrapper.git
cd dnscrypt-wrapper
make configure
./configure
make install

生成密钥文件

dnscrypt-wrapper --gen-provider-keypair  --dnssec --nolog --provider-name=2.dnscrypt-cert.你的域名 --ext-address=服务器IP:端口
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=dns.key
dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=dns.key --provider-cert-file=dns.cert --provider-publickey-file=public.key --provider-secretkey-file=secret.key --cert-file-expire-days=365d


将生成的dns.key dns.cert保存到/usr/local/etc/unbound

--dnssec支持DNSSEC  --nolog 没有日志记录 --nofilter没有过滤规则

DNSCrypt 如果走TCP不能查询到结果,原因未知,我这里用的是22端口。


十:放行端口

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


端口说明:

443用于DOH基本已经开了,如果你的服务器是阿里腾讯华为等请在安全组继续添加放行。

853 TCP用于DOT

53 UDP普通DNS通信

22 UDP DNSCRYPT使用,TCP未知原因查不出结果所以直接关闭TCP



十一:重启各个服务

killall unbound
unbound -v
sudo systemctl restart doh-server.service


自行测试即可

最后于 6月前 被admin编辑 ,原因: go 版本更新
最新回复 (0)
全部楼主
返回
发新帖