透明代理模式下的dns请求能否像vpn模式一样按路由转发

目前在 VPN 模式下,设置好「远程 DNS」地址后,将「DNS 转发」设置为关闭,可以做到:访问大陆地址解析到大陆的 IP、访问 GFWList 里的地址不会受到 DNS 污染的影响。

我现在还在使用其它 VPN 软件(Adguard),将 DNS 请求转发给透明代理模式下的 Shadowsocks,但是如果不把 SS 的「DNS转发」打开的话,访问被 DNS 污染的地址会无法访问。打开「DNS转发」的话,会把所有的 DNS 请求转发过去而不是分路由转发,这样会导致访问大陆的地址非常缓慢。

能否将透明代理模式下的DNS请求像VPN模式一样按路由转发呢?

DNS requests are handled the same way in transproxy mode as in VPN mode. Please check if you’re using the DNS port configured in shadowsocks-android as your DNS.

It’s probably better if you set up ad-blocking at server side.

查看了下 DNS 的 log,在 dns forward 打开的时候(左图),所有 DNS 请求都被转发,bbc 返回了未被污染的结果,xiaomi 返回的是 aws 美东的 ip(其它类似 weixin 的 CDN 等也都解析到了非大陆地址)。关闭 dns forward 后(右图),bbc 的 dns query 被污染,xiaomi 返回的是大陆的地址。

手机没有 root 没有找到可以 query 本地 DNS server 的工具。查看的是 VPN 模式 Adguard 的 filter log。应该确定已经把 DNS 设定为本地 ss 的端口,因为两次测试都是用的透明代理模式下的 ss,唯一的差别只有开关了 ss 的 dns forward 选项。

I don’t think Adguard uses your DNS settings as you would think. Try specifying an invalid address.

测试了以下几个状态

SS:透明代理模式,DNS 端口 5450,DNS forward 打开。
Adguard:VPN 模式,代理关闭(不使用 ss 的代理功能),DNS 指向 127.0.0.1:5450。
访问状态:DNS 均使用远端 DNS 服务器解析,可以正常访问 BBC News 应用(BBC 只被 DNS 污染,ip 没有别墙),不能访问 Google(Google ip 被墙),符合预期。

关闭 DNS forward 后:BBC News 无法访问, Log 中 DNS query 被误导到错误的 ip。

打开 DNS forward,将 Adguard 的 DNS 指向错误的地址(127.0.0.1:5460):BBC News 无法访问,查看 Log 中的 DNS query 返回为空。

以上几种设置方式均不影响大陆地址访问(除了打开 DNS forward 会导致使用海外 CDN 导致访问略微缓慢),即使是使用了错误的 DNS 地址。不清楚是 Adguard 或 Android 系统的 DNS 有 fallback 机制。

用 Daedalus 测试也是同样的结果

I was not able to reproduce your issue with transproxy mode, DNS forwarding off, bypass LAN and China routes and Adguard. Please double check your route settings in shadowsocks-android.

你好, 你能指导下 在 win10 上编译shadowsocks 吗,