阿里云ECS第一跳-搭建DoH服务的开发实践

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
.cn 域名,1个 12个月
简介: DNS是互联网用户访问的第一跳服务,DoH是一种加密的DNS服务。本文提供了在阿里云ECS上搭建DoH服务的方法和一些别的可能性。

在阿里云ECS上搭建DoH服务的实践

背景概述

DNS,英文全称「Domain Name Server」,中文全称「域名服务器」。这种服务器不像网站使用的服务器以80443端口为用户提供内容,而是将人类易于理解的「域名」转换为机器易于理解的「IP 地址」。DNS使用UDP端口53对外提供服务。DoH它通过RFC 8484指定的经过TLS加密的HTTP连接提供DNS解析,这意味着我们的DNS查询得到了加密保护。(牺牲部分效率置换安全性)

      DNS查询通常是明文的,在意味着你的网站访问记录可以轻易的被网络管理员和ISP获取到。面对日益严峻的行为管理、隐私泄露和恶意劫持,DoH作为一种更安全的DNS查询方式值得被更广泛的使用。

image.png

近期热搜的上网行为管理系统就是使用DNS探测系统。

image.png

图:明文的DNS报文,可直接看到所请求的域名地址。

那么我能不能尝试一下在阿里云ECS上搭建个DoH服务器呢?

当我有这种想法之后便很难罢休,通过查阅网络公开资料也解决了很多疑点,最终成功的完成了在阿里云ECS上搭建Doh的实践。(值得一提的是阿里云的镜像源真的很快。)那么我们就来看看这是怎么完成的吧~

 

正式步骤

(环境Ubuntu系统)

预备所需资源

1.服务器

本次实践推荐使用一台装载Ubuntu镜像的服务器。

如果您可以通过以下渠道来领取免费试用:

  • ECS评测大赛(2022.3.28-2022.4.28)

https://developer.aliyun.com/topic/ecs2022

开发者可领取一个月N4实例,乘风者博主最多可领用一年C5实例。

  • 阿里云试用中心

开发者可以免费使用一个月t5实例 https://ur.alipay.com/JkLbX

  • 阿里云高校计划(适用于高校学生或老师)

最高免费领用2.5个月 https://ur.alipay.com/2od90z

image.png

2.域名

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

 

一、方法一

      i.该方法使用docker

tips:该方法配置便捷,需要您对docker有一定的了解,不了解也没关系,步骤涵盖了几乎所有细节。

     ii.安装docker

sudo apt update   apt-get install docker.io

    iii. 启动docker

service docker start

    iv. 下载创建并初始化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'


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

备注2/etc/dnscrypt-server:/opt/encrypted-dns/etc/keys表示容器内部的路径。 /opt/encrypted-dns/etc/keys映射到/etc/dnscrypt-server/keys

启动服务:docker start dnscrypt-server

     v. 下载创建并初始化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

   vi.验证容器状态:docker ps -a

image.png

  vii. 设置自启动:

docker update --restart=unless-stopped dnscrypt-server              docker update --restart=unless-stopped doh-server

viii.Web客户端和ssl证书参照下文nginx

   ix.检查配置

所有服务启动后我们就得到了Doh服务,请转最后小结部分。

 

 

二、方法二

(0)    项目结构

如何搭建是个问题,那么这里列举一些方案。

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

         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 update

sudo apt -y install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates

Tips

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

sudo add-apt-repository ppa:

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

sudo apt update

sudo apt install

 

(2)   安装Dnscrypt-Proxy

a) 安装和验证

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

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

image.png

我们可以使用志愿者贡献(项目地址:https://launchpad.net/~shevchuk/+archive/ubuntu/dnscrypt-proxy)的PPA来快捷安装和保持程序的最新版本:

sudo add-apt-repository ppa:shevchuk/dnscrypt-proxy

sudo apt install dnscrypt-proxy

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

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

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

b)修改系统DNS配置

i.移除系统DNS配置:apt-get remove resolvconf

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

cp /etc/resolv.conf /etc/resolv.conf.backup

iii.修改原DNS配置文件:vim /etc/resolv.conf

iv.修改为vim /etc/resolv.conf

 v. 最后重启dnscrypt-proxy服务:

sudo systemctl restart dnscrypt-proxy

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

 

(2)安装DNS-over-HTTPs

这是一个基于golong开发的开源DoH服务器程序,它可以接受http请求并执行DNS查询。

我们可以使用deb安装包快捷的安装DNS-over-HTTPs服务器程序:

sudo dpkg -i doh-server_2.0.1_amd64.deb(适用于debian

(在ubuntu里面sudo apt install doh-server_2.0.1_amd64.deb

sudo apt install /root/doh-server_2.0.1_amd64.deb

(文件路径请据实替换)

项目地址:https://github.com/m13253/dns-over-https

DEB文件:https://www.aliyundrive.com/s/svqCftQ2tqw

image.png

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

修改如下图所示:

 image.png

重启服务来应用更改

sudo systemctl restart doh-server

 

(3)安装Nginx

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

     ii.         我们同样使用已编译的PPA程序包来安装:

(项目地址:https://launchpad.net/~ondrej/+archive/ubuntu/nginx

sudo add-apt-repository ppa:ondrej/nginx

sudo apt install nginx-full

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

    iv.     Vim /etc/nginx/sites-available/dns-over-https

     v.         其中server_name字段需要使用您自己的域名,域名是提供DoH服务所必须的。upstream dns-backend就是你需要Nginx转发到的地址,这里就是我们的DOH的监听地址。

    vi.         这是一个示例配置:image.png

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

例如:sudo ln -s /etc/nginx/sites-available/dns-over-https /etc/nginx/sites-enabled/dns-over-https

 viii.         验证并重启sudo nginx -t  sudo systemctl reload nginx

    ix.         我们可以配置nginxssl证书的检查

     x.         vim /etc/nginx/conf.d/stapling.conf,配置如下图,其中resolver变量是DNScrypt的监听地址。

image.png

 

 (4)申请SSL证书

1.   方法一-手动安装

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

b)    image.png

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

d)    image.png

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

f)      image.png

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

