跨平台可编程网络工具。
❤️ Shiliew - 专为珍惜时间的人设计的网络应用程序
bash <(curl https://bash.ooo/nami.sh)
nami install brook
brook server -l :9999 -p hello
您可能想使用
brook link
来自定义一些参数
Brook GUI会在不同的时间向脚本传递不同的全局变量,脚本只需要将处理结果赋值给全局变量out
即可
在讨论 GUI 客户端之前,我们先来谈谈命令行客户端brook
。我们知道,部署服务器后,您可以使用命令行客户端brook
在您的计算机上创建本地socks5代理或http代理,然后在系统代理设置或浏览器中配置它以使用此代理。然而:
关于socks5和http代理的具体内容,可以阅读这篇文章。
GUI客户端不使用socks5和http代理模式,因此不存在某些不使用系统代理的软件的问题。相反,它使用虚拟网卡来接管整个系统的网络,包括基于UDP的http3。而且,Brook允许我们以编程方式控制网络请求,因此有必要了解网络请求的基本知识。
注意:当我们谈论地址时,我们指的是包含端口号的地址,例如域地址:
google.com:443
或 IP 地址:8.8.8.8:53
google.com:443
8.8.8.8:53
,来查询google.com
的 IPgoogle.com
的 IP 返回给应用程序,例如1.2.3.4
1.2.3.4:443
1.2.3.4:443
发出网络请求在上述过程中,应用程序实际上发出了两个网络请求:一个请求到 IP 地址8.8.8.8:53
,另一个请求到 IP 地址1.2.3.4:443
。也就是说,域名本质上是IP的别名,必须获取域的IP才能建立连接。
Brook有一个Fake DNS功能,它可以从应用程序发送到系统DNS的查询请求中解析出域名,并决定如何响应应用程序。
google.com:443
8.8.8.8:53
,查询google.com
的 IP8.8.8.8:53
发送网络请求。这会触发in_dnsquery
变量,携带domain
等信息240.0.0.1
240.0.0.1:443
240.0.0.1:443
发出网络请求240.0.0.1:443
发送网络请求,发现这是一个假 IP,并将假 IP 地址转换回域名地址google.com:443
。这会触发in_address
变量,携带domainaddress
等信息google.com:443
发送到 Brook 服务器google.com
的IP,比如接收1.2.3.4
1.2.3.4:443
1.2.3.4:443
发送网络请求,并将数据返回给Brook客户端但是,如果出现以下情况,域名将不会/无法被解析,这意味着Brook客户端不会/无法知道域名是什么,并将其视为发送到IP地址的正常请求:
为了避免Fake DNS的无效,请参考这篇文章。
google.com:443
8.8.8.8:53
,查询google.com
的 IP8.8.8.8:53
发送网络请求。这会触发in_address
变量,携带ipaddress
等信息8.8.8.8:53
到 Brook 服务器8.8.8.8:53
发送网络请求,并将结果(如1.2.3.4
)返回给 Brook 客户端1.2.3.4:443
1.2.3.4:443
发出网络请求1.2.3.4:443
发送网络请求。这会触发in_address
变量,携带ipaddress
等信息1.2.3.4:443
到 Brook 服务器1.2.3.4:443
发送网络请求,并将数据返回给Brook客户端google.com:443
8.8.8.8:443
,查询google.com
的 IP8.8.8.8:443
发送网络请求。这会触发in_address
变量,携带ipaddress
等信息8.8.8.8:443
到 Brook 服务器8.8.8.8:443
发送网络请求,并将结果(例如1.2.3.4
)返回给 Brook 客户端1.2.3.4:443
1.2.3.4:443
发出网络请求1.2.3.4:443
发送网络请求。这会触发in_address
变量,携带ipaddress
等信息1.2.3.4:443
到 Brook 服务器1.2.3.4:443
发送网络请求,并将数据返回给Brook客户端为了避免Fake DNS的无效,请参考这篇文章。
in_brooklinks
变量被触发时:in_dnsquery
变量被触发时,可以根据需要进行处理,如:in_address
变量被触发时,可以根据需要进行处理,如:in_httprequest
和in_httpresponse
。in_httprequest
变量被触发时,可以根据需要进行处理,如:in_httpresponse
变量被触发时,可以根据需要进行处理,如:有关变量的属性和响应的详细信息,请参阅以下内容。
多变的 | 类型 | 状况 | 定时 | 描述 | 输出类型 |
---|---|---|---|---|---|
in_brooklinks | 地图 | / | 连接前 | 预定义多个溪流链接,然后以编程方式指定要连接到哪一个 | 地图 |
in_dns查询 | 地图 | 假 DNS:开 | 当发生 DNS 查询时 | 脚本可以决定如何处理这个请求 | 地图 |
输入地址 | 地图 | / | 连接到某个地址时 | 脚本可以决定如何连接 | 地图 |
in_http请求 | 地图 | / | 当 HTTP(S) 请求到来时 | 脚本可以决定如何处理这个请求 | 地图 |
in_http请求,in_http响应 | 地图 | / | 当 HTTP(S) 响应到来时 | 脚本可以决定如何处理这个响应 | 地图 |
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
_ | 布尔值 | 无意义的 | 真的 |
out
,如果不是map
类型则忽略
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
... | ... | ... | ... |
自定义名称 | 细绳 | 布鲁克林克 | 溪://... |
... | ... | ... | ... |
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
领域 | 细绳 | 域名 | 谷歌网站 |
类型 | 细绳 | 查询类型 | 一个 |
应用程序标识符 | 细绳 | 应用程序 ID 或路径 | com.google.Chrome.helper |
界面 | 细绳 | 网络接口。仅限苹果机 | 恩0 |
out
,如果是error
类型会记录在日志中。如果不是map
类型则忽略
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
堵塞 | 布尔值 | 是否Block,默认false | 错误的 |
ip | 细绳 | 直接指定IP,仅当type 为A / AAAA 时有效 | 1.2.3.4 |
系统 | 布尔值 | 通过系统DNS解析,默认false | 错误的 |
旁路 | 布尔值 | 通过绕过 DNS 解析,默认false | 错误的 |
布鲁克林基 | 细绳 | 当需要连接Server时,改为连接in_brooklinks键指定的Server | 自定义名称 |
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
网络 | 细绳 | 网络类型,取值tcp / udp | TCP协议 |
IP地址 | 细绳 | IP类型地址。只有ipaddress和domainaddress。请注意,这两者之间没有关系 | 1.2.3.4:443 |
域名地址 | 细绳 | 域名类型地址,由于FakeDNS我们可以在这里获取域名地址 | 谷歌.com:443 |
应用程序标识符 | 细绳 | 应用程序 ID 或路径 | com.google.Chrome.helper |
界面 | 细绳 | 网络接口。仅限苹果电脑 | 恩0 |
out
,如果是error
类型会记录在日志中。如果不是map
类型则忽略
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
堵塞 | 布尔值 | 是否Block,默认false | 错误的 |
IP地址 | 细绳 | IP类型地址,重写目的地 | 1.2.3.4:443 |
来自绕过 DNS 的 IP 地址 | 细绳 | 使用Bypass DNS获取A 或AAAA IP并重写目的地,仅当domainaddress 存在时有效,值为A / AAAA | 一个 |
旁路 | 布尔值 | 绕过,默认false 。如果true 且domainaddress ,则必须指定ipaddress 或ipaddressfrombypassdns | 错误的 |
中间人 | 布尔值 | 是否执行MITM,默认false 。仅当network 为tcp 时有效。需要安装CA,见下文 | 错误的 |
中间人协议 | 细绳 | MITM协议需要显式指定,值为http / https | https |
中间人证书域 | 细绳 | MITM 证书域名,默认取自domainaddress 。如果ipaddress 和mitm 为true 并且mitmprotocol 为https 则必须明确指定 | example.com |
与身体的中间人 | 布尔值 | 是否操作http body,默认false 。会将请求和响应的正文读入内存并与脚本交互。 iOS 50M 总内存限制可能会杀死进程 | 错误的 |
mitmautohandlecompress | 布尔值 | 与脚本交互时是否自动解压http body,默认false | 错误的 |
中间人客户端超时 | 整数 | MITM 与服务器对话超时,秒,默认 0 | 0 |
mitm服务器读取超时 | 整数 | MITM从客户端读取的超时时间,秒,默认0 | 0 |
mitm服务器写入超时 | 整数 | MITM写入客户端的超时时间,秒,默认0 | 0 |
布鲁克林基 | 细绳 | 当需要连接Server时,改为连接in_brooklinks键指定的Server | 自定义名称 |
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
网址 | 细绳 | 网址 | https://example.com/hello |
方法 | 细绳 | HTTP方式 | 得到 |
身体 | 字节 | HTTP 请求正文 | / |
... | 细绳 | 其他字段是 HTTP 标头 | / |
out
,必须设置为请求或响应
钥匙 | 类型 | 描述 | 例子 |
---|---|---|---|
状态码 | 整数 | HTTP 状态码 | 200 |
身体 | 字节 | HTTP 响应正文 | / |
... | 细绳 | 其他字段是 HTTP 标头 | / |
out
,必须设置为响应
在 Brook GUI 中,脚本被抽象为Modules 。已经有一些模块了,这没什么神奇的,它只是自动组合 _header.tengo 和 _footer.tengo,所以你只需要编写模块本身。
modules = append(modules, {
// If you want to predefine multiple brook links, and then programmatically specify which one to connect to, then define `brooklinks` key a function
brooklinks: func(m) {
// Please refer to the example in `brooklinks.tengo`
},
// If you want to intercept and handle a DNS query, then define `dnsquery` key a function, `m` is the `in_dnsquery`
dnsquery: func(m) {
// Please refer to the example in `block_aaaa.tengo`
},
// If you want to intercept and handle an address, then define `address` key a function, `m` is the `in_address`
address: func(m) {
// Please refer to the example in `block_google_secure_dns.tengo`
},
// If you want to intercept and handle a http request, then define `httprequest` key a function, `request` is the `in_httprequest`
httprequest: func(request) {
// Please refer to the example in `ios_app_downgrade.tengo` or `redirect_google_cn.tengo`
},
// If you want to intercept and handle a http response, then define `httpresponse` key a function, `request` is the `in_httprequest`, `response` is the `in_httpresponse`
httpresponse: func(request, response) {
// Please refer to the example in `response_sample.tengo`
}
})
https://github.com/txthinking/tun2brook
如果您使用tun2brook,您可以通过以下方式手动将多个模块组合成一个完整的脚本。例如:
cat _header.tengo > my.tengo
cat block_google_secure_dns.tengo >> my.tengo
cat block_aaaa.tengo >> my.tengo
cat _footer.tengo >> my.tengo
天吾语言语法
图书馆
文本:正则表达式、字符串转换和操作
数学:数学常数和函数
times:与时间相关的函数
rand:随机函数
fmt:格式化函数
json:JSON 函数
enum:枚举函数
hex:十六进制编码和解码函数
base64:base64编码和解码函数
brook
:布鲁克模块
Constants
* os: string, linux/darwin/windows/ios/android
Functions
* splithostport(address string) => map/error: splits a network address of the form "host:port" to { "host": "xxx", "port": "xxx" }
* country(ip string) => string/error: get country code from ip
* cidrcontainsip(cidr string, ip string) => bool/error: reports whether the network includes ip
* parseurl(url string) => map/error: parses a raw url into a map, keys: scheme/host/path/rawpath/rawquery
* parsequery(query string) => map/error: parses a raw query into a kv map
* map2query(kv map) => string/error: convert map{string:string} into a query string
* bytes2ints(b bytes) => array/error: convert bytes into [int]
* ints2bytes(ints array) => bytes/error: convert [int] into bytes
* bytescompare(a bytes, b bytes) => int/error: returns an integer comparing two bytes lexicographically. The result will be 0 if a == b, -1 if a < b, and +1 if a > b
* bytescontains(b bytes, sub bytes) => bool/error: reports whether sub is within b
* byteshasprefix(s bytes, prefix bytes) => bool/error: tests whether the bytes s begins with prefix
* byteshassuffix(s bytes, suffix bytes) => bool/error: tests whether the bytes s ends with suffix
* bytesindex(s bytes, sep bytes) => int/error: returns the index of the first instance of sep in s, or -1 if sep is not present in s
* byteslastindex(s bytes, sep bytes) => int/error: returns the index of the last instance of sep in s, or -1 if sep is not present in s
* bytesreplace(s bytes, old bytes, new bytes, n int) => bytes/error: returns a copy of the s with the first n non-overlapping instances of old replaced by new. If n < 0, there is no limit on the number of replacements
* pathescape(s string) => string/error: escapes the string so it can be safely placed inside a URL path segment, replacing special characters (including /) with %XX sequences as needed
* pathunescape(s string) => string/error: does the inverse transformation of pathescape
* queryescape(s string) => string/error: escapes the string so it can be safely placed inside a URL query
* queryunescape(s string) => string/error: does the inverse transformation of queryescape
* hexdecode(s string) => bytes/error: returns the bytes represented by the hexadecimal string s
* hexencode(s string) => string/error: returns the hexadecimal encoding of src
如果您正在编写复杂的脚本,GUI 可能不方便调试。建议在桌面上使用 tun2brook 配合fmt.println
进行调试
https://txthinking.github.io/ca/ca.pem
操作系统 | 如何 |
---|---|
iOS系统 | https://www.youtube.com/watch?v=HSGPC2vpDGk |
安卓 | Android有用户CA和系统CA,ROOT后必须安装在系统CA中 |
macOS | nami install mad ca.txthinking , sudo mad install --ca ~/.nami/bin/ca.pem |
视窗 | nami install mad ca.txthinking ,管理员: mad install --ca ~/.nami/bin/ca.pem |
有些软件可能无法读取系统CA,可以使用
curl --cacert ~/.nami/bin/ca.pem
进行调试
Brook OpenWRT:完美支持IPv4/IPv6/TCP/UDP
Brook 对 IPv6 的立场是积极的,如果您的服务器或本地环境没有 IPv6 堆栈,请阅读本文。
brook link --address
指定 IP 地址,则 Brook 客户端将尝试使用本地 DNS 解析域的 IP,首选 AAAA 记录。例如:Connectivity Check
。如果有时有效,但有时无效,则表明不稳定。Test IPv4 TCP
进行测试;此测试已硬编码 IP 地址,因此不会触发 DNS 解析。Test IPv4 UDP
进行测试;此测试已硬编码 IP 地址,因此不会触发 DNS 解析。Test IPv6 TCP
进行测试;此测试已硬编码 IP 地址,因此不会触发 DNS 解析。Test IPv6 UDP
进行测试;此测试已硬编码 IP 地址,因此不会触发 DNS 解析。Echo Client
进行测试。如果输入的echo服务器是域地址,则会触发DNS解析。Block Google Secure DNS
模块就足够了。其他情况可以参考这篇文章。Block Google Secure DNS
Bypass Geo
Bypass Apple
:防止接收 Apple 消息通知时出现问题。Bypass China domain
或Bypass China domain A
:前者使用Bypass DNS
获取IP,然后Bypass Geo
或其他模块决定是否绕过;后者通过A记录Bypass DNS
获取IP后直接绕过。如果您的本地不支持 IPv6,则需要后者。每个子命令都有一个--example
参数,可以打印最小的用法示例
Brook - 跨平台可编程网络工具
溪
brook --help
用法:
Brook [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...]
--blockCIDR4List ="": 每行一个 CIDR,https://、http:// 或本地文件绝对路径,例如:https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr4 。TXT。适用于服务器/wsserver/wssserver/quicserver
--blockCIDR6List ="": 每行一个 CIDR,https://、http:// 或本地文件绝对路径,例如:https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr6 。TXT。适用于服务器/wsserver/wssserver/quicserver
--blockDomainList ="":每行一个域名,后缀匹配模式。 https://、http:// 或本地文件绝对路径。例如:https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt。适用于服务器/wsserver/wssserver/quicserver
--blockGeoIP ="":按地理国家/地区代码阻止 IP,例如美国。适用于服务器/wsserver/wssserver/quicserver
--blockListUpdateInterval ="":更新列表 --blockDomainList,--blockCIDR4List,--blockCIDR6List 间隔,秒。默认 0,启动时只读取一次(默认:0)
--clientHKDFInfo ="": 客户端 HKDF 信息,大多数时候你不需要更改它,如果更改,客户端中的所有和每个布鲁克链接必须相同,我的意思是每个(默认值:“brook”)
--dialWithDNS ="":当需要解析域名时,使用指定的DNS。如 8.8.8.8:53 或 https://dns.google/dns-query?address=8.8.8.8%3A443,地址为必填项。请注意,对于客户端命令,这不会影响客户端将域地址传递给服务器
--dialWithDNSPrefer ="":与 dialWithDNS 参数一起使用。首选 A 记录或 AAAA 记录。值为 A 或 AAAA
--dialWithIP4 ="":当前机器与外部IPv4建立网络连接时,无论是TCP还是UDP,用于指定使用的IPv4
--dialWithIP6 ="": 当前机器与外部IPv6建立网络连接时,无论是TCP还是UDP,用于指定使用的IPv6
--dialWithNIC ="":当前机器与外部建立网络连接时,无论是TCP还是UDP,用于指定使用的网卡
--dialWithSocks5 ="": 当前机器与外部建立网络连接时,无论是TCP还是UDP,用你的socks5代理,如127.0.0.1:1081
--dialWithSocks5Password ="": 如果有
--dialWithSocks5TCPTimeout ="": 时间(秒)(默认值:0)
--dialWithSocks5UDPTimeout ="": 时间(秒)(默认值:60)
--dialWithSocks5Username ="": 如果有
--ipLimitInterval ="": ipLimitMax 的间隔(默认值:0)
--ipLimitMax ="":限制客户端IP地址的数量,使用该参数时要小心,因为客户端可能有动态IP。适用于服务器/wsserver/wssserver/quicserver(默认值:0)
--ipLimitWait ="": 超过 ipLimitMax 后等待恢复的时间(默认:0)
--log ="":启用日志。有效值为文件路径或“控制台”。发送 SIGUSR1 给我以重置 UNIX 系统上的日志文件。如果要调试 SOCKS5 lib,请设置 env SOCKS5_DEBUG=true
--pid ="":用于存储pid的文件路径。发送 SIGUSR1 给我以重置 unix 系统上的 --serverLog 文件
--pprof ="": 去http pprof监听地址,如:6060
--prometheus ="":prometheus http监听地址,如:7070。如果是公网传输,建议配合nico使用
--prometheusPath ="":prometheus http路径,如/xxx。如果是在公网传输,建议使用难以猜测的值
--serverHKDFInfo ="":服务器 HKDF 信息,大多数时候你不需要更改此设置,如果更改,客户端中的所有和每个布鲁克链接必须相同,我的意思是每个(默认值:“brook”)
--serverLog ="":启用服务器日志、流量等。有效值为文件路径或“控制台”。发送 SIGUSR1 给我以重置 UNIX 系统上的日志文件。与 --log 参数互斥。使用 brook 协议与 server/wsserver/wssserver/quicserver 配合使用
--speedLimit ="": 限制速度(b),500kb/s 如:500000,适用于 server/wsserver/wssserver/quicserver (默认: 0)
--tag ="": 进程可以使用标签,将附加到日志或服务器日志中,例如:'key1:value1'。所有标签也会作为查询参数一一附加到userAPI中
--userAPI ="":当您构建自己的用户系统时,Brook Server 会向您的 userAPI 发送 GET 请求来检查 token 是否有效,例如:https://your-api-server.com/a_unpredictable_path。是的,建议给你的https API添加不可预测的路径,当然,你也可以使用http api进行内网通信。请求格式为https://your-api-server.com/a_unpredictable_path?token=xxx。当响应为200时,body应该是用户的唯一标识符,例如用户ID;所有其他状态代码都被视为代表非法用户,在这些情况下,正文应该是描述错误的字符串。它应该与 --serverLog 和带有 brook 协议的 server/wsserver/wssserver/quicserver 一起使用。欲了解更多信息,请阅读https://github.com/txthinking/brook/blob/master/protocol/user.md
--userAPIInvalidCacheTime ="":一旦令牌被检查并且无效,则在一段时间内不会请求 userAPI 再次验证。必须设置一个合理的值,否则会影响每个传入连接的性能。请注意,当您在用户系统中将用户状态从无效更改为有效时,这可能会影响用户体验(默认:1800)
--userAPIValidCacheTime ="":一旦令牌被检查并有效,在一段时间内将不会请求 userAPI 再次验证。必须设置一个合理的值,否则会影响每个传入连接的性能(默认:3600)
--version, -v : 打印版本
启动支持tcp和udp的brook服务器
--blockCIDR4List ="": 该选项将在未来版本中删除,请使用全局选项
--blockCIDR6List ="": 该选项将在未来版本中删除,请使用全局选项
--blockDomainList ="": 该选项将在未来版本中删除,请使用全局选项
--blockGeoIP ="": 该选项将在未来版本中删除,请使用全局选项
--example : 显示最小的用法示例
--listen, -l ="": 监听地址,如:':9999'
--password, -p ="": 服务器密码
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--updateListInterval ="":此选项将在未来版本中删除,请使用全局选项(默认值:0)
启动一个支持tcp和udp的brook客户端。它可以打开一个socks5代理,[src <->socks5<->$brookclient<->$brookserver<->dst]
--example : 显示最小的用法示例
--http ="": 在哪里监听 HTTP 代理连接
--link ="": brook 链接,可以通过 $brook 链接获取。 wssserver 和密码参数将被忽略
--password, -p ="": Brook 服务器密码
--server, -s ="": Brook服务器地址,如:1.2.3.4:9999
--socks5 ="":在哪里监听 SOCKS5 连接(默认值:127.0.0.1:1080)
--socks5ServerIP ="": 仅当您的socks5服务器IP与监听IP不同时
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
启动一个支持tcp和udp的brook wsserver。它打开一个标准的http服务器和一个websocket服务器
--blockCIDR4List ="": 该选项将在未来版本中删除,请使用全局选项
--blockCIDR6List ="": 该选项将在未来版本中删除,请使用全局选项
--blockDomainList ="": 该选项将在未来版本中删除,请使用全局选项
--blockGeoIP ="": 该选项将在未来版本中删除,请使用全局选项
--example : 显示最小的用法示例
--listen, -l ="": 监听地址,如:':80'
--password, -p ="": 服务器密码
--path ="":URL 路径(默认:/ws)
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--updateListInterval ="":此选项将在未来版本中删除,请使用全局选项(默认值:0)
--withoutBrookProtocol : 数据不会使用brook协议加密
--xForwardedFor :替换--log中的from字段,注意这可能是伪造的
启动一个支持tcp和udp的brook wsclient。它可以打开一个socks5代理,[src <->socks5<->$brook wsclient<->$brookwsserver<->dst]
--example : 显示最小的用法示例
--http ="": 在哪里监听 HTTP 代理连接
--link ="": brook 链接,可以通过 $brook 链接获取。 wssserver 和密码参数将被忽略
--password, -p ="": Brook wsserver 密码
--socks5 ="":在哪里监听 SOCKS5 连接(默认值:127.0.0.1:1080)
--socks5ServerIP ="": 仅当您的socks5服务器IP与监听IP不同时
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--wsserver, -s ="": Brook wsserver地址,如:ws://1.2.3.4:80,如果没有路径则将使用/ws。任何情况下都不要省略端口
启动一个支持tcp和udp的brook wssserver。它打开一个标准的 https 服务器和一个 websocket 服务器
--blockCIDR4List ="": 该选项将在未来版本中删除,请使用全局选项
--blockCIDR6List ="": 该选项将在未来版本中删除,请使用全局选项
--blockDomainList ="": 该选项将在未来版本中删除,请使用全局选项
--blockGeoIP ="": 该选项将在未来版本中删除,请使用全局选项
--cert ="":域的证书文件绝对路径,例如/path/to/cert.pem。如果cert或certkey为空,将自动颁发证书
--certkey ="":域的证书密钥文件绝对路径,例如/path/to/certkey.pem。如果cert或certkey为空,将自动颁发证书
--domainaddress ="":如:domain.com:443。如果选择自动颁发证书,则域名必须已解析为服务器IP,并且也会使用80端口
--example : 显示最小的用法示例
--password, -p ="": 服务器密码
--path ="":URL 路径(默认:/ws)
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--updateListInterval ="":此选项将在未来版本中删除,请使用全局选项(默认值:0)
--withoutBrookProtocol : 数据不会使用brook协议加密
启动一个支持tcp和udp的brook wssclient。它可以打开一个socks5代理,[src <->socks5<->$brook wssclient<->$brookwssserver<->dst]
--example : 显示最小的用法示例
--http ="": 在哪里监听 HTTP 代理连接
--link ="": brook 链接,可以通过 $brook 链接获取。 wssserver 和密码参数将被忽略
--password, -p ="": Brook wssserver 密码
--socks5 ="":在哪里监听 SOCKS5 连接(默认值:127.0.0.1:1080)
--socks5ServerIP ="": 仅当您的socks5服务器IP与监听IP不同时
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--wssserver, -s ="": Brook wssserver 地址,如:wss://google.com:443,如果没有路径则将使用 /ws。任何情况下都不要省略端口
启动一个支持tcp和udp的brook quicserver。
--blockCIDR4List ="": 该选项将在未来版本中删除,请使用全局选项
--blockCIDR6List ="": 该选项将在未来版本中删除,请使用全局选项
--blockDomainList ="": 该选项将在未来版本中删除,请使用全局选项
--blockGeoIP ="": 该选项将在未来版本中删除,请使用全局选项
--cert ="":域的证书文件绝对路径,例如/path/to/cert.pem。如果cert或certkey为空,将自动颁发证书
--certkey ="":域的证书密钥文件绝对路径,例如/path/to/certkey.pem。如果cert或certkey为空,将自动颁发证书
--domainaddress ="":如:domain.com:443。如果选择自动颁发证书,则域名必须已解析为服务器IP,并且也会使用80端口
--example : 显示最小的用法示例
--password, -p ="": 服务器密码
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
--updateListInterval ="":此选项将在未来版本中删除,请使用全局选项(默认值:0)
--withoutBrookProtocol : 数据不会使用brook协议加密
启动一个支持tcp和udp的brook quicclient。它可以打开一个socks5代理,[src <->socks5<->$brook quicclient<->$brook quicserver<->dst]。 (全局拨号参数被忽略)
--example : 显示最小的用法示例
--http ="": 在哪里监听 HTTP 代理连接
--link ="": brook 链接,可以通过 $brook 链接获取。 wssserver 和密码参数将被忽略
--socks5 ="":在哪里监听 SOCKS5 连接(默认值:127.0.0.1:1080)
--socks5ServerIP ="": 仅当您的socks5服务器IP与监听IP不同时
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
通过 brook 中继网络流量,支持 TCP 和 UDP。访问[from地址]等于访问[to地址],[src<->from地址<->$brook server/wsserver/wssserver/quicserver<->to地址]
--example : 显示最小的用法示例
--from, -f, -l ="": 监听地址: like ':9999'
--link ="": brook 链接,可以通过 $brook 链接获取。服务器和密码参数将被忽略
--password, -p ="": 密码
--server, -s ="": brook 服务器或 brook wsserver 或 brook wssserver 或 brook quicserver, 例如: 1.2.3.4:9999, ws://1.2.3.4:9999, wss://domain:443/ws, quic://domain.com:443
--tcpTimeout ="": 时间(秒)(默认值:0)
--to, -t ="": 中继地址,如:1.2.3.4:9999
--udpTimeout ="": 时间(秒)(默认值:0)
通过 brook 运行 dns 服务器,支持 TCP 和 UDP, [src <-> $ brook dnserversoverbrook <-> $ brook server/wsserver/wssserver/quicserver <-> dns] 或 [src <-> $ brook dnsserveroverbrook <-> dnsForBypass]
--blockDomainList ="":每行一个域名,后缀匹配模式。 https://、http:// 或本地绝对文件路径。像:https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--bypassDomainList ="":每行一个域名,后缀匹配模式。 https://、http:// 或本地绝对文件路径。像:https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--disableA : 禁用查询
--disableAAAA : 禁用 AAAA 查询
--dns ="":用于解析不在列表中的域的 DNS 服务器(默认值:8.8.8.8:53)
--dnsForBypass ="": 用于解析绕过列表中的域的 DNS 服务器。如223.5.5.5:53或https://dns.alidns.com/dns-query?address=223.5.5.5:443,地址为必填项(默认:223.5.5.5:53)
--example : 显示最小的用法示例
--link ="": brook 链接,可以通过 $brook 链接获取。服务器和密码参数将被忽略
--listen, -l ="": 监听地址,如:127.0.0.1:53
--password, -p ="": 密码
--server, -s ="": brook server 或 brook wsserver 或 brook wssserver 或 brook quicserver, 例如: 1.2.3.4:9999, ws://1.2.3.4:9999, wss://domain.com:443/ ws,quic://domain.com:443
--tcpTimeout ="": 时间(秒)(默认值:0)
--udpTimeout ="": 时间(秒)(默认值:0)
生成小溪链接
--address ="": 当服务器是brook wsserver或brook wssserver或brook quicserver时,指定地址而不是从主机解析地址,例如1.2.3.4:443
--ca ="": 当服务器为brook wssserver或brook quicserver时,为不受信任的证书指定ca,例如/path/to/ca.pem
--clientHKDFInfo ="": 客户端 HKDF 信息,大多数时候你不需要更改它,如果你不知道这是什么,请阅读 brook 协议
--example : 显示最小的用法示例
--fragment ="":当server是brook wssserver时,将ClientHello分割成多个片段,然后逐个发送,有延迟(毫秒)。格式为min_length:max_length:min_delay:max_delay,不能为零,如50:100:10:50
--insecure : 当服务器是 brook wssserver 或 brook quicserver 时,客户端不验证服务器的证书链和主机名
--name ="": 给该服务器一个名称
--password, -p ="": 密码
--server, -s ="": 支持brook服务器、brook wsserver、brook wssserver、socks5服务器、brook quicserver。例如:1.2.3.4:9999、ws://1.2.3.4:9999、wss://google.com:443/ws、socks5://1.2.3.4:1080、quic://google.com:443
--serverHKDFInfo ="":服务器 HKDF 信息,大多数时候你不需要更改它,如果你不知道这是什么,请阅读 brook 协议
--tlsfingerprint ="": 当服务器是brook wssserver时,选择tls指纹,值可以是:chrome
--token ="":令牌代表用户的身份。以十六进制编码的字符串。服务器需要启用 --userAPI。注意:仅 brook GUI(OpenWrt 除外)和 tun2brook 支持
--udpoverstream : 当服务器是 brook quicserver 时,UDP over Stream。一般情况下,您需要此参数,因为 QUIC 的最大数据报大小非常小。注意:目前仅支持 brook CLI 和 tun2brook
--udpovertcp : 当服务器是brook服务器时,UDP over TCP
--username, -u ="": 用户名,当服务器是socks5服务器时
--withoutBrookProtocol : 当服务器为 brook wsserver 或 brook wssserver 或 brook quicserver 时,数据不会使用 brook 协议加密
运行客户端并与支持TCP和UDP的Brook链接连接。它可以启动socks5代理,[src <-> socks5 <-> $ brook connect <-> $ brook server/wsserver/wssserver/wsssserver/Quicserver <-> dst]
- 示例:显示最小用法的示例
-http =“”:在哪里听http代理连接
-link,-l =“”:Brook链接,您可以通过$ brook链接获得它
-socks5 =“”:在哪里收听袜子5连接(默认:127.0.0.1:1080)
-socks5serverip =“”:仅当您的socks5服务器IP与听IP不同时
-tcptimeout =“”:time(s)(默认:0)