blog

修改透明代理的路由方式

原先透明代理的处理方式是用 DHCP 将所有客户端的网关都设置成透明代理的IP 192.168.0.200。

那么家里所有的客户端的路由方式如下:

clientDevice(192.168.0.x) -------> proxyServer(192.168.0.200) -----> MainRouter(192.168.0.1)-----> pppoe

这样存在一个潜在的问题,如果 proxyServer 不可用,clientDevice 就没有办法用上网络,而且由于 DHCP 的生效时间限制,即时修改了 DHCP 的 gateway 配置,也要等 DHCP 租期到了才会更新(虽然可以通过插拔网线和断开再重连 wifi 解决 DHCP 的刷新问题)。那么我们为了能够尽快恢复网络,除了手动改变 IP 配置的 gateway 改回 192.168.0.1 之后,没有更好的办法。

因此把网络拓扑改成了下面的情况,内网互联不再通过 proxyServer,外网流量才路由到 proxyServer,同时为了避免 DNS 污染,将所有发送到主路由器的 DNS 请求也路由到 proxyServer。改进后的路由方式如下:

clientDevice(192.168.0.x) ---> MainRouter(192.168.0.1) ----> proxyServer -----> MainRouter ----->pppoe

这样处理后,万一 proxyServer 挂掉,或者维护,clientDevice 还是能进行内网访问,连上 mainRouter,取消到 proxyServer 的路由,直接从 pppoe 出去即可。

DNS 改动

初始 DNS 设置

原先的 DHCP 设置的 DNS 服务器是 192.168.0.1,这是 RouterOS 提供的 DNS 服务器,局域网上设置了好几个内部 DNS 映射,用它很方便。

Client(DHCP) ------> 192.168.0.1(Router) ---------> 电信DNS

经过上面提及的路由改动之后,设置了路由转发规则,为了避免转发死循环,192.168.0.1 的流量不会路由到透明代理,这导致了家里的 DNS 查询直接跑去查询电信的 DNS,偶尔会受到 DNS 污染的影响。

改动 1

将 DHCP 设置的 DNS 配置成 223.5.5.5,这样设备端发出的 DNS 请求都会被透明代理拦截,从而进入 DNS 分流,避免 DNS 污染。

Client -------X---> 223.5.5.5                 ------> 223.5.5.5
           | <拦截>                            | 
           ---------------> 192.168.0.200 -----  <分流>
                                              |
                                              -------> 8.8.8.8

这个方案的问题在于内部 DNS 无法解析,因为内部 DNS 解析设置在 192.168.0.1 的路由器上,而上面的路径没有经过它。

改动2

分流的 DNS,国内的 DNS 服务器走 192.168.0.1,这样就可以利用到内部的 DNS 解析,但要在 v2ray 配置文件中把家里的 DNS 地址写进去,避免当作外国域名,跑去外部 DNS 解析,肯定解析不到结果。

Client -------X---> 223.5.5.5                 ------> 192.168.0.1(Router) ------> 223.5.5.5
           | <拦截>                            | 
           ---------------> 192.168.0.200 -----  <分流>
                                              |
                                              -------> 8.8.8.8

这个方案已经很完善,对于使用透明代理的设备,一切都符合预期,万一 200 机器挂掉了,路由器上面操作一下,把到它的路由转发取消,就可以正常上网出去,灵活性也很好。但取消转发之后,设备使用的 DNS 就变成了 223.5.5.5,内部的 DNS 也没法解析了。而且家里有一些设备是不打算转发到透明代理的,譬如电信的 IPTV 机顶盒之类,需要处理的流量不少,也不会有出国需求,白白浪费代理服务器资源。不转发到透明代理的设备,就没办法使用内部 DNS 解析。

改动3

DHCP 设置设备的 DNS 到 192.168.0.200,这样所有设备的 DNS 查询都会进行分流,从而进入 192.168.0.1,能实现内部 DNS 查询,也能正确进行分流

                                              ------> 192.168.0.1(Router) ------> 223.5.5.5
                                              | 
Client  ------------------> 192.168.0.200 -----  <分流>
                                              |
                                              -------> 8.8.8.8

这个方案的问题在于万一 200 所在的服务器挂了,很难修正设备的 DNS 服务器,DHCP 生效时间太慢。方案容错性不足。

改动4,也是目前的方案

把 192.168.0.1 作为 192.168.0.200 的前置,这样万一 200 挂了,直接路由器上面修改一下,把 192.168.0.1 的远端 DNS 服务器设置成 223.5.5.5,就可以让所有设备正常上网。

                   ..............<容错连接>............-------> 223.5.5.5
                   |                                  | 
Client  ---> 192.168.0. 1 --------> 192.168.0.200 -----  <分流>
                                                      |
                                                      -------> 8.8.8.8

这个方案中,内部 DNS 在第一步直接解析,也没必要在 v2ray 配置文件中单独对待,即使是没在透明代理转发路由的设备,也能正常解析内网DNS;同时能正确分流;如果代理服务器挂掉,直接在路由器上面配置 DNS 远端到正常的 DNS 服务器,也可以实现正常的上网,不会受到太大影响,灵活性很高。

上面几种方案都使用过一段时间,现在落定在这种方案上。

Tips

如果 iPhone 的区域选择的是国内,将 apple 的相关域名放在分流到直通国内的 DNS 解析比较好点,否则国外 DNS 解析出来的结果没有国内 CDN,使用感受很差。目前配置的苹果域名列表:

apple.com
aaplimg.com
mzstatic.com

另外,苹果的推送服务最好也不路由到透明代理,除非代理出去的线路非常稳定(我的就经常不稳定 :- (),否则推送没办法及时收到就不是太好了。关于推送服务器的IP,参见 如果您的 Apple 设备无法收到 Apple 推送通知