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解析之类的,有需求的可以自己折腾着看看。
可以直接用lala的吗?
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反代到那个监听端口就好
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
还有评论的参数被转译了,有两个-
再补充个systemd自启动,放到分享板上了
https://angry.im/paste/EoUZsxl
可以直接搞到非443端口吗,省去nginx这一步,俺用的xray,443被它占了,要是用nginx,xtls就失效了
可以的,dnsproxy直接监听0.0.0.0就行了。
发现个更简单的方法,适用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可以省了
这思路不错,建议马上给作者提个issue,哈哈
DOH 客户端 macOS 怎么办?
如果我有一个域名对应多个目的IP, 怎样通过DNSPROXY,根据访问端的IP进行灵活的指向?
请教一下博主,有的dns客户端要填写EDNS Client Subnet,这里要写什么啊?