静看光阴荏苒
不管不顾不问不说也不念

使用DNSProxy搭建一个支持EDNS的DoH服务器

DNSProxy是AdguardTeam开发的一个简单的DNS代理服务器,它支持目前所有的DNS协议。包括DoT/DoH/DNSCrypt等。最最最重要的是还支持EDNS(ECS)。

我最近一直在找一个可以支持EDNS的DoH解决方案,试过很多开源的程序,比如DNSDist/Unbound之类的,但是无一例外要么是支持的不够完善,要么是配置起来太复杂了。。

我知道AdguardTeam这个开发团队其实本身就有一个项目是支持EDNS的:AdGuardHome。但是这个程序跑起来比较重,有很多我不需要用到的功能。

就在我纠结的时候,突然发现AdguardTeam还有一个DNSProxy的项目,这个就非常好了,有所有我需要用到的功能,而且配置起来非常简单,这里就给大家推荐一下吧。

咱毕竟懂的也不多,关于EDNS具体是个啥原理,我也不能随便乱说,如果你想了解这块的话可以看看维基百科或者Google:

https://en.wikipedia.org/wiki/EDNS_Client_Subnet

只是从个人使用体验来说的话,有EDNS支持的话,你访问国内的一些网站就不会慢了,比如B站/163/QQ/斗鱼直播这些。可以省去做国内外分DNS解析的步骤。

目前个人使用感觉良好,废话就不多说了,下面是搭建步骤。

首先装一下需要用到的工具:

apt -y update
apt -y install wget nginx python-certbot-nginx supervisor

设置nginx/supervisor开机自启:

systemctl enable --now nginx supervisor

下载解压dnsproxy的预编译文件:

cd /opt
wget https://github.com/AdguardTeam/dnsproxy/releases/download/v0.33.8/dnsproxy-linux-amd64-v0.33.8.tar.gz
tar -xzvf dnsproxy-linux-amd64-v0.33.8.tar.gz
mv linux-amd64 dnsproxy

其实dnsproxy可以直接拿来用,把它监听在443端口就行了,但是我机器上面还要做站或者搞点其他的东西,所以这里我选择用nginx反代dnsproxy的服务。

这里先新建一个nginx站点配置文件:

nano /etc/nginx/conf.d/dnsproxy.conf

写入如下配置:

server {
   listen 80;
   server_name dns.imlala.best; # 换成你的域名
   client_max_body_size 0;

location /dns-query {
   proxy_pass         https://127.0.0.1:10443; # 后续dnsproxy监听的端口号
   proxy_set_header X-Real-IP $remote_addr; # 传递客户端的真实ip到dnsproxy,否则dnsproxy的edns功能不能用
   }
}

然后用certbot签发一个ssl证书:

certbot --nginx

之后你需要重新编辑这个站点配置文件:

nano /etc/nginx/conf.d/dnsproxy.conf

在如下行加上http2的配置:

listen 443 ssl http2; # managed by Certbot

重载nginx使其生效:

systemctl reload nginx

现在新建supervisor配置文件:

nano /etc/supervisor/conf.d/dnsproxy.conf

写入如下配置:

[program:dnsproxy]
priority=1
command=/opt/dnsproxy/dnsproxy -l 127.0.0.1 --https-port=10443 --tls-crt=/etc/letsencrypt/live/dns.imlala.best/fullchain.pem --tls-key=/etc/letsencrypt/live/dns.imlala.best/privkey.pem -u https://dns.google/dns-query -f 8.8.8.8:53 -f 8.8.4.4:53 --cache --edns -p 0
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/dnsproxy.log

之前已经用certbot申请好了证书,所以你只需要把上面的证书和私钥换成你自己的就可以了,其他的配置都不需要改动。

现在启动dnsproxy就大功告成啦:

supervisorctl update

经过上面的步骤后,你的DoH服务地址就是:

https://dns.imlala.best/dns-query

接下来我们需要在电脑上装支持DoH的客户端,这里推荐一个YogaDNS:

https://yogadns.com/

安装之后,初次运行选这个:

选择DNS Servers:

点击Add添加DNS服务器:

按下图的格式来填写:

配置好了后最好点击旁边的Check检测一下,如果显示绿色那就是没有问题。

