我们都知道,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.域名准备
建议使用阿里云万网购买域名,优势是可以获得免费的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存储库后,更新程序包列表并从存储库安装新程序包:
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证书
方法一:手动安装
如果你购买的是阿里云的域名,那么我们可以选择手动安装,优点是有效期时间长达一年,缺点是比较麻烦。参考:阿里云SSL证书产品

进入控制台-数字证书管理服务

购买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服务。

阿里云采购季,天天有惊喜;点击我要上云,抓住机会拥有一台属于自己的云服务器吧·

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

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

    本文来自于云服务器ECS征文活动投稿,已获得作者(昵称绍羽)授权发布. 我们都知道,DNS服务器(Domain Name Server)可以将人类易于理解的域名(就是平时说的网址)转换为机器易于理解的 ...

  2. 阿里云 ECS 7 天实践训练营 - day01 -基于ECS搭建FTP服务

    前段时间无意间看到了阿里云7天实践ECS训练营的活动,因为我本身自己也已经使用了两年的阿里云学生机,但是全凭自己的喜好来的,没有经过一个系统的训练,这次看到这个活动,便马上参加了,所以特在此记录每天的 ...

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

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

  4. 《Linux C/C++服务器开发实践》简介

    #好书推荐##好书奇遇季#Linux网络服务器编程入门书<Linux C/C++服务器开发实践>,京东当当天猫都有发售.416页厚书,定价99元,打折一下更便宜. 本书从五大服务器编程基础 ...

  5. 服务器迁移实践,物理服务器迁移到阿里云服务器

    1.迁移需求分析 在当前市场环境下,使用物理服务器来部署单体应用还存在于传统的行业,使用物理服务器会增加IT资源的管理难度,而且在资源使用上也会产生资源浪费,其实目前大家可能最常使用的方式就是在物理服 ...

  6. 微软Windows Azure云应用开发实践

    2009年10月27日,微软首席架构师Ray Ozzie在洛杉矶的开发者大会(PDC)上宣布了Azure Services Platform平台,2010年1月Windows Azure正式发布,20 ...

  7. 【华为云实战开发】13.如何在云端快速搭建python网站

    1 概述 1.1 文章目的 本文主要想为研发Python项目的企业或个人提供上云指导,通过本文中的示例项目 "AI物体检测",为开发者提供包括项目管理,代码托管,代码检查,编译构建 ...

  8. 小程序资源服务器,开发小程序没有服务器资源

    开发小程序没有服务器资源 内容精选 换一换 在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制, ...

  9. python视频免费百度云-Python开发视频百度云分享

    原标题:Python开发视频百度云分享 Python有很好的3D渲染库和游戏开发框架,有很多使用Python开发的游戏,如迪斯尼卡通城.黑暗之刃.常用PyGame.Pykyra等和一个PyWeek的比 ...

最新文章

  1. 2021年4月22日 阿里供应链Java开发实习面试(三面)(含总结)
  2. JavaScript中Exists函数
  3. python获取url文件名_python httplib / urllib获取文件名
  4. 【一步一步学习spring】spring入门
  5. win7怎么进入安全模式_windows 10如何进入安全模式
  6. Springboot 中的header, cookie, session
  7. java 安全发布对象_Java安全的发布对象
  8. TFS数据服务器启动优化
  9. Android StrictMode类使用实例
  10. python 空白行_python去掉空白行的多种实现代码
  11. 承接家谱制作-多少代都可以
  12. 在250美元5天城市
  13. [1095]Appium使用wifi连接多台手机
  14. javaCV简单解析gb28181的rtp ps流,并推流到rtmp服务
  15. 全功能DB数据库管理工具,超赞,完全支持所有主流数据库
  16. keepass2android坚果云,Keepass+坚果云:多平台密码无缝同步(补)
  17. 基于STM32G031的失真度测试仪(CubeMX+ADC+DMA+OLED+EC11)
  18. 主修英语选修计算机,人教版高中英语选修计算机英语TheSystemUnit.ppt
  19. 论述计算机网络前沿技术,介绍一些计算机网络前沿应用技术
  20. 数据库第三章习题_完整版

热门文章

  1. windows服务器安全设置怎样操作,要注意什么?
  2. java输入月份获得该年的这个月最后一个工作日是多少号(星期一到星期五)
  3. Axure旋转与移动效果
  4. c#中计算三角形面积公式_c语言如何求三角形的面积
  5. 什么耳机适合跑步、分享五款公认最好的跑步耳机
  6. 删除Mac中的Windows启动项
  7. 小程序·云开发实战:SCRM社交化客户管理小程序
  8. 论文图片格式要求具体有哪些?
  9. python如何创建一个文件夹_利用Python怎么创建一个文件夹
  10. 驱动程序如何手动卸载与更新