写点什么

使用云服务器 ECS 搭建 DoH 服务的开发实践

  • 2022 年 3 月 23 日
  • 本文字数:3979 字

    阅读完需:约 13 分钟

使用云服务器ECS搭建DoH服务的开发实践

本文来自于云服务器 ECS 征文活动投稿,已获得作者(昵称绍羽)授权发布。


我们都知道,DNS 服务器(Domain Name Server)可以将人类易于理解的域名(就是平时说的网址)转换为机器易于理解的「IP 地址」,它使用 UDP 端口 53 对外提供服务。通常,DNS 查询是明文的,这意味着你的网站访问记录可以轻易被网络管理员和 ISP 获取到。


面对日益严峻的行为管理、隐私泄露和恶意劫持,DoH 作为一种更安全的 DNS 查询方式正在被更广泛使用。它通过 RFC 8484 指定的经过 TLS 加密的 HTTP 连接提供 DNS 解析,这意味着我们的 DNS 查询得到了加密保护。


那么我能不能尝试一下在公网搭建一个 DoH 服务器呢?


当我有这种想法之后便开始行动,通过查阅网络公开资料也解决了很多疑点,最终,借助阿里云的 ECS(镜像源真的很快,推荐),成功地完成了搭建 Doh 服务器的实践。


接下来,跟着我一起看看是怎样完成搭建的吧~


01 资源准备:云服务器+域名


1.云服务器

本次实践推荐使用一台装载 Ubuntu 镜像的云服务器,在阿里云的试用中心可以免费使用一个月 t5 实例:https://free.aliyun.com/



如果您是高校学生或老师,可以使用高校计划可以免费领用 2.5 个月:https://developer.aliyun.com/plan/student



2.域名准备

建议使用阿里云万网购买域名,优势是可以获得免费的 SSL 证书。


02  便捷搭建方案

如果只是想便捷配置可以参考下面的步骤:


1、安装 docker


apt-get install docker.io
复制代码

2、启动 docker


service docker start
复制代码

3、下载创建并初始化 Dnscrypt 容器


docker run --name=dnscrypt-server -p 443:443/udp -p 443:443/tcp \--restart=unless-stopped \-v /etc/dnscrypt-server/keys:/opt/encrypted-dns/etc/keys \jedisct1/dnscrypt-server init -N example.com -E '192.168.1.1:443'
复制代码

说明

①:example.com 替换为您的域名,192.168.1.1:443 替换为 ECS 公网 IP,可以指定多个逗号分隔的 IP 和端口,如 -E'192.168.1.1:443,[2001:0db8::412f]:443'. -v


②:/etc/dnscrypt-server:/opt/encrypted-dns/etc/keys 表示容器内部的路径。

/opt/encrypted-dns/etc/keys 映射到 /etc/dnscrypt-server/keys。

启动服务命令:docker start dnscrypt-server

4、下载创建并初始化 Doh-server 容器


docker run -d --restart unless-stopped --network host --name doh-server \  -e UPSTREAM_DNS_SERVER="udp:127.0.2.1:53" \  -e DOH_HTTP_PREFIX="/dns-query" \  -e DOH_SERVER_LISTEN="127.0.0.1:8053" \  -e DOH_SERVER_TIMEOUT="10" \  -e DOH_SERVER_TRIES="3" \  -e DOH_SERVER_VERBOSE="true" \  satishweb/doh-server
复制代码

5、 验证容器状态


docker ps -a
复制代码



6、设置自启动


docker update --restart=unless-stopped dnscrypt-server   docker update --restart=unless-stopped doh-server
复制代码

7、Web 客户端和 ssl 证书参照下文 nginx

8、检查配置-所有服务启动,我们就得到了 Doh 服务,请转最后小结部分。


03  进阶搭建教程


如何搭建是个问题,那么这里列举 3 种方案与思路。

i. nginx + doh-server + dnscrypt(本文使用)



ii.  nginx + doh-server + Bind(备选方案)

iii. nginx + doh-server + CoreDNS(云原生方案)


1、安装 software-properties-common 软件包

这是一个预备操作。我使用的是阿里云官方提供的 Ubuntu  20.04 64 位系统,其缺少 add-apt-repository 命令,需要在系统终端中运行以下命令来安装 software-properties-common 软件包:


