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

一、配置 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("="))
PYcd /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 服务器配置转发器(实现非权威应答的效果):

·测试解析:
