Una herramienta de red programable multiplataforma.
❤️ Shiliew: una aplicación de red diseñada para quienes valoran su tiempo
bash <(curl https://bash.ooo/nami.sh)
nami install brook
brook server -l :9999 -p hello
Es posible que desee utilizar
brook link
para personalizar algunos parámetros.
Brook GUI pasará diferentes variables globales al script en diferentes momentos, y el script solo necesita asignar el resultado del procesamiento a la variable global out
Antes de discutir el cliente GUI, primero hablemos del cliente de línea de comando brook
. Como sabemos, después de haber implementado el servidor, puede usar el cliente de línea de comando brook
para crear un proxy calcetines5 local o un proxy http en su máquina, y luego configurarlo en la configuración del proxy de su sistema o en su navegador para usar este proxy. Sin embargo:
Para conocer los detalles de Socks5 y el proxy http, puede leer este artículo.
El cliente GUI no utiliza calcetines5 ni el modo proxy http, por lo que no hay problema con algún software que no utilice el proxy del sistema. En su lugar, utiliza una tarjeta de red virtual para hacerse cargo de toda la red del sistema, incluido http3 basado en UDP. Además, Brook nos permite controlar las solicitudes de red mediante programación, por lo que es necesario tener conocimientos básicos de las solicitudes de red.
Nota: Cuando hablamos de direcciones, nos referimos a direcciones que incluyen el número de puerto, como una dirección de dominio:
google.com:443
o una dirección IP:8.8.8.8:53
google.com:443
8.8.8.8:53
, para consultar sobre la IP de google.com
google.com
, como 1.2.3.4
, a la aplicación.1.2.3.4:443
1.2.3.4:443
En el proceso anterior, la aplicación en realidad realiza dos solicitudes de red: una a la dirección IP 8.8.8.8:53
y otra a la dirección IP 1.2.3.4:443
. En otras palabras, el nombre de dominio es esencialmente un alias de la IP y debe obtener la IP del dominio para establecer una conexión.
Brook tiene una función de DNS falso, que puede analizar el nombre de dominio de las solicitudes de consulta que una aplicación envía al DNS del sistema y decidir cómo responder a la aplicación.
google.com:443
8.8.8.8:53
, para consultar sobre la IP de google.com
8.8.8.8:53
. Esto activará la variable in_dnsquery
, que contiene información como domain
240.0.0.1
240.0.0.1:443
240.0.0.1:443
240.0.0.1:443
, descubre que se trata de una IP falsa y convertirá la dirección IP falsa nuevamente a la dirección de dominio google.com:443
. Esto activará la variable in_address
, que contiene información como domainaddress
google.com:443
al servidor Brookgoogle.com
, como recibir 1.2.3.4
1.2.3.4:443
1.2.3.4:443
y devuelve los datos al cliente Brook.Sin embargo, si ocurren las siguientes situaciones, el nombre de dominio no será/no podrá ser analizado, lo que significa que el cliente Brook no sabrá/no podrá saber cuál es el nombre de dominio y lo tratará como una solicitud normal enviada a una dirección IP:
Para evitar la ineficacia del DNS falso, consulte este artículo.
google.com:443
8.8.8.8:53
, para consultar sobre la IP de google.com
8.8.8.8:53
. Esto activará la variable in_address
, que contiene información como ipaddress
8.8.8.8:53
al servidor Brook8.8.8.8:53
y devuelve el resultado, como 1.2.3.4
, al cliente Brook.1.2.3.4:443
1.2.3.4:443
1.2.3.4:443
. Esto activará la variable in_address
, que contiene información como ipaddress
1.2.3.4:443
al servidor Brook1.2.3.4:443
y devuelve los datos al cliente Brook.google.com:443
8.8.8.8:443
, para consultar sobre la IP de google.com
8.8.8.8:443
. Esto activará la variable in_address
, que contiene información como ipaddress
8.8.8.8:443
al servidor Brook8.8.8.8:443
y devuelve el resultado, como 1.2.3.4
, al cliente Brook.1.2.3.4:443
1.2.3.4:443
1.2.3.4:443
. Esto activará la variable in_address
, que contiene información como ipaddress
1.2.3.4:443
al servidor Brook1.2.3.4:443
y devuelve los datos al cliente Brook.Para evitar la ineficacia del DNS falso, consulte este artículo.
in_brooklinks
:in_dnsquery
, puede procesar según sea necesario, como por ejemplo:in_address
, puede procesar según sea necesario, como por ejemplo:in_httprequest
e in_httpresponse
.in_httprequest
, puede procesar según sea necesario, como por ejemplo:in_httpresponse
, puede procesar según sea necesario, como por ejemplo:Para obtener información detallada sobre las propiedades y respuestas de las variables, consulte el siguiente contenido.
variable | tipo | condición | momento | descripción | tipo de salida |
---|---|---|---|---|---|
en_brooklinks | mapa | / | Antes de conectar | Predefina múltiples enlaces de Brook y luego especifique mediante programación a cuál conectarse | mapa |
en_dnsquery | mapa | DNS falso: activado | Cuando se produce una consulta DNS | El script puede decidir cómo manejar esta solicitud. | mapa |
en_dirección | mapa | / | Al conectarse a una dirección | El script puede decidir cómo conectarse. | mapa |
en_httprequest | mapa | / | Cuando llega una solicitud HTTP(S) | el script puede decidir cómo manejar esta solicitud | mapa |
en_httprequest, en_httprespuesta | mapa | / | cuando llega una respuesta HTTP(S) | el script puede decidir cómo manejar esta respuesta | mapa |
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
_ | booleano | sin sentido | verdadero |
out
, ignorado si no es de tipo map
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
... | ... | ... | ... |
nombre personalizado | cadena | enlace de arroyo | arroyo://... |
... | ... | ... | ... |
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
dominio | cadena | nombre de dominio | google.com |
tipo | cadena | tipo de consulta | A |
rápido | cadena | ID de aplicación o ruta | com.google.Chrome.helper |
interfaz | cadena | interfaz de red. Sólo Mac | en0 |
out
, si es un tipo error
se registrará en el registro. Ignorado si no es de tipo map
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
bloquear | booleano | Si está bloqueado, por defecto false | FALSO |
IP | cadena | Especificar IP directamente, solo válido cuando type es A / AAAA | 1.2.3.4 |
sistema | booleano | Resolver por DNS del sistema, predeterminado false | FALSO |
derivación | booleano | Resolver evitando DNS, valor predeterminado false | FALSO |
brooklinkkey | cadena | Cuando necesite conectarse al servidor, en su lugar, conéctese al servidor especificado por la clave in_brooklinks | nombre personalizado |
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
red | cadena | Tipo de red, el valor tcp / udp | TCP |
dirección IP | cadena | Dirección de tipo IP. Solo hay dirección IP y dirección de dominio. Tenga en cuenta que no existe ninguna relación entre estos dos. | 1.2.3.4:443 |
dirección de dominio | cadena | Dirección de tipo de dominio, gracias a FakeDNS podemos obtener la dirección del nombre de dominio aquí | google.com:443 |
rápido | cadena | ID de aplicación o ruta | com.google.Chrome.helper |
interfaz | cadena | interfaz de red. Sólo Mac | en0 |
out
, si es un tipo error
se registrará en el registro. Ignorado si no es de tipo map
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
bloquear | booleano | Si está bloqueado, por defecto false | FALSO |
dirección IP | cadena | Dirección de tipo IP, reescribir destino | 1.2.3.4:443 |
dirección IP de bypassdns | cadena | Use Bypass DNS para obtener IP A o AAAA y reescriba el destino, solo válido cuando existe domainaddress , el valor A / AAAA | A |
derivación | booleano | Omitir, predeterminado false . Si es true y domainaddress , entonces se debe especificar ipaddress o dirección ipaddressfrombypassdns | FALSO |
mitm | booleano | Ya sea para realizar MITM, el valor predeterminado false . Sólo válido cuando network es tcp . Necesita instalar CA, ver más abajo | FALSO |
protocolomitm | cadena | El protocolo MITM debe especificarse explícitamente, el valor es http / https | https |
dominiomitmcert | cadena | El nombre de dominio del certificado MITM, que se toma de domainaddress de forma predeterminada. Si ipaddress y mitm son true y mitmprotocol es https entonces se debe especificar explícitamente | ejemplo.com |
mitmconcuerpo | booleano | Ya sea para manipular el cuerpo http, el valor predeterminado false . leerá el cuerpo de la solicitud y la respuesta en la memoria e interactuará con el script. El límite de memoria total de iOS 50M puede interrumpir el proceso | FALSO |
mitmautohandlecomprimir | booleano | Ya sea para descomprimir automáticamente el cuerpo http al interactuar con el script, el valor predeterminado false | FALSO |
tiempo de espera del cliente mitmclient | entero | Tiempo de espera para hablar MITM con el servidor, segundo, valor predeterminado 0 | 0 |
mitmserverreadtimeout | entero | Tiempo de espera para lectura MITM del cliente, segundo, valor predeterminado 0 | 0 |
mitmserverwritetimeout | entero | Tiempo de espera para escritura MITM en el cliente, segundo, valor predeterminado 0 | 0 |
brooklinkkey | cadena | Cuando necesite conectarse al servidor, en su lugar, conéctese al servidor especificado por la clave in_brooklinks | nombre personalizado |
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
URL | cadena | URL | https://example.com/hello |
Método | cadena | método HTTP | CONSEGUIR |
Cuerpo | bytes | cuerpo de solicitud HTTP | / |
... | cadena | otros campos son encabezados HTTP | / |
out
, debe configurarse como una solicitud o respuesta
Llave | Tipo | Descripción | Ejemplo |
---|---|---|---|
Código de estado | entero | código de estado HTTP | 200 |
Cuerpo | bytes | cuerpo de respuesta HTTP | / |
... | cadena | otros campos son encabezados HTTP | / |
out
, debe configurarse como una respuesta
En Brook GUI, los scripts se resumen en Módulos . Ya hay algunos módulos, y no hay magia, simplemente combina automáticamente _header.tengo y _footer.tengo, por lo que solo necesitas escribir el módulo en sí.
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
Si está utilizando tun2brook, puede combinar manualmente varios módulos en un script completo de la siguiente manera. Por ejemplo:
cat _header.tengo > my.tengo
cat block_google_secure_dns.tengo >> my.tengo
cat block_aaaa.tengo >> my.tengo
cat _footer.tengo >> my.tengo
Sintaxis del lenguaje Tengo
Biblioteca
texto: expresiones regulares, conversión de cadenas y manipulación
matemáticas: constantes y funciones matemáticas
tiempos: funciones relacionadas con el tiempo
rand: funciones aleatorias
fmt: funciones de formato
json: funciones JSON
enum: funciones de enumeración
hexadecimal: funciones de codificación y decodificación hexadecimal
base64: funciones de codificación y decodificación base64
brook
: módulo arroyo
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
Si está escribiendo scripts complejos, es posible que la GUI no sea conveniente para la depuración. Se recomienda utilizar tun2brook en el escritorio para depurar con fmt.println
https://txthinking.github.io/ca/ca.pem
SO | Cómo |
---|---|
iOS | https://www.youtube.com/watch?v=HSGPC2vpDGk |
Androide | Android tiene CA de usuario y CA de sistema, debe instalarse en la CA del sistema después de ROOT |
macos | nami install mad ca.txthinking , sudo mad install --ca ~/.nami/bin/ca.pem |
ventanas | nami install mad ca.txthinking , Administrador: mad install --ca ~/.nami/bin/ca.pem |
Es posible que algún software no lea la CA del sistema; puede usar
curl --cacert ~/.nami/bin/ca.pem
para depurar
Brook OpenWRT: Soporta perfectamente IPv4/IPv6/TCP/UDP
La postura de Brook sobre IPv6 es positiva. Si su servidor o entorno local no tiene una pila de IPv6, lea este artículo.
brook link --address
, entonces el cliente Brook intentará resolver la IP del dominio usando DNS local, prefiriendo el registro AAAA. Por ejemplo:Connectivity Check
. Si algunas veces funciona pero otras no, esto indica inestabilidad.Test IPv4 TCP
para realizar pruebas; Esta prueba ha codificado la dirección IP, por lo que no activa la resolución DNS.Test IPv4 UDP
para realizar pruebas; Esta prueba ha codificado la dirección IP, por lo que no activa la resolución DNS.Test IPv6 TCP
para realizar pruebas; Esta prueba ha codificado la dirección IP, por lo que no activa la resolución DNS.Test IPv6 UDP
para realizar pruebas; Esta prueba ha codificado la dirección IP, por lo que no activa la resolución DNS.Echo Client
para realizar pruebas. Si el servidor de eco ingresado es una dirección de dominio, activará la resolución de DNS.Block Google Secure DNS
es suficiente. Para otros casos, consulte este artículo.Block Google Secure DNS
Bypass Geo
Bypass Apple
: para evitar problemas al recibir notificaciones de mensajes de Apple.Bypass China domain
o Bypass China domain A
: El primero utiliza Bypass DNS
para obtener la IP, luego Bypass Geo
u otros módulos deciden si omitir; este último se omite directamente después de obtener la IP con Bypass DNS
utilizando registros A. Esto último es necesario si su local no admite IPv6. Cada subcomando tiene un parámetro --example
que puede imprimir el ejemplo mínimo de uso
Brook: una herramienta de red programable multiplataforma
Arroyo
brook --help
Uso :
Brook [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...]
--blockCIDR4List ="": Un CIDR por línea, https://, http:// o ruta absoluta del archivo local, como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr4 .TXT. Funciona con servidor/wsserver/wssserver/quicserver
--blockCIDR6List ="": Un CIDR por línea, https://, http:// o ruta absoluta del archivo local, como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr6 .TXT. Funciona con servidor/wsserver/wssserver/quicserver
--blockDomainList ="": Un dominio por línea, modo de coincidencia de sufijo. https://, http:// o ruta absoluta del archivo local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt. Funciona con servidor/wsserver/wssserver/quicserver
--blockGeoIP ="": Bloquea IP por código de país geográfico, como EE. UU. Funciona con servidor/wsserver/wssserver/quicserver
--blockListUpdateInterval ="": Lista de actualización --blockDomainList,--blockCIDR4List,--blockCIDR6List intervalo, segundo. predeterminado 0, solo se lee una vez al inicio (predeterminado: 0)
--clientHKDFInfo ="": información de HKDF del cliente, la mayoría de las veces no es necesario cambiar esto, si se cambia, todos y cada uno de los enlaces de arroyo en el lado del cliente deben ser iguales, me refiero a cada uno (predeterminado: "arroyo")
--dialWithDNS ="": Cuando sea necesario resolver un nombre de dominio, utilice el DNS especificado. Como 8.8.8.8:53 o https://dns.google/dns-query?address=8.8.8.8%3A443, la dirección es obligatoria. Tenga en cuenta que para los comandos del lado del cliente, esto no afecta al cliente que pasa la dirección del dominio al servidor.
--dialWithDNSPrefer ="": Esto se usa con el parámetro dialWithDNS. Prefiera un registro o un registro AAAA. El valor es A o AAAA
--dialWithIP4 ="": Cuando la máquina actual establece una conexión de red con el IPv4 externo, tanto TCP como UDP, se utiliza para especificar el IPv4 utilizado
--dialWithIP6 ="": Cuando la máquina actual establece una conexión de red con el IPv6 externo, tanto TCP como UDP, se utiliza para especificar el IPv6 utilizado
--dialWithNIC ="": Cuando la máquina actual establece una conexión de red con el exterior, tanto TCP como UDP, se utiliza para especificar la NIC utilizada
--dialWithSocks5 ="": Cuando la máquina actual establece una conexión de red con el exterior, tanto TCP como UDP, con su proxy calcetines5, como 127.0.0.1:1081
--dialWithSocks5Password ="": Si hay
--dialWithSocks5TCPTimeout ="": tiempo(s) (predeterminado: 0)
--dialWithSocks5UDPTimeout ="": tiempo(s) (predeterminado: 60)
--dialWithSocks5Username ="": Si hay
--ipLimitInterval ="": Intervalo(s) para ipLimitMax (predeterminado: 0)
--ipLimitMax ="": Limite la cantidad de direcciones IP del cliente, tenga cuidado al usar este parámetro, ya que el cliente puede tener una IP dinámica. Funciona con server/wsserver/wssserver/quicserver (predeterminado: 0)
--ipLimitWait ="": Cuánto tiempo esperar para la recuperación después de exceder ipLimitMax (predeterminado: 0)
--log ="": Habilitar registro. Un valor válido es la ruta del archivo o 'consola'. Envíeme SIGUSR1 para restablecer el archivo de registro en el sistema Unix. Si desea depurar la biblioteca SOCKS5, configure env SOCKS5_DEBUG=true
--pid ="": Una ruta de archivo utilizada para almacenar pid. Envíeme SIGUSR1 para restablecer el archivo --serverLog en el sistema Unix
--pprof ="": ir a http pprof dirección de escucha, como por ejemplo: 6060
--prometheus ="": dirección de escucha http de prometheus, como por ejemplo: 7070. Si se transmite en la red pública, se recomienda usarlo con nico
--prometheusPath ="": ruta http de prometheus, como /xxx. Si se transmite en la red pública, se recomienda un valor difícil de adivinar.
--serverHKDFInfo ="": información HKDF del servidor, la mayoría de las veces no es necesario cambiar esto, si se cambia, todos y cada uno de los enlaces de arroyo en el lado del cliente deben ser iguales, me refiero a cada uno (predeterminado: "arroyo")
--serverLog ="": Habilite el registro del servidor, el tráfico y más. Un valor válido es la ruta del archivo o 'consola'. Envíeme SIGUSR1 para restablecer el archivo de registro en el sistema Unix. Mutuamente excluyentes con el parámetro --log. Funciona con server/wsserver/wssserver/quicserver con protocolo brook
--speedLimit ="": Velocidad límite (b), 500 kb/s como: 500000, funciona con server/wsserver/wssserver/quicserver (predeterminado: 0)
--tag ="": La etiqueta se puede utilizar para el proceso y se agregará al registro o al registro del servidor, como por ejemplo: 'clave1:valor1'. Todas las etiquetas también se agregarán como parámetros de consulta una por una a la API de usuario.
--userAPI ="": Cuando crea su propio sistema de usuario, Brook Server enviará una solicitud GET a su userAPI para verificar si el token es válido, por ejemplo: https://your-api-server.com/a_unpredictable_path. Sí, se recomienda agregar una ruta impredecible a su API https; por supuesto, también puede usar la API http para la comunicación de red interna. El formato de solicitud es https://your-api-server.com/a_unpredictable_path?token=xxx. Cuando la respuesta es 200, el cuerpo debe ser el identificador único del usuario, como por ejemplo el ID de usuario; Se considera que todos los demás códigos de estado representan un usuario ilegítimo y, en estos casos, el cuerpo debe ser una cadena que describa el error. Debe usarse con --serverLog y server/wsserver/wssserver/quicserver con protocolo brook. Para obtener más información, lea https://github.com/txthinking/brook/blob/master/protocol/user.md
--userAPIInvalidCacheTime ="": Una vez que se verifica que un token no es válido, no se solicitará a la API de usuario que se valide nuevamente durante un período determinado. Se debe establecer un valor razonable; de lo contrario, afectará el rendimiento de cada conexión entrante. Tenga en cuenta que esto puede afectar la experiencia del usuario cuando cambia el estado del usuario de no válido a válido en su sistema de usuario (predeterminado: 1800).
--userAPIValidCacheTime ="": Una vez que un token se verifica y es válido, no se solicitará que la API de usuario vuelva a validarse durante un período determinado. Se debe establecer un valor razonable; de lo contrario, afectará el rendimiento de cada conexión entrante (predeterminado: 3600)
--version, -v : imprime la versión
Inicie un servidor Brook que admita TCP y UDP
--blockCIDR4List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockCIDR6List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockDomainList ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockGeoIP ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--ejemplo : muestra un ejemplo mínimo de uso
--listen, -l ="": Dirección de escucha, como: ':9999'
--contraseña, -p ="": Contraseña del servidor
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--updateListInterval ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar (predeterminado: 0)
Inicie un cliente brook que admita tcp y udp. Puede abrir un proxy calcetines5, [src <-> calcetines5 <-> $ cliente brook <-> $ servidor brook <-> dst]
--ejemplo : muestra un ejemplo mínimo de uso
--http ="": Dónde escuchar las conexiones de proxy HTTP
--link ="": enlace de brook, puedes obtenerlo a través del enlace de $ brook. Se ignorarán los parámetros wssserver y contraseña.
--contraseña, -p ="": Contraseña del servidor Brook
--server, -s ="": Dirección del servidor Brook, como: 1.2.3.4:9999
--socks5 ="": Dónde escuchar las conexiones SOCKS5 (predeterminado: 127.0.0.1:1080)
--socks5ServerIP ="": Sólo si la IP de su servidor Socks5 es diferente de la IP de escucha
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
Inicie un servidor brook wsserver que admita tcp y udp. Abre un servidor http estándar y un servidor websocket.
--blockCIDR4List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockCIDR6List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockDomainList ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockGeoIP ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--ejemplo : muestra un ejemplo mínimo de uso
--listen, -l ="": Dirección de escucha, como: ':80'
--contraseña, -p ="": Contraseña del servidor
--path ="": ruta URL (predeterminada: /ws)
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--updateListInterval ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar (predeterminado: 0)
-- without BrookProtocol : Los datos no se cifrarán con el protocolo Brook.
--xForwardedFor : Reemplace el campo de en --log, tenga en cuenta que esto puede ser falsificado
Inicie un brook wsclient que admita tcp y udp. Puede abrir un proxy calcetines5, [src <-> calcetines5 <-> $ brook wsclient <-> $ brook wsserver <-> dst]
--ejemplo : muestra un ejemplo mínimo de uso
--http ="": Dónde escuchar las conexiones de proxy HTTP
--link ="": enlace de brook, puedes obtenerlo a través del enlace de $ brook. Se ignorarán los parámetros wssserver y contraseña.
--contraseña, -p ="": contraseña del servidor ws de Brook
--socks5 ="": Dónde escuchar las conexiones SOCKS5 (predeterminado: 127.0.0.1:1080)
--socks5ServerIP ="": Sólo si la IP de su servidor Socks5 es diferente de la IP de escucha
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--wsserver, -s ="": Dirección del servidor ws de Brook, como: ws://1.2.3.4:80, si no hay ruta, se utilizará /ws. No omitas el puerto bajo ninguna circunstancia.
Inicie un servidor brook wss que admita tcp y udp. Abre un servidor https estándar y un servidor websocket
--blockCIDR4List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockCIDR6List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockDomainList ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockGeoIP ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--cert ="": La ruta absoluta del archivo de certificado para el dominio, como /path/to/cert.pem. Si cert o certkey están vacíos, se emitirá un certificado automáticamente
--certkey ="": La ruta absoluta del archivo de clave de certificado para el dominio, como /path/to/certkey.pem. Si cert o certkey están vacíos, se emitirá un certificado automáticamente
--domainaddress ="": Como por ejemplo: dominio.com:443. Si elige emitir certificados automáticamente, el dominio debe haberse resuelto en la IP del servidor y también se utilizará el puerto 80.
--ejemplo : muestra un ejemplo mínimo de uso
--contraseña, -p ="": Contraseña del servidor
--path ="": ruta URL (predeterminada: /ws)
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--updateListInterval ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar (predeterminado: 0)
-- without BrookProtocol : Los datos no se cifrarán con el protocolo Brook.
Inicie un brook wssclient que admita tcp y udp. Puede abrir un proxy calcetines5, [src <-> calcetines5 <-> $ brook wssclient <-> $ brook wssserver <-> dst]
--ejemplo : muestra un ejemplo mínimo de uso
--http ="": Dónde escuchar las conexiones de proxy HTTP
--link ="": enlace de brook, puedes obtenerlo a través del enlace de $ brook. Se ignorarán los parámetros wssserver y contraseña.
--contraseña, -p ="": contraseña del servidor wss de Brook
--socks5 ="": Dónde escuchar las conexiones SOCKS5 (predeterminado: 127.0.0.1:1080)
--socks5ServerIP ="": Sólo si la IP de su servidor Socks5 es diferente de la IP de escucha
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--wssserver, -s ="": dirección de Brook wssserver, como: wss://google.com:443, si no hay ruta, se utilizará /ws. No omitas el puerto bajo ninguna circunstancia.
Inicie un servidor quic brook que admita tcp y udp.
--blockCIDR4List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockCIDR6List ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockDomainList ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--blockGeoIP ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar
--cert ="": La ruta absoluta del archivo de certificado para el dominio, como /path/to/cert.pem. Si cert o certkey están vacíos, se emitirá un certificado automáticamente
--certkey ="": La ruta absoluta del archivo de clave de certificado para el dominio, como /path/to/certkey.pem. Si cert o certkey están vacíos, se emitirá un certificado automáticamente
--domainaddress ="": Como por ejemplo: dominio.com:443. Si elige emitir certificados automáticamente, el dominio debe haberse resuelto en la IP del servidor y también se utilizará el puerto 80.
--ejemplo : muestra un ejemplo mínimo de uso
--contraseña, -p ="": Contraseña del servidor
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
--updateListInterval ="": Esta opción se eliminará en una versión futura; utilice la opción global en su lugar (predeterminado: 0)
-- without BrookProtocol : Los datos no se cifrarán con el protocolo Brook.
Inicie un cliente rápido de Brook que admita TCP y UDP. Puede abrir un proxy calcetines5, [src <-> calcetines5 <-> $ brook quicclient <-> $ brook quicserver <-> dst]. (Se ignora el parámetro de marcación global)
--ejemplo : muestra un ejemplo mínimo de uso
--http ="": Dónde escuchar las conexiones de proxy HTTP
--link ="": enlace de brook, puedes obtenerlo a través del enlace de $ brook. Se ignorarán los parámetros wssserver y contraseña.
--socks5 ="": Dónde escuchar las conexiones SOCKS5 (predeterminado: 127.0.0.1:1080)
--socks5ServerIP ="": Sólo si la IP de su servidor Socks5 es diferente de la IP de escucha
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--udpTimeout ="": tiempo(s) (predeterminado: 0)
Retransmita el tráfico de la red a través de Brook, que admite TCP y UDP. Acceder a [desde la dirección] es igual a acceder a [a la dirección], [src <-> desde la dirección <-> $ brook server/wsserver/wssserver/quicserver <-> a la dirección]
--ejemplo : muestra un ejemplo mínimo de uso
--from, -f, -l ="": Dirección de escucha: como ':9999'
--link ="": enlace de brook, puedes obtenerlo a través del enlace de $ brook. Los parámetros del servidor y la contraseña serán ignorados.
--contraseña, -p ="": Contraseña
--server, -s ="": servidor brook o brook wsserver o brook wssserver o brook quicserver, como: 1.2.3.4:9999, ws://1.2.3.4:9999, wss://dominio:443/ws, quic://dominio.com:443
--tcpTimeout ="": tiempo(s) (predeterminado: 0)
--to, -t ="": Dirección a la que se retransmite, como: 1.2.3.4:9999
--udpTimeout ="": tiempo(s) (predeterminado: 0)
Ejecute un servidor dns sobre brook, que admite TCP y UDP, [src <-> $ brook dnserversoverbrook <-> $ brook server/wsserver/wssserver/quicserver <-> dns] o [src <-> $ brook dnsserveroverbrook <-> dnsParaBypass]
--blockDomainList ="": Un dominio por línea, modo de coincidencia de sufijo. https://, http:// o ruta de archivo absoluta local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--bypassDomainList ="": Un dominio por línea, modo de coincidencia de sufijo. https://, http:// o ruta de archivo absoluta local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--disableA : deshabilitar una consulta
--disableAAAA : deshabilita la consulta AAAA
--dns ="": Servidor DNS para resolver dominios que NO están en la lista (predeterminado: 8.8.8.8:53)
--dnsForBypass ="": Servidor DNS para resolver dominios en la lista de omisión. Como 223.5.5.5:53 o https://dns.alidns.com/dns-Query?address=223.5.5.5:443, la dirección es necesaria (predeterminada: 223.5.5:53)
-Exemplo : Muestre un ejemplo mínimo de uso
--link = "": Brook Link, puede obtenerlo a través de $ Brook Link. Los parámetros del servidor y la contraseña se ignorarán
--listen, -l = "": Escuchar dirección, como: 127.0.0.1:53
- -password, -p = "": contraseña
--server, -s = "": Brook Server o Brook Wsserver o Brook WSServer o Brook Quicserver, como: 1.2.3.4:9999, ws: //1.2.3.4: 9999, wss: //domain.com: 443/443/443/ WS, Quic: //domain.com: 443
-tcpTimeout = "": tiempo (s) (predeterminado: 0)
--UDPTIMEOUT = "": TIME (S) (predeterminado: 0)
Generar un enlace de Brook
--address = "": Cuando el servidor es Brook WSServer o Brook WSServer o Brook Quicserver, especifique la dirección en lugar de resolver direcciones del host, como 1.2.3.4:443
--ca = "": Cuando el servidor es Brook WSServer o Brook Quicserver, especifique CA para certificado no confiable, como /path/to/ca.pem
--clienthkdfinfo = "": Información de HKDF del cliente, la mayoría del tiempo no necesita cambiar esto, lea el protocolo Brook si no sabe qué es esto
-Exemplo : Muestre un ejemplo mínimo de uso
--fragment = "": Cuando el servidor es Brook WSServer, divida el Clienthello en múltiples fragmentos y luego envíelos uno por uno con retrasos (milisegundos). El formato es min_length: max_length: min_delay: max_delay, no puede ser cero, como 50: 100: 10: 50
--insecure : cuando el servidor es Brook WSServer o Brook Quicserver, el cliente no verifica la cadena de certificados del servidor y el nombre de host
--name = "": Dale un nombre a este servidor
- -password, -p = "": contraseña
--server, -s = "": Support Brook Server, Brook Wsserver, Brook WSSServer, Socks5 Server, Brook Quicserver. Como: 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 = "": Información HKDF del servidor, la mayoría del tiempo no necesita cambiar esto, lea el protocolo Brook si no sabe qué es esto
--tlsfingerprint = "": cuando el servidor es Brook WSServer, seleccione TLS Fingerprint, el valor puede ser: Chrome
--token = "": un token representa la identidad de un usuario. Una cadena codificada en hexadecimal. El servidor debe tener -Userapi habilitado. Tenga en cuenta que: solo compatible con Brook GUI (excepto OpenWrt) y Tun2brook
--UdPoverStream : Cuando el servidor es Brook Quicserver, UDP sobre la transmisión. En circunstancias normales, necesita este parámetro porque el tamaño de datagrama máximo para la CIC es muy pequeño. Nota: Solo Brook CLI y Tun2brook Suppport por ahora
--UdPoversTCP : Cuando el servidor es Brook Server, UDP a través de TCP
--username, -u = "": nombre de usuario, cuando el servidor es el servidor Socks5
--withoutbrookprotocol : cuando el servidor es Brook WSServer o Brook WSSServer o Brook Quicserver, los datos no se encriptarán con Brook Protocol
Ejecute un cliente y conéctese con un enlace Brook, que admite TCP y UDP. Puede iniciar un proxy Socks5, [SRC <-> SOCKS5 <-> $ Brook Connect <-> $ Brook Server/WSServer/WSSServer/Quicserver <-> DST]
-Exemplo : Muestre un ejemplo mínimo de uso
--http = "": dónde escuchar las conexiones proxy http
--link, -l = "": Brook Link, puede obtenerlo a través de $ Brook Link
--socks5 = "": dónde escuchar las conexiones Socks5 (predeterminada: 127.0.0.1:1080)
--socks5ServerIP = "": solo si su IP del servidor Socks5 es diferente de escuchar IP
-tcpTimeout = "": tiempo (s) (predeterminado: 0)