简介 Link to heading

本文作为上篇,主要是介绍一些相关知识,下篇负责实际操作的内容。

什么是透明代理 Link to heading

根据代理(proxy)的位置,我们将代理分为前向代理(Forward Proxy)和反向代理(Reverse Proxy)两大类:

  • 前向代理:运行在 client 一侧,代替 client 向 server 发送请求,例如我们日常使用的科学上网代理客户端,如 clash verge;
  • 反向代理:代替服务端接受互联网或者外部请求,然后将请求路由到对应的服务端,caddy 就有 reverse_proxy 功能;

o5EH4KSjhqXwULO

根据代理对于 client 或者 server 是否可见(visible),还可以将代理划分为透明代理(TProxy)与非透明代理两类:

tzYfjlCAhSMKoBR

  • 非透明代理:客户端需要修改目的地址为代理服务器的地址,并使用代理协议连接代理服务器;
  • 透明代理:所谓透明代理,即客户端和服务端感知不到代理的存在,客户端无需修改目的地址,也不需要采用代理协议连接代理服务器,所有目的地址转换都是在透明代理中完成的;

Fake IP 的 DNS 解析流程 Link to heading

当前,Clash 的 DNS 解析基本都已放弃 redir-host 模式,转而采用 Fake IP 模式;

我们用一个例子说明 Fake IP 的 DNS 解析流程:假设 Mac 执行 curl qq.com,那么第一步,Mac 要先进行 DNS 查询,我们在 Clash.Meta 的 rules 部分写的规则,就是用来匹配这个 DNS 查询的。

  • 假设命中了 DOMAIN-SUFFIX,qq.com,PROXY,那么 Fake IP 网关(这里指 Clash.Meta)会返回一个 Fake IP,例如 192.18.1.1,这个 IP 当然不是 qq.com 对应的真正的 IP;

    • Mac 对这个 Fake IP 建立连接,并发送出去;
    • 代理客户端捕获这个连接,从连接中拿到 Mac 要与之建立连接的 Fake IP,然后查询得到该 Fake IP 对应的域名;
    • 将连接基于 socks5 或者某种协议重新封装(封装的信息包含了要访问的域名),发送到代理服务器,由代理服务器进行真正的 DNS 解析;
  • 假设命中了 DOMAIN-SUFFIX,qq.com,DIRECT,那么 Fake IP 网关(这里指 Clash.Meta)会返回一个 mihomo,例如 192.18.1.2,这个 IP 当然不是 qq.com 对应的真正的 IP;

    • Mac 对这个 Fake IP 建立连接,并发送出去;
    • 代理客户端捕获这个连接,从连接中拿到 Mac 要与之建立连接的 IP,然后查询得到该 IP 对应的域名;
    • 代理客户端(Clash.Meta)使用配置文件中指定的 DNS 对域名进行解析,返回真实的 IP,例如 2.2.2.2
    • Mac 与 2.2.2.2 建立连接,传输数据;

假设 Clash.Meta 的 rules 中有基于 IP 分流的规则,Clash.Meta 匹配分流规则与 DNS 查询时,是从上往下依次检查规则是否匹配的,假设检查到了基于 IP 分流的规则,那么 Clash.Meta 需要使用配置文件中指定的 DNS 进行 DNS 查询;

因此,Fake IP 模式下会出现 DNS 泄漏的情况只有两种:

  1. 域名匹配到直连规则(那么运营商知道我们访问可以直连的网站,无所谓);
  2. 检查 DNS 查询与基于 IP 分流的规则是否匹配,这里的解决方案是,对于 IP 分流的规则,该规则后面都加上 no-resolve

我的匹配规则如下,no-resolve 表示在检查规则是否匹配时,不进行 DNS 解析,即只有 Mac 想要直接通过 IP 而不通过域名建立连接时,才会匹配到这条规则。

