DNS over HTTPS(DoH)(TCP 443).note

noteId: WEB731986f7cbf0beaf3d30ade9dadd9bdf · 原始路径:/ALL/Linux - A模块/服务配置/DNS/dns over 加密(DoT、DoH)/DNS over HTTPS(DoH)(TCP 443).note · 图片:28 · 附件待处理:0

 
 
一、配置 DNS over HTTP(DoH):
 
1、生成证书:
/usr/lib/ssl/misc/CA.pl -newca
/usr/lib/ssl/misc/CA.pl -newreq-nodes
/usr/lib/ssl/misc/CA.pl -sign
 
 
2、配置 DoH:
 
·方式一:使用 bind9 直接配置 DoH:
 
(1)配置 bind9:
先正常配置好 DNS区域和解析
 
注意,证书最好放在 /etc/bind 路径,如果要放到其他路径,需要修改 apparmor
# 配置 tls 调用 和 http endpoint:
vim /etc/bind/named.conf
 
vim /etc/bind/named.conf.options
# 注意地址这里不能监听 0.0.0.0,否则端口无法起来
systemctl restart bind9
 
 
 
·方式二:使用dnsdist作为DoH服务器:
DNS 服务器和 dnsdist 在同一台机器
 
(1)配置后端DNS(bind9):
配置DNS仅允许本地(127.0.0.1)进行访问
vim /etc/bind/named.conf.options
## 一般都会要求修改dns端口为 5300
systemctl restart bind9
 
测试:
 
 
 
(2)配置 dnsdist:
# DoH 要有读取私钥的权限:
chmod 660 /etc/ssl/ssl.key
chown root:_dnsdist /etc/ssl/ssl.key
 
apt install -y dnsdist
cd /etc/dnsdist
cp /usr/share/doc/dnsdist/examples/dnsdist.conf .
vim dnsdist.conf
# 注意:checkName、checkType 必须区分大小写
systemctl restart dnsdist
 
 
·本地测试:
apt install -y knot-dnsutils
 
 
可选配置(自定义 URI):
如果不配置,默认就是 /dns-query
定义的这个就是需要访问的 URI路径:https://.../dns-query
 
3、配置客户端:
因为配置了 DoH,并且DNS服务器只监听127.0.0.1之后,已经无法直接访问了
 
vim /etc/hosts
 
·方式一:配置 dnsdist监听udp 53端口进行转发:
apt install -y dnsdist dnsutils knot-dnsutils
cd /etc/dnsdist
cp /usr/share/doc/dnsdist/examples/dnsdist.conf .
vim dnsdist.conf
 
vim /etc/resolv.conf
 
 
·测试解析:
 
 
 
·方式二:(比较复杂,且服务比较旧)配置 dnscrypt-proxy 监听udp 53端口进行转发:
需要满足以下几个条件:
1、连接地址必须用python生成 base64编码再放进配置文件中
2、配置文件中不能定义地址、端口监听,否则服务无法启动,监听地址、端口需要在 同名.socket 中修改,默认监听 127.0.2.1:53
3、必须要能够解析到 example.com 地址,并且还不能返回权威应答,必须得返回非权威应答,否则就不会工作
 
apt install -y dnscrypt-proxy knot-dnsutils
 
# 生成 stamps:
python3 - <<'PY' > 123
import base64
 
addr = "192.168.10.2:443"
host = "doh.wsc2026.org"
path = "/dns-query"
 
def lp(s):
    b = s.encode()
    return bytes([len(b)]) + b
 
raw = (
    b"\x02" +
    (0).to_bytes(8, "little") +
    lp(addr) +
    b"\x00" +
    lp(host) +
    lp(path)
)
 
print("sdns://" + base64.urlsafe_b64encode(raw).decode().rstrip("="))
PY
 
cd /etc/dnscrypt-proxy
mv dnscrypt-proxy.toml dnscrypt-proxy.toml.bak
cp /usr/share/doc/dnscrypt-proxy/examples/example-dnscrypt-proxy.toml ./dnscrypt-proxy.toml
vim dnscrypt-proxy.toml
注释:
 
注释 source的内容:
在最后将前面脚本生成的内容放进来
 
# 端口和监听地址要修改 socket:
vim /usr/lib/systemd/system/dnscrypt-proxy.socket
systemctl daemon-reload
systemctl restart dnscrypt-proxy
 
# dnscrypt-proxy服务必须要能够解析公网 example.com 域名才行,而且必须是非权威应答,因此我们后端dns服务器还得在做个转发器,转发到我们伪造的假的dns服务器上才能正常解析:
伪造公网dns:
 
 
后端 dns 服务器配置转发器(实现非权威应答的效果):
 
 
·测试解析: