Secure DNS

Table of Contents

1. Secure DNS

1.1. 禁止 dns 自动修改

  1. 禁止 systemd 修改 /etc/resolv.conf

    systemctl disable systemd-resolved

  2. 不要安装 resolvconf
  3. 禁止 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
    
  4. 修改 /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 有两个问题:

  1. 有 dns 污染, dig google.com @8.8.4.4 会返回错误的地址
  2. dns query 是未加密的, 任何人都可以看到主机发出的 dns query

解决的方法有:

  1. dns over https (DoH)

    DoH 服务器例如 1.1.1.1 经常会不稳定

  2. tunnel

    在 vps 上自建 tunnel 例如 stunnel 只支持 tcp, 但 dnsmasq 似乎不支持 dns over tcp.

    使用 ss-tunnel 支持 udp 但 ss 经常会被 block

  3. vpn
    1. 在 vps 上配置 dns server
    2. 本地和 vps 使用 zerotier 等 vpn 连接
    3. 本地 dnsmasq 配置 vps 做为 upstream

1.4. v2ray dns

v2ray 自带的 dns 可以减轻 dns 污染, 但并不能加密 dns. 首先, v2ray 的 dns 功能是为了和透明代理一起工作的. 因为透明代理有一个问题是它转发的是 ip 包, 没有域名信息, 无法针对域名规则进行分流. 由于 dns 污染, 通过 ip 来分流也是不准确的. 它工作的原理是:

  1. 把本地 v2ray client 配置为 dns resolver
  2. v2ray 进行正常的 dns query (不通过 vmess), 所以它不是加密的, 且可能会收到被污染的地址, 但与普通 dns 不同的是, 它会记录下 ip 地址与域名的对应关系
  3. 当 v2ray 做为透明代理的 target 收到 ip 包时, 它会通过之前记录的对应关系查到域名, 然后针对域名进行分流

Author: [email protected]
Date: 2022-02-05 Sat 11:57
Last updated: 2022-02-25 Fri 22:34

知识共享许可协议