Brook 客户端基础知识

Updated at: 2024-07-25

Brook GUI 会在不同的时机向脚本传递不同的_全局变量_,脚本只需要将处理结果赋值给全局变量 out

命令行客户端

在说图形客户端之前,先说一下命令行客户端 brook。我们知道,在你部署好服务端以后,可以用命令行客户端 brook 在本地创建一个 socks5 代理或 http 代理,然后需要在系统代理处或浏览器代理处配置一下以使用这个代理。但是:

  1. 并非所有的 App 都会走这个代理,是否走这个代理取决于 App 自己的意愿
  2. 一般情况下所有的 UDP 协议都不会走这个代理,比如 http3

关于 socks5 和 http 代理的具体原理可以看这篇文章

图形客户端

图形客户端不使用 socks5 和 http 代理模式,所以不会出现有些软件不走系统代理的情况,而是使用虚拟网卡接管整个系统的网络,当然也包含基于 UDP 的 http3。并且 Brook 允许我们以编程的方式控制网络请求,所以我们有必要的知道基础的网络请求的知识。

网络请求基础知识

注意:当我们谈到地址时是指包含端口的地址,比如域名地址:google.com:443,比如 IP 地址:8.8.8.8:53

  1. 当 App 请求一个域名地址时,比如 google.com:443
  2. 会先进行 DNS 解析。也就是 App 会向系统配置的 DNS 比如 8.8.8.8:53 发起一个网络请求,以查询 google.com 的 IP
    1. 系统 DNS 会返回 google.com 的 IP 比如 1.2.3.4 给 App
  3. App 会将 IP 和端口组合成一个 IP 地址,比如:1.2.3.4:443
  4. App 向这个 IP 地址 1.2.3.4:443 发起网络请求
  5. App 收到响应数据

以上实际上 App 共发起了两个网络请求,一个是发往 IP 地址: 8.8.8.8:53,另一个是发往 IP 地址:1.2.3.4:443。也就说域名实际上只是 IP 的别名,一定要获取到域名的 IP 才能建立连接。

Fake DNS

Brook 有一个 Fake DNS 功能,它可以解析出 App 向系统 DNS 发起的查询请求里的域名,来决定如何向 App 响应。

  1. 当 App 请求一个域名地址时,比如 google.com:443
  2. 会先进行 DNS 解析。也就是 App 会向系统配置的 DNS 比如 8.8.8.8:53 发起一个网络请求,以查询 google.com 的 IP
  3. Brook 客户端监测到有 App 正在向 8.8.8.8:53 发起网络请求。此时会触发 in_dnsquery 变量,并携带 domain
    1. Brook 客户端会返回一个虚假 IP 给 App,比如 240.0.0.1
  4. App 会将 IP 和端口组合成一个 IP 地址,比如:240.0.0.1:443
  5. App 向这个 IP 地址 240.0.0.1:443 发起网络请求
  6. Brook 客户端监测到有 App 正在向 240.0.0.1:443 发起网络请求,Brook 客户端发现这是一个虚假 IP,会将虚假 IP 地址转换回域名地址 google.com:443此时会触发 in_address 变量,并携带 domainaddress
    1. Brook 客户端会将 google.com:443 送往 Brook Server
    2. Brook Server 会先请求本机的 DNS 进行域名解析以查询 google.com 的 IP,比如得到 1.2.3.4
    3. Brook Server 会将 IP 和端口组合成一个 IP 地址,比如:1.2.3.4:443
    4. Brook Server 会向 1.2.3.4:443 发起一个网络请求,并将数据返回给 Brook 客户端
    5. Brook 客户端再将数据返回给 App
  7. App 收到响应数据

但如果有以下情况,则不会/不能解析出域名,即 Brook 客户端全程不会/不能知道是什么域名:

如何避免 Fake DNS 不生效,请查看这篇文章

如果未开启 Brook 的 Fake DNS

  1. 当 App 请求一个域名地址时,比如 google.com:443
  2. 会先进行 DNS 解析。也就是 App 会向系统配置的 DNS 比如 8.8.8.8:53 发起一个网络请求,以查询 google.com 的 IP
  3. Brook 客户端监测到有 App 正在向 8.8.8.8:53 发起网络请求。此时会触发 in_address 变量,并携带 ipaddress
    1. Brook 客户端会将 8.8.8.8:53 送往 Brook Server
    2. Brook Server 会向 8.8.8.8:53 发起一个网络请求,并将查询结果比如 1.2.3.4 返回给 Brook 客户端
    3. Brook 客户端再将查询结果返回给 App
  4. App 会将 IP 和端口组合成一个 IP 地址,比如:1.2.3.4:443
  5. App 向这个 IP 地址 1.2.3.4:443 发起网络请求
  6. Brook 客户端监测到有 App 正在向 1.2.3.4:443 发起网络请求。此时会触发 in_address 变量,并携带 ipaddress
    1. Brook 客户端会将 1.2.3.4:443 送往 Brook Server
    2. Brook Server 会向 1.2.3.4:443 发起一个网络请求,并将数据返回给 Brook 客户端
    3. Brook 客户端再将数据返回给 App
  7. App 收到响应数据

即使开启了 Fake DNS,但是 App 走的系统安全 DNS 或 App 自己的安全 DNS

  1. 当 App 请求一个域名地址时,比如 google.com:443
  2. 会先进行 DNS 解析。也就是 App 会向安全 DNS 比如 8.8.8.8:443 发起一个网络请求,以查询 google.com 的 IP
  3. Brook 客户端监测到有 App 正在向 8.8.8.8:443 发起网络请求。此时会触发 in_address 变量,并携带 ipaddress
    1. Brook 客户端会将 8.8.8.8:443 送往 Brook Server
    2. Brook Server 会向 8.8.8.8:443 发起一个网络请求;并将查询结果比如 1.2.3.4 返回给 Brook 客户端
    3. Brook 客户端再将查询结果返回给 App
  4. App 会将 IP 和端口组合成一个 IP 地址,比如:1.2.3.4:443
  5. App 向这个 IP 地址 1.2.3.4:443 发起网络请求
  6. Brook 客户端监测到有 App 正在向 1.2.3.4:443 发起网络请求。此时会触发 in_address 变量,并携带 ipaddress
    1. Brook 客户端会将 1.2.3.4:443 送往 Brook Server
    2. Brook Server 会向 1.2.3.4:443 发起一个网络请求,并将数据返回给 Brook 客户端
    3. Brook 客户端再将数据返回给 App
  7. App 收到响应数据

触发变量

更详细的信息请查看 Brook 文档:https://brook.app