h)    image.png

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

j)      重启nginx以应用配置:sudo systemctl reload nginx

 

 

 

2.   方法二-使用插件安装

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

      i. 使用PPA安装certbotsudo add-apt-repository ppa:certbot/certbot

image.png

sudo apt install python3-certbot-nginx  #成功

image.png

 

     ii. 为你的域名申请证书:sudo certbot --nginx -d dns.example.com  #注意替换,根据提示输入Agree即可下一步。

image.png

 

image.png

 

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

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

     v.重启nginx以应用配置:sudo systemctl reload nginx

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

 

三、小结part.1-DOH的使用方法

RFC8484中指定使用/dns-query路径作为默认查询路径,所以本次实践配置的DoH服务器地址长这样https://dns.example.com/dns-query

      在客户端方面,火狐、谷歌等浏览器均已支持DoH,其中谷歌浏览器中的配置路径为:设置-安全和隐私设置-高级-使用安全DNS

image.png

诚挚推荐阿里云的公共DoH服务,地址是https://dns.alidns.com/dns-query你可以在浏览器中将安全DNS自定义为阿里云的公共DoH。

四、小结part.2-One More Thing

当然,由于政策性原因,我们在中国境内搭建的Doh服务器需要取得经营性备案才可向公网提供服务,但这并不影响通过本次实践去学习和体验过程的乐趣。(ps:在ECS上搭建Web服务也需要备案—不过与经营性备案差异很大—阿里云网站备案通常两三天就可以通过审核)


另外,虽然暂时不能在公网去使用我们搭建的Doh服务,但这完全不影响我们在阿里云无影云电脑上使用我们的使用我们的自建Doh服务,步骤如下:

  • 在云企业网控制台创建云企业网,使用专有网络VPC(Virtual Private Cloud)实例实现云上资源互通。我们使用地域内连接和非企业级路由器不产生带宽和转发费用。
  • 在无影云桌面控制台创建加入了云企业网的工作区,购买或迁移云桌面到刚创建的可用区。
  • 在ECS控制台新建安全组、弹性网卡并绑定到ECS实例。(交换机、弹性网卡需要在同可用区内使用,不可跨区使用。可以在VPC内创建多个可用区的虚拟交换机)
  • 测试连通性。另外,增加一些操作,我们可以在未开通互联网的访问的阿里云无影云桌面上使用同属一内网的ECS公网资源来上网,且听下回分解。


阿里的镜像源在本次实践中起了很大的作用,如果在购买阿里云ECS的时候选择使用阿里云ECS官方镜像,那么系统已默认设置为阿里源,开箱即用,镜像可用性更高。


阿里云ECS可以实现多种应用比如Web、小程序、游戏、放上你的毕业设计甚至是作为基础设施的Doh(就是本文)。阿里云通过数字化转型使我们能够为不确定的未来增添更多可能性和确定性。结合强大的平台生态和丰富能力,我们可以在阿里云上激发数字创新的无限可能。

而ECS正是数字化时代的幕后英雄。

感谢你的耐心阅读。

 

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
弹性计算 监控 负载均衡
|
2天前
|
弹性计算 人工智能 数据安全/隐私保护
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
本文详细介绍如何利用阿里云ECS免费搭建私有Overleaf论文写作服务,包括ECS服务器的部署、Overleaf服务的安装、TexLive包的更新、XeLaTeX修复、中文字体支持及账号管理等步骤。通过这些操作,你可以实现免费且高效的多人协作论文写作,避免付费版本的高昂费用。适合需要频繁合作撰写论文的团队使用。
22 1
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
|
4天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
37 9
|
1天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
4天前
|
弹性计算 异构计算
2024年阿里云GPU服务器多少钱1小时?亲测价格查询方法
2024年阿里云GPU服务器每小时收费因实例规格不同而异。可通过阿里云GPU服务器页面选择“按量付费”查看具体价格。例如,NVIDIA A100的gn7e实例为34.742元/小时,NVIDIA A10的gn7i实例为12.710156元/小时。更多详情请访问阿里云官网。
34 2
|
8天前
|
Linux 数据库
Linux服务如何实现服务器重启后的服务延迟自启动?
【10月更文挑战第25天】Linux服务如何实现服务器重启后的服务延迟自启动?
43 3
|
9天前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
10天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
40 3
|
1天前
|
弹性计算
阿里云2核16G云服务器多少钱?亲测ECS内存型r8i租赁价格
阿里云2核16G云服务器,内存型r8i实例1年6折优惠后价格为1901元,月付334.19元,按小时计费0.696221元。更多配置及优惠详情,请访问阿里云ECS页面。
|
5天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置选项,包括CPU+GPU、CPU+FPGA等组合,支持高性能计算需求。本文汇总了阿里云GPU服务器的价格信息,涵盖NVIDIA A10、V100、T4、P4、P100等多款GPU卡,适用于人工智能、机器学习和深度学习等场景。详细价格表和实例规格见文内图表。