rules:
  # 开始匹配规则
  - RULE-SET,mdirect,国内
  - RULE-SET,mproxy,其他
  - RULE-SET,direct,国内
  - RULE-SET,cncidr,国内,no-resolve
  - RULE-SET,private,国内
  - RULE-SET,mdirect-ip,国内,no-resolve
  - RULE-SET,apple-direct,国内
  - RULE-SET,lancidr,国内,no-resolve
  - RULE-SET,applications,国内

  ## GEOSITE
  - GEOSITE,bilibili,国内
  - GEOSITE,icloud,icloud
  - GEOSITE,apple,apple
  - GEOSITE,onedrive,onedrive
  - GEOSITE,spotify,spotify
  - GEOSITE,youtube,youtube
  - GEOSITE,netflix,stream
  - GEOSITE,google,google
  - GEOSITE,telegram,telegram
  - GEOSITE,github,github
  - GEOSITE,microsoft,microsoft
  - GEOSITE,steam@cn,国内
  - GEOSITE,openai,openai
  - GEOSITE,category-games@cn,国内
  - GEOSITE,geolocation-!cn,其他
  - GEOSITE,cn,国内

  - RULE-SET,telegramcidr,telegram,no-resolve
  - RULE-SET,gfw,国内

  # 是否有这样的请求,域名不在上述规则之内,但是 ip 又是国内的?目前看来,似乎没有碰到过这样的情况;故选择 GEOIP,CN,DIRECT,no-resolve
  - GEOIP,cn,国内,no-resolve

  - MATCH,其他

Clash.Meta 的 DNS 解析流程如下:

nbtsQVuYjIy3r8D

透明代理的工作流程 Link to heading

客户端,以 Mac 为例,Mac 无需任何的设置,直接以 DHCP 的方式连接到路由器的 WIFI 即可。

主路由则是需要设置 Dnsmasq,将客户端的 DNS 请求,都转发给运行在 N1 的 mosdns:

  • mosdns 对于国内域名的 DNS 请求,直接进行 DNS 解析,将解析结果(IP)返回给 Mac,Mac 将与这个 IP 建立连接,从此该连接的流量直接从主路由出站;
  • 对于国外域名的 DNS 请求,mosdns 会再将 DNS 请求转发给 TPClash;

TPClash 会返回一个 Fake IP(192.18.x.x),Mac 会尝试与 Fake IP 建立连接,流量会流向这个 Fake IP,路由器需要设置静态路由,将 Fake IP 连接对应的流量路由给 Fake IP 网关,即 N1 上的 TPClash。TPClash 捕获这个连接,从连接中拿到 Mac 要与之建立连接的 Fake IP,然后查询得到该 Fake IP 对应的域名;将连接基于 socks5 或者某种协议重新封装(封装的信息包含了要访问的域名),发送到代理服务器,由代理服务器进行真正的 DNS 解析,并与目标 IP 建立连接。

这样,Mac 就能正常访问谷歌了。

Fake IP 网关的工作流程如下所示:

9JWKGQzjLpcbBEH

从流程上来说,可以直接通过 Dnsmasq 将 DNS 请求转发给 TPClash,即 192.168.6.206#1053,这样就有一个问题:

  • 所有的流量都会经过 TPClash,再从主路由出站,等同于 Mac 直接设置静态 IP,将网关设置为 N1;

  • Fake IP 机制会导致即使访问国内的域名,也会发生两次 DNS 解析,第一次是直接返回 Fake IP,与 Fake IP 建立连接后,第二次由 Fake IP 反查出域名,再通过 Clash 配置文件中设置的 DNS 服务器进行真正的 DNS 解析;

将 DNS 请求经 mosdns 中转,功能类似于 fake-ip-filter,通过设置 mosdns 的规则,可以保证国内域名都直接解析而不经过 TPClash 的 DNS 解析,从而访问国内域名的流量,除了第一次 DNS 请求解析之外,不需要再经过 TPClash。

fake-ip-filter 只能自己在配置文件中输入所有的直连域名,mosdns 则可以从本地 txt 文件中读取域名列表,因此我们可以利用 Loyalsoldier 的 v2ray-rules-dat(这位大佬的这个仓库,每两天会更新国内域名列表以及可直连域名列表的 txt 文件)。

N1 的 IP 为 192.168.6.206,TPClash 的 DNS 监听端口为 0.0.0.0:1053

mosdns 与主路由的配置,由于篇幅原因,请见 利用 mosdns 与 TPClash 搭建透明代理(下)

参考 Link to heading

TPClash

amlogic-s9xxx-armbian

tuna docker镜像源使用帮助

使用FakeIP网关更灵活地分流——HiFi冲浪系列(二)