Brook 工作原理

https://talks.txthinking.com
Created at: 15 Nov 2021
Updated at: 16 Nov 2021
cloud@txthinking.com

Table of Contents

Brook

https://github.com/txthinking/brook

我应该怎么了解 Brook

Brook 遵循 KISS(keep it simple, stupid) 原则设计.

建议按以下步骤了解 Brook:

  1. 观看命令行三部曲

  2. 同时阅读 官方文档本文

我就是想简单的部署个代理, 有必要看这么多吗?

根据回答了诸多问题经验, 花时间阅读完以上两点, 以后可以节省你更多时间, 你遇到的问题也会更少.

概述

Brook 有 CLI(Command-line interface), 即命令行界面, 也有 GUI(Graphical user interface), 即图形用户界面.

Brook CLI 的服务端命令:

Brook CLI 的客户端命令:

Brook CLI 的其他独立命令:

Brook GUI 的图形客户端:

Brook CLI 就是一个文件

Brook CLI 就是一个文件, 没有也不需要配置文件. Brook 的每个功能都只需要一条命令即可, 无需配置.
也就是说只需要下载 brook 文件, 赋予可执行权限, 运行命令即可.
只有需要在后台运行或需要开机自启动时, 才需要其他辅助命令, 这个官方文档和命令行三部曲里都有介绍.
因为大部分用户都只接触过图形用户界面, 没用过命令行界面. 所以强烈建议每个用户阅读一下命令行三部曲, 一劳永逸的彻底了解 CLI 的世界.

命令行三部曲

Brook 协议设计

brook 协议这里主要是指: brook server, brook wsserver, brook wssserver.
因为 brook socks5 就是一个标准 socks5 协议, 就没必要展开了.
一般用户可以看下这个文章就可以了: Brook, Shadowsocks, V2ray 协议层面的区别, 这里也有视频讲解: 视频.
资深用户可以看下具体的协议设计:

CLI: brook server 和 brook client 工作原理

socks5 代理和 http 代理

数据流向

    某个应用 --TCP--> socks5 代理 --TCP--> brook client --TCP(Brook 协议)--> brook server --TCP/UDP--> 目的地
    某个应用 --UDP--> socks5 代理 --UDP--> brook client --UDP(Brook 协议)--> brook server --TCP/UDP--> 目的地

CLI: brook wsserver 和 brook wsclient 工作原理

brook wsserver 创建出来的本质是上一个 WebSocket Server, WebSocket 又属于 HTTP Server.
所以可以也结合其他反向代理用, 比如 nico, nignx.
这里有一篇文章: 用nico将brook wsserver包装成任意https网站(文中 nico 将 wsserver 变成了 wssserver)

socks5 代理和 http 代理

brook wsclient 创建出来的 socks5 代理可以代理 TCP 流量, 也可以代理 UDP 流量.
socks5 代理和 http 代理可以参考上文.

数据流向

    某个应用 --TCP--> socks5 代理 --TCP--> brook wsclient --TCP(Brook 协议)--> brook wsserver --TCP/UDP--> 目的地
    某个应用 --UDP--> socks5 代理 --UDP--> brook wsclient --TCP(Brook 协议)--> brook wsserver --TCP/UDP--> 目的地

CLI: brook wssserver 和 brook wssclient 工作原理

brook wssserver 实际上是 wsserver 加了一层 TLS, 实际上是个 HTTPS Server.

socks5 代理和 http 代理

brook wssclient 创建出来的 socks5 代理可以代理 TCP 流量, 也可以代理 UDP 流量.
socks5 代理和 http 代理可以参考上文.

数据流向

    某个应用 --TCP--> socks5 代理 --TCP--> brook wssclient --TCP(Brook 协议)--> brook wssserver --TCP/UDP--> 目的地
    某个应用 --UDP--> socks5 代理 --UDP--> brook wssclient --TCP(Brook 协议)--> brook wssserver --TCP/UDP--> 目的地

CLI: brook socks5 工作原理

CLI: brook relay 工作原理

brook relay 是一个独立的功能, 可以原样中继任何 TCP 和 UDP server.
一般用在服务端, 二般情况你可以挖掘.

数据流向

比如某 client 和某 server, 在没有 brook relay 是:

    某 client --TCP/UDP--> 某 server

有了 brook relay 则是:

    某 client --TCP/UDP--> brook relay --TCP/UDP--> 某 server

CLI: brook relayoverbrook 工作原理

和 brook relay 一样, 也是中继, 可以中继任何 TCP 和 UDP server. 需要结合 brook server/wsserver/wssserver 一起工作, 数据会被 brook 协议包裹后传输.
一般用在本地, 二般情况你可以挖掘.

数据流向

比如某 client 和某 server, 在没有 brook relayoverbrook 是:

    某 client --TCP/UDP--> 某 server

