本文来自于云服务器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实例:阿里云试用中心_云服务器试用_企业试用场景_开发者云产品试用

如果您是高校学生或老师,可以使用高校计划可以免费领用2.5个月:高校学生免费算力 - 飞天加速计划

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 update
sudo 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 update
sudo 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-proxy
sudo 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月,天天有惊喜;点击我要上云,抓住机会拥有一台属于自己的云服务器吧·

使用云服务器ECS搭建DoH服务的开发实践相关推荐

  1. 阿里云服务器开发实践:使用云服务器ECS搭建DoH服务

    我们都知道,DNS服务器(Domain Name Server)可以将人类易于理解的域名(就是平时说的网址)转换为机器易于理解的「IP 地址」,它使用UDP端口53对外提供服务.通常,DNS查询是明文 ...

  2. 【华为云技术分享】华为云弹性云服务器ECS搭建FTP服务实践

    摘要:在使用华为弹性云服务器ECS搭建FTP服务的时候,经常会遇到搭建完成后无法访问的问题.本篇通过演示windows IIS搭建FTP方法,讲解ftp主动模式.被动模式原理来说明无法访问的原因及解决 ...

  3. 如何在阿里云服务器上搭建mysql服务(最新版)

    如何在阿里云服务器上搭建mysql服务(最新版) 准备 安装mysql服务 配置YUM源 启动mysql服务 修改root密码 修改密码策略 添加远程登录用户 注意: 1.关闭防火墙 2.在阿里云服务 ...

  4. 阿里云服务器ECS搭建网站完整方法教程

    阿里云服务器怎么使用?下面主机教程网来说一下阿里云服务器ECS搭建网站完整方法教程. 一.购买阿里云服务器 1.地域.机型.镜像.公网带宽.购买时长等配置都是根据自己的需求进行选择的,不同的配置相应的 ...

  5. 阿里云服务器ECS+安心备案服务套餐:低至156.12元

    阿里云服务器ECS+安心备案服务套餐:低至156.12元 现在阿里云服务器的价格越来越便宜了,不过对于初次购买阿里云服务器的用户来说,备案流程是否麻烦,能否成功备案下来是很多用户所关心的,对于有这种担 ...

  6. 阿里云服务器ECS搭建后台(Windows Server 2012R2)

    引言与名词 云服务器 阿里云ECS Windows Server 厂商选择 一.领取阿里云服务器ECS 二.连接阿里云服务器ECS 三.搭建项目运行环境 四.发布项目到云服务器 五.隐藏8080端口号 ...

  7. 阿里云服务器ECS 搭建网站

    目录 文章简介 构建网站流程 域名注册 云服务的选择 网站搭建 1)安装 apache 2)配置apache 域名解析设置 HTTPS 证书配置 免费证书购买申请 证书下载和安装 总结 文章简介 本栏 ...

  8. 在阿里云服务器上搭建 SVN 服务端

    一.SVN 服务端搭建流程 1.安装 svn apt-get install subversion // 方式二:yum install subversion ps:查看版本 svnserve --v ...

  9. 云服务器ecs搭建环境,ECS云服务器linux下搭建开发环境

    买回来的云服务器,当然要装好开发环境 linux下常用的就是LAMP或者LNMP,这里给大家介绍和实际演示LAMP环境的搭建 1.连接ECS服务器 终端输入 ssh root@你的IP地址 回出现ye ...

最新文章

  1. 微软中国CTO:不思进取、放弃基本技能的程序员在34.9岁会被淘汰!
  2. cortex m3 gcc项目_广东省住建厅党组书记赵坤到公司陆丰市污水PPP项目实地调研...
  3. 【JavaSE01】初识Java-思维导图
  4. blockhouses
  5. 计算机应用板块还有行情吗,今日股市行情资金收评:计算机应用板块资金流出居前...
  6. java.lang.ClassNotFoundException: com.sap.exception.GlobalDefaultExceptionHandler
  7. Fiori Launchpad Tile点击后跳转的调试技巧
  8. 查找nginx安装的路径
  9. 我崩溃了!Java大厂74道高级面试合集,面试心得体会
  10. j2ee课程设计—基于activiti的请休假系统
  11. 华为p4支持鸿蒙功能吗_只要华为鸿蒙系统能支持三个APP,我就愿意支持!
  12. npm --save-dev 和 --save的区别
  13. 【软件工程】概念模型、逻辑模型、物理模型
  14. 如何将一个压缩包在不解压的情况下,进行分卷
  15. android开发指纹解锁,Android-指纹解锁技术
  16. DPDK:UDP 协议栈的实现
  17. sql教程学习(一)
  18. 计算通过率逾期率并绘制通过率逾期率曲线
  19. 架构师之路,2020半年精选!!!
  20. 淘宝商城开放的B2C平台战略

热门文章

  1. Qt Quick Dialogs
  2. 万字详文告诉你如何做 Code Review!
  3. 凸显文化+科技融合创新,第九届漫博会VR AR技术应用强势来袭
  4. 【b503】篝火晚会
  5. 离职后五险一金怎么办
  6. 办公软件excel表格_国产表格神器:超脱excel,画表只是基本功能,做软件才是真本事...
  7. js获取最近12个月
  8. java 文字串叠字检查_正则表达式的相关应用
  9. 手机如何测光照度_照度测定方法
  10. Matlab 批量保存图片