接着点击Rules:

在这里选择你的DNS服务器:

开始享受无污染的DNS服务吧~

其实这个YogaDNS还支持很多高级功能,比如按照域名来分DNS解析之类的,有需求的可以自己折腾着看看。

赞(9)
未经允许不得转载:荒岛 » 使用DNSProxy搭建一个支持EDNS的DoH服务器
分享到: 更多 (0)

评论 13

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    可以直接用lala的吗?

    hofaeair3年前 (2021-01-24) Google Chrome 88.0.4324.96 Google Chrome 88.0.4324.96 Windows 10 x64 Edition Windows 10 x64 Edition回复
  2. #2

    lala你那个参数感觉不太好~
    一个是两次https解密了,nginx配置一次就好,还有用了edns的话如果不用-edns-addr参数就浪费了,我觉得比较合理的启动参数应该是
    command=/opt/dnsproxy/dnsproxy -l 127.0.0.1 -p [监听端口] -u https://dns.google/dns-query -f 8.8.8.8:53 -f 8.8.4.4:53 –cache –edns –edns-addr=[伪造一个离你较近的ip]
    然后nginx反代到那个监听端口就好

    BobMaster3年前 (2021-01-25) Firefox 84.0 Firefox 84.0 GNU/Linux x64 GNU/Linux x64回复
    • lala不好意思,我没有实际操作过,现在尝试了下上面那样不行,还是得套两层,或者干脆换个端口不绑定443. 对于自建的话且自用,可以考虑加个–edns-addr=参数伪造个ip,如果用的人在其他地区可能就会有一定影响了
      不得不说edns还是个好东西,现在cdn回源终于特么的正常了。。。最后我改用下面的参数
      nohup ./dnsproxy -l 127.0.0.1 -p 0 –https-port=1234 –tls-port=853 –tls-crt=你的公钥 –tls-key=你的私钥 -u https://1.1.1.1/dns-query -f 1.1.1.1:53 -f 1.0.0.1:53 –cache –edns

      BobMaster3年前 (2021-01-25) Firefox 84.0 Firefox 84.0 GNU/Linux x64 GNU/Linux x64回复
  3. #3

    可以直接搞到非443端口吗,省去nginx这一步,俺用的xray,443被它占了,要是用nginx,xtls就失效了

    MiaoSKY3年前 (2021-03-23) Google Chrome 89.0.4389.90 Google Chrome 89.0.4389.90 Android 10 Android 10回复
    • 可以的,dnsproxy直接监听0.0.0.0就行了。

      LALA3年前 (2021-03-28) Google Chrome 88.0.4324.150 Google Chrome 88.0.4324.150 Windows 10 x64 Edition Windows 10 x64 Edition回复
  4. #4

    发现个更简单的方法,适用Win,搞个SocksCap,把DNSProxy扔SocksCap里走Socks通道,Socks接任意出墙软件.
    然后启动命令直接:-l 127.0.0.1 -p 53 -u https://dns.google/dns-query –cache –edns –edns-addr=附近网关
    不知道作者以后会不会添加Socks和Http代理模式,如果添加的话SocksCap可以省了 :mrgreen: :mrgreen: :mrgreen:

    MiaoSKY3年前 (2021-03-23) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 这思路不错,建议马上给作者提个issue,哈哈 :razz:

      LALA3年前 (2021-03-28) Google Chrome 88.0.4324.150 Google Chrome 88.0.4324.150 Windows 10 x64 Edition Windows 10 x64 Edition回复
  5. #5

    DOH 客户端 macOS 怎么办?

    米开朗基杨3年前 (2021-07-17) Firefox 90.0 Firefox 90.0 Mac OS X  10.15 Mac OS X 10.15回复
  6. #6

    如果我有一个域名对应多个目的IP, 怎样通过DNSPROXY,根据访问端的IP进行灵活的指向?

    cctv3年前 (2021-07-29) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复
  7. #7

    请教一下博主,有的dns客户端要填写EDNS Client Subnet,这里要写什么啊? :grin:

    chancat2年前 (2022-09-04) Google Chrome 104.0.0.0 Google Chrome 104.0.0.0 Android 11 Android 11回复

分享创造快乐

广告合作资源投稿