开头
在国内的某些对应时间段中。如果你使用了污染较为严重的DNS。那么你的梯子或者其他服务则会收到影响。最显著的则是某些境外网站无法访问。即使它不属于资本主义的网站。比如GIthub。以及一些大佬写的教程网站。那么本教程则带领大家使用Adguardhome搭建一个DOH服务。实现DOH解析服务,安全的暴露到公网
Doh和普通解析方式的优缺点
下面的介绍源自腾讯云
概述
DoT 全称是 DNS over TLS,它使用 TLS 协议来传输 DNS 协议。TLS 协议是目前互联网最常用的安全加密协议之一,我们访问 HTTPS 的安全基础就是基于 TLS 协议的。相比于之前使用无连接无加密的 UDP 模式, TLS 本身已经实现了保密性与完整性。
DoH 全称是 DNS over HTTPS,它使用 HTTPS 来传输 DNS 协议。DoH 的安全原理与 DoT 一样,他们之间的区别只在于:DoH 有了 HTTPS 格式封装,更加通用。
DoT 在专用端口上通过 TLS 连接 DNS 服务器,而 DoH 是基于使用 HTTPS 应用层协议,将查询发送到 HTTPS 端口上的特定 HTTP 端点,这里造成的外界感知就是端口号的不同,DoT 的端口号是 853,DoH 端口号 443。
普通的DNS容易被劫持则是因为DNS查询协议是非加密的。所以运营商可以对你的查询做出提前抢答或者污染到127.0.0.1
Docker搭建adguardhome
首先,在你的服务器上安装docker。当然你也可以选择直接部署到宿主机上。此处介绍Docker
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
但是你们可能会遇到Docker无法安装的问题。因为国内目前已经墙掉了Docker服务。只能说太NB。如何让命令行走代理呢。请使用下面的软件包
sudo apt-get install -y proxychains4
随后。我们编辑这个软件包的配置文件。即可让命令行走代理。这个软件包的配置在
cat /etc/proxychains4.conf
在文件的最底部。我们可以添加自己的代理
Docker 镜像拉取配置
docker run --name adguardhome --restart unless-stopped -v /root/adguardhome/:/opt/adguardhome/work -v /root/adguardhome/:/opt/adguardhome/conf -p 8443:443/tcp -p 8443:443/udp -p 3000:3000/tcp -d adguard/adguardhome
注意。我的这个命令只适合使用DOH服务。如果你需要使用普通的DNS查询。那么请参考Dockerhub的官网
DNS安全性配置
我们搭建好服务后。会有别有用心的人来攻击或者用你的服务器来进行查询。此处注意。我们需要隐藏自己的查询URL。这个也就是为什么需要使用客户端ID来进行查询的原因。我们来使用nginx来进行代理转发以及将DOH地址随机成其他的URL
root@GreenCloud:~# cat /etc/nginx/sites-enabled/dns.conf
server
{
listen 2083 ssl;
listen [::]:81;
server_name 你的域名;
ssl_certificate /root/ssl/backend/server.crt;
ssl_certificate_key /root/ssl/backend/server.key;
# 指定支持的SSL协议版本和密码套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
# 启用HSTS(HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:3000/; #此处ip和端口号配置为你第一次登录上去配置的ip和端口号,注意,否则你配置完无法访问了
}
location /此处为你随机的URL。不是你在web页面上添加的客户端 {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass https://127.0.0.1:8443/dns-query;
}
}
注意一定不要让其他人获取到你的查询地址。
adguradhome配置
镜像拉取并且成功后。我们直接在浏览器上访问这个ip的3000端口。即可来到配置页面。按照自己的需求进行选择。此处注意。监听的ip选择全部ip。或者你选择一个ip。随后使用nginx进行代理转发出来 上面的nginx代理即可。
此处有坑
记得查看你自己的docker端口号是否正确映射,进入docker后输入的端口号必须是自己能够访问的。
下面是我的配置
这个是我的配置示意图。自己可以选择合适自己的DNS服务。
如果你对隐私方面没有太大的担心。可以直接使用国内的DNS服务。
随后。我们点击设置-加密设置。来到加密设置页面。如图所示。输入自己的域名。以及端口号。此处我的端口号为443。即教程命令中的端口号。可以不用修改

下面进行证书加密设置。输入自己证书的内容。或者文件地址。注意因为adguardhome是docker模式。所以它应该无法直接读取证书路径。需要将外部文件地址挂载到dockcer内部。此处不做讲解

客户端限制
当我们服务搭建完成后。我们需要做的就是允许合适的用户使用。不合适的用户禁止访问。我们点击设置-客户端设置。在其中添加一个自己的id。点击添加客户端。输入自己的id。或者使用在线的UUID生成器。添加到客户端即可

如何使用
当你的服务设置完成后。可以按照下面的格式来进行访问查询
h3:// xxx.com你的域名 : 443你的端口号 /你在nginx中设置的url地址/你在web页面上设置的客户端ID
注意:我使用的是CF的CDN。里面可以将你的HTTPS服务升级为H3。如果你没有使用CDN。那么请使用HTTPS。
TIPS
CF的CDN代理仅支持下面的几个端口。如果你的服务产生了端口冲突。可以设置其他端口进行代理
Cloudflare支持的HTTP端口:80,8080,8880,2052,2082,2086,2095。
Cloudflare支持的HTTPS端口:443,2053,2083,2087,2096,8443。
评论区