有了 brook relayoverbrook 则是:

    某 client --TCP/UDP--> brook relayoverbrook --(Brook 协议)--> brook server/wsserver/wssserver --TCP/UDP--> 某 server

CLI: brook dns 原理

brook dns 会创建带规则的加密 DNS server. 需要结合 brook server/wsserver/wssserver 一起工作, 数据会被 brook 协议包裹后传输.
一般用在本地, 二般情况你可以挖掘.

可以指定

规则

数据流向

未匹配到域名解析时数据流向是:

    发起 DNS 查询 --(DNS 协议)--> brook dns --(Brook 协议)--> brook server/wsserver/wssserver --(DNS 协议)--> 默认 DNS

匹配到域名解析时数据流向是:

    发起 DNS 查询 --(DNS 协议)--> brook dns --(DNS 协议)--> bypass DNS

CLI: brook tproxy 原理

brook tproxy 可以在任何 Linux 机器上创建一个透明代理作为其他机器的网关. 需要结合 brook server/wsserver/wssserver 一起工作, 数据会被 brook 协议包裹后传输.
一般用在本地, 二般情况你可以挖掘.

使用场景

规则

可以指定

数据流向

我们知道, 一个网络请求, 一般首先查询域名得到 IP, 然后再向 IP 发起请求.

  1. 某个应用准备发起网络请求
  2. 首先是 DNS 查询域名的 IP

  3. 已经查询到域名的 IP, 准备向此目标 IP 发起网络请求

CLI: brook socks5tohttp 原理

brook socks5tohttp 可以将 socks5 proxy 转换为 http proxy.
因为 http proxy 只能代理 TCP 流量, 所以:

数据流向

    某个应用 --TCP--> brook socks5tohttp --TCP-->  socks5 代理

GUI: macOS 图形客户端 proxy 模式, Windows 图形客户端 proxy 模式

在图形客户端的左边菜单的 Proxy & Tun 里面可以看到 proxy 模式, 此模式下会忽略: Bypass CIDR4 列表, Bypass CIDR6 列表, DNS Server, Fake DNS, Block list, Block 配置项.

此模式下, 会创建:

规则

数据流向

GUI: macOS 图形客户端 tun 模式, Windows 图形客户端 tun 模式, iOS 图形客户端, Android 图形客户端

规则

可以指定

数据流向

配置系统 DNS

Brook 客户端会根据当前网络 IPv4/IPv6 情况以及服务端 IPv4/IPv6 自动选择配置系统 v4 DNS 或 v6 DNS.

Block 屏蔽广告

一般情况下, block 域名列表用来屏蔽广告, 二般情况待你发掘.

Fake DNS 关闭时

我们知道, 一个网络请求, 一般首先查询域名得到 IP, 然后再向 IP 发起请求.

  1. 某个应用准备发起网络请求
  2. 首先是 DNS 查询域名的 IP

  3. 已经查询到域名的 IP, 准备向此目标 IP 发起网络请求

Fake DNS 开启时

我们知道, 一个网络请求, 一般首先查询域名得到 IP, 然后再向 IP 发起请求.

  1. 某个应用准备发起网络请求
  2. 首先是 DNS 查询域名的 IP

  3. 已经查询到域名的 IP, 准备向此目标 IP 发起网络请求

Brook 图形客户端导入服务器列表

其他常见问题

  1. 我有没有必要自己再额外使用 HTTPS DNS 或其他加密 DNS?

    HTTPS DNS 的数据流向是:

        发起 DNS 查询 --(加密 DNS 协议)--> HTTPS DNS  --(DNS 协议)--> DNS Server
    

    使用 Brook 客户端

        发起 DNS 查询 --(DNS 协议)--> Brook客户端 --(Brook 协议)--> brook server/wsserver/wssserver  --(DNS 协议)--> DNS Server
    

    所以没必要自己再额外使用其他加密 DNS

  2. 为什么我在 macOS 图形客户端和 Windows 图形客户端可以用, 在 iOS 图形客户端和 Android 图形客户端不可以用?

  3. 建议使用什么 Linux 发行版?

    个人建议不要再使用了 Centos 了, 人生苦短, 可以选择 Ubuntu 或其他你熟悉的发行版

  4. 针对大陆出国线路, 真的存在 [稳定 高速 便宜] 的线路吗?

    要达到所谓的稳定, 可以想到须是被'许可'的运营商, 目前大概有: 中国移动, 中国联通, 中国电信, 中国光电.
    这些运营商的外网接入价格大概是 2M 带宽每年2万左右, 合每月2千左右; 10M 带宽每年5万左右, 合每月5千左右; 500M 带宽每年140万左右, 合每月14万左右.
    你看个视频或浏览多图片网站 10M 带宽一般都不一定够用.
    所以答案也就清楚了. 其他要说的就是一分钱一分货吧.

其他资源