分流说白了都是名单问题。
dns 真的很难有可靠的名单,简单一点的话有相对可靠的墙内 ip 列表(前不久还刚刚修理了一下我家用的版本)
我的做法是:自建递归(我用了 bind ,用什么都行),然后 53 端口根据 ip 列表走 ip 分流。
考虑到性能问题,前面还有一层 dnsmasq ,把简单的墙内白名单指向运营商,把简单的墙内黑名单指向可信 dns
原理的话,dns 解析都是递归的,从根域名开始。
省略根、.com 的解析过程:
比如解析 www.baidu.com ,拿到 ns1.baidu.com 之后,你的递归会给 ns1.baidu.com ,也就是 110.242.68.134 发送请求,这个请求是通过直连发出去的,那么他看到的当然就是你的墙内 ip 。
又如解析 www.google.com ,每一步都是通过梯子出去,墙内完全不知道你在解析什么……最后 google 看见的你的请求来源也是梯子出口的 ip 。