Secure DNS
Table of Contents
1. Secure DNS
1.1. 禁止 dns 自动修改
禁止 systemd 修改 /etc/resolv.conf
systemctl disable systemd-resolved
- 不要安装 resolvconf
禁止 networkmanager 修改 /etc/resolv.conf
$> cat /etc/NetworkManager/NetworkManager.conf [main] plugins=ifupdown,keyfile dns=none [ifupdown] managed=false [device] wifi.scan-rand-mac-address=no
修改 /etc/resolv.conf 并只读
$> cat /etc/resolv.conf nameserver 127.0.0.1
保险起见, 配置 resolv.conf 为只读, 防止有其它程序修改它
sudo chattr -i /etc/resolv.conf
1.2. dnsmasq
配置 dnsmasq 在 127.0.0.1#53 上做为本地 dns resolver, 并配置 upstream dns
server=8.8.4.4 # 针对特殊域名的配置, 例如 local.com 使用 114 server=/local.com/114.114.114.114
使用 dnsmasq 主要是利用它的 cache 功能
1.3. secure dns
dnsmasq 使用 8.8.4.4 有两个问题:
- 有 dns 污染, dig google.com @8.8.4.4 会返回错误的地址
- dns query 是未加密的, 任何人都可以看到主机发出的 dns query
解决的方法有:
dns over https (DoH)
DoH 服务器例如 1.1.1.1 经常会不稳定
tunnel
在 vps 上自建 tunnel 例如 stunnel 只支持 tcp, 但 dnsmasq 似乎不支持 dns over tcp.
使用 ss-tunnel 支持 udp 但 ss 经常会被 block
- vpn
- 在 vps 上配置 dns server
- 本地和 vps 使用 zerotier 等 vpn 连接
- 本地 dnsmasq 配置 vps 做为 upstream
1.4. v2ray dns
v2ray 自带的 dns 可以减轻 dns 污染, 但并不能加密 dns. 首先, v2ray 的 dns 功能是为了和透明代理一起工作的. 因为透明代理有一个问题是它转发的是 ip 包, 没有域名信息, 无法针对域名规则进行分流. 由于 dns 污染, 通过 ip 来分流也是不准确的. 它工作的原理是:
- 把本地 v2ray client 配置为 dns resolver
- v2ray 进行正常的 dns query (不通过 vmess), 所以它不是加密的, 且可能会收到被污染的地址, 但与普通 dns 不同的是, 它会记录下 ip 地址与域名的对应关系
- 当 v2ray 做为透明代理的 target 收到 ip 包时, 它会通过之前记录的对应关系查到域名, 然后针对域名进行分流