sudo apt updatesudo apt -y install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates
复制代码

Tips

可以使用以下命令添加 PPA 存储库:


sudo add-apt-repository ppa:<PPA Name>
复制代码

添加 PPA 存储库后,更新程序包列表并从存储库安装新程序包:


sudo apt updatesudo apt install
复制代码


2、安装 Dnscrypt-Proxy


a) 安装和验证

Dnscrypt-Proxy 是具备很多现代化功能的 DNS 代理服务器程序,其支持 DNSCrypt v2(身份认证), DNS-over-HTTPS【RFC8484,DNS Queries over HTTPS (DoH)】等功能。


由于 Dnscrypt-Proxy 使用 golang 开发,所以其不支持在 CentOS5 及之前的 Linux 发行版上安装。Dnscrypt-Proxy 需要占用 53 端口,所以安装前可以先查看一下 53 端口使用情况,命令:


ss -lp 'sport = :domain'
复制代码



我们可以使用志愿者贡献的 PPA 来快捷安装和保持程序的最新版本:


sudo add-apt-repository ppa:shevchuk/dnscrypt-proxysudo apt install dnscrypt-proxy
复制代码

安装后,Dnscrypt-Proxy 服务将在服务器上自动启动。 

 

程序会被安装到/etc/dnscrypt-proxy 文件夹,dnscrypt-proxy 的监听地址通常为(V:2.1.0~ppa6):127.0.0.53:53,我们可以使用 dig 命令查看一下。


其配置文件/etc/dnscrypt-proxy/dnscrypt-proxy.toml 文件的 server_names 字段要求你设置一个或多个你喜欢的服务器即可,第一个请求失败会自动向第二个服务器请求。例如:server_names = ['alidns-doh']我们这里不做更改,根据服务器所在可用区的不同,我们可能会修改这里的参数。


b)  修改系统 DNS 配置

移除系统 DNS 配置命令:


apt-get remove resolvconf
复制代码

为系统 DNS 配置文件设置备份:


cp /etc/resolv.conf /etc/resolv.conf.backup
复制代码

修改原 DNS 配置文件:


vim /etc/resolv.conf
复制代码

修改为 nameserver 127.0.0.53  options edns0

最后重启 dnscrypt-proxy 服务:


sudo systemctl restart dnscrypt-proxy
复制代码

说明:系统 Systemd 服务使用的默认套接字库地址为 127.0.2.1:53


3、安装 DNS-over-HTTPs

这是一个基于 golong 开发的开源 DoH 服务器程序,它可以接受 http 请求并执行 DNS 查询。我们可以使用 deb 安装包快捷的安装 DNS-over-HTTPs 服务器程序:


如果使用 debian,则命令为:


sudo dpkg -i doh-server_2.0.1_amd64.deb
复制代码

在 ubuntu 里面,命令为:


sudo apt install doh-server_2.0.1_amd64.deb
复制代码


sudo apt install /root/doh-server_2.0.1_amd64.deb
复制代码

注意:以上文件路径请据实替换



Tips:如果你在安装 deb 软件包的过程中得到一个依赖项的错误,你可以使用下面的命令来修复依赖项的问题:


sudo apt install -f
复制代码

安装好的 DoH 服务器程序的配置文件在路径/etc/dns-over-https/doh-server.conf。为了设置反向解析,我们修改其 upstream 字段(上游 DNS 解析),将其修改为上面提到的 dnscrypt-proxy 的监听地址;dnscrypt-proxy 监听字段可以在/etc/dnscrypt-proxy/dnscrypt-proxy.toml 文件里修改。这样 DoH 程序就会使用 Dnscrypt-proxy 来执行 DNS 请求。


修改代码:


vim /etc/dns-over-https/doh-server.conf
复制代码

修改如下图所示:



重启服务进行应用更改:


sudo systemctl restart doh-server
复制代码


4、安装 Nginx

Nginx 是一款高性能的反向代理服务器程序,在这里它负责接受客户端 HTTPS DNS 请求,然后作为反向代理解码来自客户端的 HTTPS 请求并向 DoH 服务器程序发送 DoH 请求。它是与客户端交流的门户,我们还会为它配置一个 SSL 证书以便于验证 HTTPS 请求。


