You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓系统级DNS如何指向云端部署的dnscrypt-proxy服务?

安卓系统级DNS如何指向云端部署的dnscrypt-proxy服务?

我之前也折腾过几乎一模一样的场景——云端VPS搭好dnscrypt-proxy,配了Nginx和Let's Encrypt证书,桌面和Firefox安卓端用得好好的,但安卓系统级就是没法直接对接,毕竟系统私有DNS只认DoH/DoT协议,不认原生的dnscrypt。不过有几个亲测靠谱的方案,给你详细说下:

方案一:把云端dnscrypt转成DoT/DoH(推荐,系统原生支持)

既然你已经有Nginx和合法证书了,最省心的就是在VPS上加一层转发,把dnscrypt的流量转成安卓系统支持的DoT(DNS over TLS)或DoH(DNS over HTTPS),这样直接用安卓私有DNS就能搞定,不用装任何额外APP。

配置DoT(DNS over TLS)

安卓系统私有DNS对DoT的支持最完善,步骤如下:

  1. 先确认你的VPS上dnscrypt-proxy是监听本地53端口(UDP/TCP都要开)
  2. 编辑Nginx配置,添加stream块(如果没有的话),配置DoT转发:
stream {
    server {
        listen 853 ssl; # DoT默认端口是853
        ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
        proxy_pass 127.0.0.1:53; # 转发到本地dnscrypt-proxy的53端口
    }
}
  1. 重启Nginx和dnscrypt-proxy服务,确保853端口在VPS防火墙里是开放的
  2. 安卓端操作:打开「设置-网络和互联网-私有DNS」,选择「指定私有DNS提供商主机名」,输入你的域名(比如your-domain.com),保存后系统会自动通过DoT连接到你的VPS,所有APP的DNS请求都会走云端dnscrypt-proxy了。

配置DoH(DNS over HTTPS)

如果你的安卓版本比较新(Android 11+),也可以配置DoH:

  1. 同样确认dnscrypt-proxy监听本地53端口
  2. 在Nginx的HTTPS server块里添加DoH转发规则:
server {
    listen 443 ssl;
    server_name 你的域名;
    ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;

    location /dns-query {
        proxy_pass http://127.0.0.1:53;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_bind 127.0.0.1;
    }
}
  1. 重启Nginx后,安卓端私有DNS选择「输入DoH URL」,填写https://你的域名/dns-query,保存即可生效。

方案二:安卓本地装dnscrypt-proxy客户端(适合不想改VPS的情况)

如果不想动VPS的配置,可以在安卓上装一个dnscrypt-proxy客户端,直接对接云端的dnscrypt服务,有两种方式:

用Magisk模块(无VPN权限,系统级生效)

  1. 从Magisk仓库安装dnscrypt-proxy模块
  2. 找到模块的配置文件,路径一般是/data/adb/modules/dnscrypt-proxy/config/dnscrypt-proxy.toml
  3. 编辑配置:注释掉默认的server_names,添加你的云端服务的静态配置,比如:
static = [
    { name = "我的云端dnscrypt", stamp = "sdns://这里填你云端服务的stamp字符串" }
]

(stamp可以在VPS上的dnscrypt-proxy配置里找到,或者用dnscrypt-proxy -list命令生成)
4. 重启Magisk模块,或者直接重启手机,之后系统所有DNS请求都会通过本地客户端转发到云端服务。

用普通APP(需要VPN权限)

如果没刷Magisk,可以用F-Droid上的开源dnscrypt客户端,步骤:

  1. 安装后给APP授予VPN权限(安卓上只有VPN权限才能劫持系统DNS流量)
  2. 在APP里手动添加你的云端服务:输入服务器IP、端口、公钥(这些信息在VPS的dnscrypt-proxy配置里都能找到)
  3. 启用客户端后,系统所有APP的DNS都会走这个客户端转发到云端,缺点是状态栏会显示VPN图标。

方案三:用自定义DNS VPN(最省心的临时方案)

如果上面两种都嫌麻烦,直接用一个支持自定义DNS的VPN APP(不用真的连接远程VPN,只是利用VPN权限劫持DNS),在APP里设置你的VPS的DoT/DoH地址(如果按方案一配置了的话),或者直接设置dnscrypt服务信息,启用后就能覆盖系统DNS了,适合临时用或者不想折腾配置的场景。

我自己之前用的是方案一,一次配置后安卓系统直接用私有DNS就能搞定,不用装任何额外APP,稳定性拉满。你可以根据自己的情况选,要是配置过程中遇到具体问题,随时说细节我再给你捋!

火山引擎 最新活动