我使用的是“Ondřej Surý”提供的相关版本,在百度中搜索此关键词,然后进入网页下载对应的安装包就好。以下为安装命令:


sudo add-apt-repository ppa:ondrej/nginx  sudo apt install nginx-full
复制代码

Nginx 被安装在/etc/nginx 目录下,我们需要编辑配置文件。


Vim /etc/nginx/sites-available/dns-over-https
复制代码

其中 server_name 字段需要使用您自己的域名,域名是提供 DoH 服务所必需的。upstream dns-backend 就是你需要 Nginx 转发到的地址,这里就是我们的 DOH 的监听地址。以下为一个示例配置:



完成后我们需要把配置文件放到/etc/nginx/sites-available/dns-over-https


sudo ln -s /etc/nginx/sites-available/dns-over-https /etc/nginx/sites-enabled/dns-over-https
复制代码

验证并重启:


sudo nginx -t  sudo systemctl reload nginx
复制代码

我们可以配置 nginx 对 ssl 证书的检查:


vim /etc/nginx/conf.d/stapling.conf
复制代码

配置如下图,其中 resolver 变量是 DNScrypt 的监听地址。



5、申请 SSL 证书


方法一:手动安装

如果你购买的是阿里云的域名,那么我们可以选择手动安装,优点是有效期时间长达一年,缺点是比较麻烦。



进入控制台-数字证书管理服务https://yundun.console.aliyun.com/



购买 DV 单域名证书包后可以点击创建证书,填写申请并验证即可。



购买成功后我们可以下载证书并部署到服务器上。通过 ftp 或其他方式将证书上传到服务器目录内,修改 nginx 配置文件以应用更改。示例配置如下:



使用 nginx -t 命令可测试配置是否正确。

重启 nginx 进行应用配置:


sudo systemctl reload nginx
复制代码


方法二:使用插件安装

Certbot 是一个免费的开源申请 SSL 证书的工具,用于在手动管理的网站上自动部署免费的 Let's Encrypt 证书以启用 HTTPS。在 nginx 服务器上使用 Certbot 来配置证书是很棒的选择。优点是比较方便,缺点是有效期短。


使用 PPA 安装 certbot:


sudo add-apt-repository ppa:certbot/certbot
复制代码


sudo apt install python3-certbot-nginx
复制代码



成功后的截图如下:



为你的域名申请证书,注意替换,根据提示输入 Agree 即可下一步:


sudo certbot --nginx -d dns.example.com
复制代码



下一步我们选择 2 以便把 HTTP 流量转发到 HTTPS,如果选择 1 则表示不转发。(如下图所示)



该插件配置文件地址为 vim /etc/letsencrypt/options-ssl-nginx.conf



重启 nginx 进行应用配置:


sudo systemctl reload nginx
复制代码

由于 Let’s Encrypt 颁发的证书的有效期只有 90 天,我们可以使用 certbot renew 命令来更新证书。


04 DOH 的使用方法小结


RFC8484 中指定使用/dns-query 路径作为默认查询路径。在客户端方面,火狐、谷歌等浏览器均已支持 DoH,其中谷歌浏览器中的配置路径为:设置-安全和隐私设置-高级-使用安全 DNS:



当然,由于政策性原因,我们在中国境内搭建的 Doh 服务器并不能在没有经营性备案的情况下向公网提供服务,所以本次实践的意义在于学习和动手实践的乐趣。


另外,由于提供 DNS 服务有快速和准确等要求,所以个人搭建的服务器并不是最优选择;若有需求,可以试一下阿里云的公共 DoH 服务。


官方活动时间:阿里云采购季还剩最后 10 天了,整个 3 月,天天有惊喜;点击我要上云,抓住机会拥有一台属于自己的云服务器吧·

发布于: 刚刚阅读数: 2
用户头像

澎湃算力,无处不在。 2018.08.24 加入

阿里云弹性计算团队,关注虚拟化、通用计算、异构计算以及云上HPC和云上运维CloudOps。

评论

发布
暂无评论
使用云服务器ECS搭建DoH服务的开发实践_征文投稿_阿里云弹性计算_InfoQ写作平台