Uma ferramenta de rede programável multiplataforma.
❤️ Shiliew - Um aplicativo de rede desenvolvido para quem valoriza seu tempo
bash <(curl https://bash.ooo/nami.sh)
nami install brook
brook server -l :9999 -p hello
Você pode querer usar
brook link
para personalizar alguns parâmetros
Brook GUI passará diferentes variáveis globais para o script em momentos diferentes, e o script só precisa atribuir o resultado do processamento à variável global out
Antes de discutir o cliente GUI, vamos primeiro falar sobre o cliente de linha de comando brook
. Como sabemos, depois de implantar o servidor, você pode usar a linha de comando client brook
para criar um proxy Socks5 local ou proxy http em sua máquina e, em seguida, configurá-lo nas configurações de proxy do sistema ou em seu navegador para usar este proxy. No entanto:
Para obter detalhes sobre o Socks5 e o proxy http, você pode ler este artigo.
O cliente GUI não usa o modo Socks5 e proxy http, portanto, não há problema com alguns softwares que não usam o proxy do sistema. Em vez disso, ele usa uma placa de rede virtual para assumir o controle de toda a rede do sistema, incluindo http3 baseado em UDP. Além disso, Brook nos permite controlar as solicitações de rede de forma programática, por isso é necessário ter conhecimentos básicos de solicitações de rede.
Observação: quando falamos de endereços, queremos dizer endereços que incluem o número da porta, como um endereço de domínio:
google.com:443
ou um endereço IP:8.8.8.8:53
google.com:443
8.8.8.8:53
, para consultar o IP de google.com
google.com
, como 1.2.3.4
, para o aplicativo1.2.3.4:443
1.2.3.4:443
No processo acima, o aplicativo faz duas solicitações de rede: uma para o endereço IP 8.8.8.8:53
e outra para o endereço IP 1.2.3.4:443
. Em outras palavras, o nome de domínio é essencialmente um alias para o IP e deve obter o IP do domínio para estabelecer uma conexão.
Brook tem um recurso Fake DNS, que pode analisar o nome de domínio das solicitações de consulta que um aplicativo envia ao DNS do sistema e decidir como responder ao aplicativo.
google.com:443
8.8.8.8:53
, para consultar o IP do google.com
8.8.8.8:53
. Isso irá acionar a variável in_dnsquery
, carregando informações como domain
240.0.0.1
240.0.0.1:443
240.0.0.1:443
240.0.0.1:443
, descobre que este é um IP falso e converterá o endereço IP falso de volta para o endereço de domínio google.com:443
. Isso irá acionar a variável in_address
, carregando informações como domainaddress
google.com:443
para o servidor Brookgoogle.com
, como receber 1.2.3.4
1.2.3.4:443
1.2.3.4:443
e retorna os dados para o cliente BrookNo entanto, se ocorrerem as seguintes situações, o nome de domínio não será/não poderá ser analisado, o que significa que o cliente Brook não saberá/não poderá saber qual é o nome de domínio e o tratará como uma solicitação normal enviada a um endereço IP:
Para evitar a ineficácia do DNS falso, consulte este artigo.
google.com:443
8.8.8.8:53
, para consultar o IP do google.com
8.8.8.8:53
. Isso irá acionar a variável in_address
, carregando informações como ipaddress
8.8.8.8:53
para o servidor Brook8.8.8.8:53
e retorna o resultado, como 1.2.3.4
, para o cliente Brook1.2.3.4:443
1.2.3.4:443
1.2.3.4:443
. Isso irá acionar a variável in_address
, carregando informações como ipaddress
1.2.3.4:443
para o servidor Brook1.2.3.4:443
e retorna os dados para o cliente Brookgoogle.com:443
8.8.8.8:443
, para consultar o IP do google.com
8.8.8.8:443
. Isso irá acionar a variável in_address
, carregando informações como ipaddress
8.8.8.8:443
para o servidor Brook8.8.8.8:443
e retorna o resultado, como 1.2.3.4
, para o cliente Brook1.2.3.4:443
1.2.3.4:443
1.2.3.4:443
. Isso irá acionar a variável in_address
, carregando informações como ipaddress
1.2.3.4:443
para o servidor Brook1.2.3.4:443
e retorna os dados para o cliente BrookPara evitar a ineficácia do DNS falso, consulte este artigo.
in_brooklinks
é acionada:in_dnsquery
é acionada, você pode processar conforme necessário, como:in_address
é acionada, você pode processar conforme necessário, como:in_httprequest
e in_httpresponse
.in_httprequest
é acionada, você pode processar conforme necessário, como:in_httpresponse
é acionada, você pode processar conforme necessário, como:Para obter informações detalhadas sobre as propriedades e respostas das variáveis, consulte o conteúdo a seguir.
variável | tipo | doença | tempo | descrição | tipo de saída |
---|---|---|---|---|---|
in_brooklinks | mapa | / | Antes de conectar | Predefinir vários links de riacho e, em seguida, especificar programaticamente a qual deles se conectar | mapa |
in_dnsquery | mapa | DNS falso: ativado | Quando ocorre uma consulta DNS | O script pode decidir como lidar com esta solicitação | mapa |
endereço_de_entrada | mapa | / | Ao conectar-se a um endereço | script pode decidir como se conectar | mapa |
in_httprequest | mapa | / | Quando uma solicitação HTTP(S) chega | o script pode decidir como lidar com esta solicitação | mapa |
in_httprequest,in_httpresponse | mapa | / | quando uma resposta HTTP(S) chega | o script pode decidir como lidar com esta resposta | mapa |
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
_ | bool | sem sentido | verdadeiro |
out
, ignorado se não for do tipo map
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
... | ... | ... | ... |
nome personalizado | corda | link do riacho | ribeiro://... |
... | ... | ... | ... |
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
domínio | corda | nome de domínio | google.com |
tipo | corda | tipo de consulta | UM |
aplicativo | corda | ID ou caminho do aplicativo | com.google.Chrome.helper |
interface | corda | interface de rede. Somente Mac | en0 |
out
, se for do tipo error
será registrado no log. Ignorado se não for do tipo map
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
bloquear | bool | Seja Block, padrão false | falso |
IP | corda | Especifique o IP diretamente, válido apenas quando type for A / AAAA | 1.2.3.4 |
sistema | bool | Resolver por DNS do sistema, padrão false | falso |
ignorar | bool | Resolver ignorando DNS, padrão false | falso |
brooklinkkey | corda | Quando precisar conectar o servidor, conecte-se ao servidor especificado pela chave in_brooklinks | nome personalizado |
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
rede | corda | Tipo de rede, o valor tcp / udp | tcp |
endereço IP | corda | Endereço do tipo IP. Existe apenas endereço IP e endereço de domínio. Observe que não há relação entre esses dois | 1.2.3.4:443 |
endereço de domínio | corda | Endereço do tipo de domínio, por causa do FakeDNS podemos obter o endereço do nome de domínio aqui | google.com:443 |
aplicativo | corda | ID ou caminho do aplicativo | com.google.Chrome.helper |
interface | corda | interface de rede. Somente Mac | en0 |
out
, se for do tipo error
será registrado no log. Ignorado se não for do tipo map
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
bloquear | bool | Seja Block, padrão false | falso |
endereço IP | corda | Endereço de tipo IP, destino de reescrita | 1.2.3.4:443 |
endereçoipfrombypassdns | corda | Use Bypass DNS para obter IP A ou AAAA e reescrever o destino, válido apenas quando existir domainaddress , o valor A / AAAA | UM |
ignorar | bool | Ignorar, padrão false . Se true e domainaddress , então ipaddress ou ipaddressfrombypassdns deverá ser especificado | falso |
mitim | bool | Se deve executar o MITM, o padrão é false . Válido apenas quando network é tcp . Precisa instalar o CA, veja abaixo | falso |
protocolo mit | corda | O protocolo MITM precisa ser especificado explicitamente, o valor é http / https | https |
domínio mitmcert | corda | O nome de domínio do certificado MITM, obtido de domainaddress por padrão. Se ipaddress e mitm forem true e mitmprotocol for https então deve ser especificado explicitamente | exemplo.com |
mitmwithbody | bool | Seja para manipular o corpo http, o padrão é false . irá ler o corpo da solicitação e resposta na memória e interagir com o script. O limite total de memória de 50 milhões do iOS pode matar o processo | falso |
mitmautohandlecompress | bool | Se deve descompactar automaticamente o corpo http ao interagir com o script, o padrão é false | falso |
mitmclienttimeout | interno | Tempo limite para conversa MITM com o servidor, segundo, padrão 0 | 0 |
mitmserverreadtimeout | interno | Tempo limite para leitura MITM do cliente, segundo, padrão 0 | 0 |
mitmserverwritetimeout | interno | Tempo limite para gravação MITM no cliente, segundo, padrão 0 | 0 |
brooklinkkey | corda | Quando precisar conectar o servidor, conecte-se ao servidor especificado pela chave in_brooklinks | nome personalizado |
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
URL | corda | URL | https://example.com/hello |
Método | corda | Método HTTP | PEGAR |
Corpo | bytes | Corpo da solicitação HTTP | / |
... | corda | outros campos são cabeçalhos HTTP | / |
out
, deve ser definido como uma solicitação ou resposta
Chave | Tipo | Descrição | Exemplo |
---|---|---|---|
Código de status | interno | Código de status HTTP | 200 |
Corpo | bytes | Corpo de resposta HTTP | / |
... | corda | outros campos são cabeçalhos HTTP | / |
out
, deve ser definido como uma resposta
Na GUI do Brook, os scripts são abstraídos em Módulos . Já existem alguns módulos, e não há mágica, apenas combina automaticamente _header.tengo e _footer.tengo, então você só precisa escrever o próprio módulo.
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
Se estiver usando tun2brook, você pode combinar manualmente vários módulos em um script completo da seguinte maneira. Por exemplo:
cat _header.tengo > my.tengo
cat block_google_secure_dns.tengo >> my.tengo
cat block_aaaa.tengo >> my.tengo
cat _footer.tengo >> my.tengo
Sintaxe da linguagem Tengo
Biblioteca
texto: expressões regulares, conversão de string e manipulação
matemática: constantes e funções matemáticas
tempos: funções relacionadas ao tempo
rand: funções aleatórias
fmt: funções de formatação
json: funções JSON
enum: Funções de enumeração
hex: funções de codificação e decodificação hexadecimais
base64: funções de codificação e decodificação base64
brook
: módulo de riacho
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
Se você estiver escrevendo scripts complexos, a GUI pode não ser conveniente para depuração. Recomenda-se usar tun2brook no desktop para depurar com fmt.println
https://txthinking.github.io/ca/ca.pem
SO | Como |
---|---|
iOS | https://www.youtube.com/watch?v=HSGPC2vpDGk |
Android | Android possui CA de usuário e CA de sistema, deve ser instalado na CA de sistema após ROOT |
macOS | nami install mad ca.txthinking , sudo mad install --ca ~/.nami/bin/ca.pem |
Windows | nami install mad ca.txthinking , Admin: mad install --ca ~/.nami/bin/ca.pem |
Alguns softwares podem não ler a CA do sistema, você pode usar
curl --cacert ~/.nami/bin/ca.pem
para depurar
Brook OpenWRT: Suporta perfeitamente IPv4/IPv6/TCP/UDP
A postura de Brook em relação ao IPv6 é positiva, se o seu servidor ou ambiente local não possui uma pilha IPv6, leia este artigo.
brook link --address
, o cliente Brook tentará resolver o IP do domínio usando DNS local, preferindo o registro AAAA. Por exemplo:Connectivity Check
. Se funcionar algumas vezes, mas não outras, isso indica instabilidade.Test IPv4 TCP
para teste; esse teste codificou o endereço IP, portanto, não aciona a resolução de DNS.Test IPv4 UDP
para teste; esse teste codificou o endereço IP, portanto, não aciona a resolução de DNS.Test IPv6 TCP
para teste; esse teste codificou o endereço IP, portanto, não aciona a resolução de DNS.Test IPv6 UDP
para teste; esse teste codificou o endereço IP, portanto, não aciona a resolução de DNS.Echo Client
para teste. Se o servidor de eco inserido for um endereço de domínio, ele acionará a resolução DNS.Block Google Secure DNS
é suficiente. Para outros casos, consulte este artigo.Block Google Secure DNS
Bypass Geo
Bypass Apple
: para evitar problemas no recebimento de notificações de mensagens da Apple.Bypass China domain
ou Bypass China domain A
: O primeiro usa Bypass DNS
para obter o IP e, em seguida, Bypass Geo
ou outros módulos decidem se devem ignorar; o último ignora diretamente após obter o IP com Bypass DNS
usando registros A. Este último é necessário se o seu local não suportar IPv6. Cada subcomando possui um parâmetro --example
que pode imprimir o exemplo mínimo de uso
Brook – Uma ferramenta de rede programável multiplataforma
Ribeiro
brook --help
Uso :
Brook [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...]
--blockCIDR4List = "": Um CIDR por linha, https://, http:// ou caminho absoluto do arquivo local, como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr4 .TXT. Funciona com servidor/wsserver/wssserver/quicserver
--blockCIDR6List = "": Um CIDR por linha, https://, http:// ou caminho absoluto do arquivo local, como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_cidr6 .TXT. Funciona com servidor/wsserver/wssserver/quicserver
--blockDomainList = "": Um domínio por linha, modo de correspondência de sufixo. https://, http:// ou caminho absoluto do arquivo local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt. Funciona com servidor/wsserver/wssserver/quicserver
--blockGeoIP ="": Bloqueia IP por código geográfico do país, como EUA. Funciona com servidor/wsserver/wssserver/quicserver
--blockListUpdateInterval = "": Lista de atualização --blockDomainList,--blockCIDR4List,--blockCIDR6List intervalo, segundo. padrão 0, leia apenas uma vez na inicialização (padrão: 0)
--clientHKDFInfo = "": informações do cliente HKDF, na maioria das vezes você não precisa alterar isso, se alterado, todos e cada link de riacho no lado do cliente devem ser iguais, quero dizer, cada um (padrão: "brook")
--dialWithDNS ="": Quando um nome de domínio precisar ser resolvido, use o DNS especificado. Como 8.8.8.8:53 ou https://dns.google/dns-query?address=8.8.8.8%3A443, o endereço é obrigatório. Observe que para comandos do lado do cliente, isso não afeta o cliente que passa o endereço do domínio para o servidor
--dialWithDNSPrefer ="": É usado com o parâmetro dialWithDNS. Prefira um disco A ou um disco AAAA. O valor é A ou AAAA
--dialWithIP4 ="": Quando a máquina atual estabelece uma conexão de rede com o IPv4 externo, tanto TCP quanto UDP, é usado para especificar o IPv4 usado
--dialWithIP6 ="": Quando a máquina atual estabelece uma conexão de rede com o IPv6 externo, tanto TCP quanto UDP, é usado para especificar o IPv6 usado
--dialWithNIC ="": Quando a máquina atual estabelece uma conexão de rede externa, tanto TCP quanto UDP, ela é usada para especificar a NIC usada
--dialWithSocks5 ="": Quando a máquina atual estabelece uma conexão de rede externa, tanto TCP quanto UDP, com seu proxy Socks5, como 127.0.0.1:1081
--dialWithSocks5Password = "": Se houver
--dialWithSocks5TCPTimeout = "": tempo (s) (padrão: 0)
--dialWithSocks5UDPTimeout = "": tempo (s) (padrão: 60)
--dialWithSocks5Username = "": Se houver
--ipLimitInterval ="": Intervalo(s) para ipLimitMax (padrão: 0)
--ipLimitMax ="": Limita o número de endereços IP do cliente, tome cuidado ao usar este parâmetro, pois o cliente pode ter IP dinâmico. Funciona com server/wsserver/wssserver/quicserver (padrão: 0)
--ipLimitWait ="": Quanto tempo(s) esperar pela recuperação após exceder ipLimitMax (padrão: 0)
--log = "": Habilita log. Um valor válido é o caminho do arquivo ou 'console'. Envie SIGUSR1 para mim para redefinir o arquivo de log no sistema unix. Se você deseja depurar a biblioteca SOCKS5, defina env SOCKS5_DEBUG=true
--pid = "": Um caminho de arquivo usado para armazenar pid. Envie SIGUSR1 para mim para redefinir o arquivo --serverLog no sistema unix
--pprof = "": vá para http pprof listen addr, como: 6060
--prometheus = "": endereço de escuta http do prometheus, como: 7070. Se for transmitido na rede pública, recomenda-se utilizá-lo com nico
--prometheusPath = "": caminho http do prometheus, como /xxx. Se for transmitido na rede pública, recomenda-se um valor difícil de adivinhar
--serverHKDFInfo = "": informações do servidor HKDF, na maioria das vezes você não precisa alterar isso, se alterado, todos e cada link de riacho no lado do cliente devem ser iguais, quero dizer, cada um (padrão: "brook")
--serverLog = "": Habilita log do servidor, tráfego e muito mais. Um valor válido é o caminho do arquivo ou 'console'. Envie SIGUSR1 para mim para redefinir o arquivo de log no sistema unix. Mutuamente exclusivo com o parâmetro --log. Funciona com servidor/wsserver/wssserver/quicserver com protocolo brook
--speedLimit = "": Limite de velocidade (b), 500kb/s como: 500000, funciona com server/wsserver/wssserver/quicserver (padrão: 0)
--tag = "": Tag pode ser usada no processo, será anexada ao log ou serverLog, como: 'key1:value1'. Todas as tags também serão anexadas como parâmetros de consulta, uma por uma, à userAPI
--userAPI = "": Quando você constrói seu próprio sistema de usuário, o Brook Server enviará uma solicitação GET para sua userAPI para verificar se o token é válido, por exemplo: https://your-api-server.com/a_unpredictable_path. Sim, é recomendado adicionar um caminho imprevisível à sua API https, claro, você também pode usar a API http para comunicação de rede interna. O formato da solicitação é https://your-api-server.com/a_unpredictable_path?token=xxx. Quando a resposta for 200, o corpo deverá ser o identificador exclusivo do usuário, como o ID do usuário; todos os outros códigos de status são considerados representantes de um usuário ilegítimo e, nesses casos, o corpo deve ser uma string descrevendo o erro. Deve ser usado com --serverLog e server/wsserver/wssserver/quicserver com protocolo brook. Para obter mais informações, leia https://github.com/txthinking/brook/blob/master/protocol/user.md
--userAPIInvalidCacheTime = "": Uma vez que um token é verificado e inválido, o userAPI não será solicitado a validar novamente por um determinado período (s). Um valor razoável deve ser definido, caso contrário afetará o desempenho de cada conexão de entrada. Observe que isso pode afetar a experiência do usuário quando você altera o status do usuário de inválido para válido em seu sistema de usuário (padrão: 1800)
--userAPIValidCacheTime = "": Depois que um token for verificado e válido, o userAPI não será solicitado a validar novamente por um determinado período (s). Um valor razoável deve ser definido, caso contrário afetará o desempenho de cada conexão de entrada (padrão: 3600)
--version, -v : imprime a versão
Inicie um servidor Brook que suporte TCP e UDP
--blockCIDR4List = "": Esta opção será removida em uma versão futura, use a opção global
--blockCIDR6List = "": Esta opção será removida em uma versão futura, use a opção global
--blockDomainList = "": Esta opção será removida em uma versão futura, use a opção global
--blockGeoIP = "": Esta opção será removida em uma versão futura, use a opção global
--example : mostra um exemplo mínimo de uso
--listen, -l ="": Endereço de escuta, como: ':9999'
--password, -p = "": Senha do servidor
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--updateListInterval = "": Esta opção será removida em uma versão futura, use a opção global (padrão: 0)
Inicie um cliente Brook que suporte TCP e UDP. Ele pode abrir um proxy Socks5, [src <-> Socks5 <-> $ Brook Client <-> $ Brook Server <-> DST]
--example : mostra um exemplo mínimo de uso
--http = "": Onde escutar conexões proxy HTTP
--link = "": link do brook, você pode obtê-lo através do link $ brook. Os parâmetros wssserver e password serão ignorados
--password, -p = "": senha do servidor Brook
--server, -s = "": endereço do servidor Brook, como: 1.2.3.4:9999
--socks5 ="": Onde escutar conexões SOCKS5 (padrão: 127.0.0.1:1080)
--socks5ServerIP = "": Somente se o IP do seu servidor Socks5 for diferente do IP de escuta
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
Inicie um brook wsserver que suporte tcp e udp. Ele abre um servidor http padrão e um servidor websocket
--blockCIDR4List = "": Esta opção será removida em uma versão futura, use a opção global
--blockCIDR6List = "": Esta opção será removida em uma versão futura, use a opção global
--blockDomainList = "": Esta opção será removida em uma versão futura, use a opção global
--blockGeoIP = "": Esta opção será removida em uma versão futura, use a opção global
--example : mostra um exemplo mínimo de uso
--listen, -l ="": Endereço de escuta, como: ':80'
--password, -p = "": Senha do servidor
--path = "": caminho da URL (padrão: /ws)
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--updateListInterval = "": Esta opção será removida em uma versão futura, use a opção global (padrão: 0)
--withoutBrookProtocol : Os dados não serão criptografados com o protocolo Brook
--xForwardedFor : Substitua o campo from em --log, observe que isso pode ser forjado
Inicie um brook wsclient que suporte tcp e udp. Ele pode abrir um proxy Socks5, [src <-> Socks5 <-> $ brook wsclient <-> $ brook wsserver <-> dst]
--example : mostra um exemplo mínimo de uso
--http = "": Onde escutar conexões proxy HTTP
--link = "": link do brook, você pode obtê-lo através do link $ brook. Os parâmetros wssserver e password serão ignorados
--password, -p = "": Senha do servidor Brook ws
--socks5 ="": Onde escutar conexões SOCKS5 (padrão: 127.0.0.1:1080)
--socks5ServerIP = "": Somente se o IP do seu servidor Socks5 for diferente do IP de escuta
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--wsserver, -s = "": endereço Brook wsserver, como: ws://1.2.3.4:80, se não houver caminho, então /ws será usado. Não omita a porta em nenhuma circunstância
Inicie um brook wssserver que suporte tcp e udp. Ele abre um servidor https padrão e um servidor websocket
--blockCIDR4List = "": Esta opção será removida em uma versão futura, use a opção global
--blockCIDR6List = "": Esta opção será removida em uma versão futura, use a opção global
--blockDomainList = "": Esta opção será removida em uma versão futura, use a opção global
--blockGeoIP = "": Esta opção será removida em uma versão futura, use a opção global
--cert = "": O caminho absoluto do arquivo cert para o domínio, como /path/to/cert.pem. Se cert ou certkey estiver vazio, um certificado será emitido automaticamente
--certkey ="": O caminho absoluto do arquivo de chave de certificado para o domínio, como /path/to/certkey.pem. Se cert ou certkey estiver vazio, um certificado será emitido automaticamente
--domainaddress = "": Como: domínio.com:443. Caso opte por emitir certificados automaticamente, o domínio deverá ter sido resolvido para o IP do servidor e a porta 80 também será utilizada
--example : mostra um exemplo mínimo de uso
--password, -p = "": Senha do servidor
--path = "": caminho da URL (padrão: /ws)
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--updateListInterval = "": Esta opção será removida em uma versão futura, use a opção global (padrão: 0)
--withoutBrookProtocol : Os dados não serão criptografados com o protocolo Brook
Inicie um brook wssclient que suporte tcp e udp. Ele pode abrir um proxy Socks5, [src <-> Socks5 <-> $ brook wssclient <-> $ brook wssserver <-> dst]
--example : mostra um exemplo mínimo de uso
--http = "": Onde escutar conexões proxy HTTP
--link = "": link do brook, você pode obtê-lo através do link $ brook. Os parâmetros wssserver e password serão ignorados
--password, -p = "": senha do servidor wss do Brook
--socks5 ="": Onde escutar conexões SOCKS5 (padrão: 127.0.0.1:1080)
--socks5ServerIP = "": Somente se o IP do seu servidor Socks5 for diferente do IP de escuta
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--wssserver, -s = "": Endereço Brook wssserver, como: wss://google.com:443, se não houver caminho, então /ws será usado. Não omita a porta em nenhuma circunstância
Inicie um brook quicserver que suporte tcp e udp.
--blockCIDR4List = "": Esta opção será removida em uma versão futura, use a opção global
--blockCIDR6List = "": Esta opção será removida em uma versão futura, use a opção global
--blockDomainList = "": Esta opção será removida em uma versão futura, use a opção global
--blockGeoIP = "": Esta opção será removida em uma versão futura, use a opção global
--cert = "": O caminho absoluto do arquivo cert para o domínio, como /path/to/cert.pem. Se cert ou certkey estiver vazio, um certificado será emitido automaticamente
--certkey ="": O caminho absoluto do arquivo de chave de certificado para o domínio, como /path/to/certkey.pem. Se cert ou certkey estiver vazio, um certificado será emitido automaticamente
--domainaddress = "": Como: domínio.com:443. Caso opte por emitir certificados automaticamente, o domínio deverá ter sido resolvido para o IP do servidor e a porta 80 também será utilizada
--example : mostra um exemplo mínimo de uso
--password, -p = "": Senha do servidor
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
--updateListInterval = "": Esta opção será removida em uma versão futura, use a opção global (padrão: 0)
--withoutBrookProtocol : Os dados não serão criptografados com o protocolo Brook
Inicie um brook quicclient que suporte tcp e udp. Ele pode abrir um proxy Socks5, [src <-> Socks5 <-> $ brook quicclient <-> $ brook quicserver <-> dst]. (O parâmetro de discagem global é ignorado)
--example : mostra um exemplo mínimo de uso
--http = "": Onde escutar conexões proxy HTTP
--link = "": link do brook, você pode obtê-lo através do link $ brook. Os parâmetros wssserver e password serão ignorados
--socks5 ="": Onde escutar conexões SOCKS5 (padrão: 127.0.0.1:1080)
--socks5ServerIP = "": Somente se o IP do seu servidor Socks5 for diferente do IP de escuta
--tcpTimeout = "": tempo (s) (padrão: 0)
--udpTimeout = "": tempo (s) (padrão: 0)
Retransmite o tráfego de rede através do Brook, que suporta TCP e UDP. Acessar [do endereço] é igual a acessar [para o endereço], [src <-> do endereço <-> $ brook server/wsserver/wssserver/quicserver <-> para o endereço]
--example : mostra um exemplo mínimo de uso
--from, -f, -l ="": Endereço de escuta: like ':9999'
--link = "": link do brook, você pode obtê-lo através do link $ brook. Os parâmetros de servidor e senha serão ignorados
--senha, -p = "": Senha
--server, -s = "": servidor brook ou brook wsserver ou brook wssserver ou brook quicserver, como: 1.2.3.4:9999, ws://1.2.3.4:9999, wss://domain:443/ws, quic://domínio.com:443
--tcpTimeout = "": tempo (s) (padrão: 0)
--to, -t = "": Endereço para o qual retransmitir, como: 1.2.3.4:9999
--udpTimeout = "": tempo (s) (padrão: 0)
Execute um servidor DNS sobre Brook, que suporta TCP e UDP, [src <-> $ brook dnserversoverbrook <-> $ brook server/wsserver/wssserver/quicserver <-> dns] ou [src <-> $ brook dnsserveroverbrook <-> dnsForBypass]
--blockDomainList = "": Um domínio por linha, modo de correspondência de sufixo. https://, http:// ou caminho de arquivo absoluto local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--bypassDomainList = "": Um domínio por linha, modo de correspondência de sufixo. https://, http:// ou caminho de arquivo absoluto local. Como: https://raw.githubusercontent.com/txthinking/brook/master/programmable/list/example_domain.txt
--disableA : Desativa uma consulta
--disableAAAA : Desativa a consulta AAAA
--dns = "": Servidor DNS para resolver domínios NÃO na lista (padrão: 8.8.8.8:53)
--dnsforbypass = "": servidor DNS para resolver domínios na lista de desvio. Como 223.5.5.5:53 ou https://dns.alidns.com/dns-query?address=223.5.5.5:443, o endereço é necessário (padrão: 223.5.5.5:53)
-Exemplo : mostre um exemplo mínimo de uso
--link = "": link Brook, você pode obtê-lo via link $ Brook. Os parâmetros de servidor e senha serão ignorados
- -Listen, -l = "": Ouça endereço, como: 127.0.0.1:53
-Password, -p = "": senha
- -server, -s = "": servidor Brook ou Brook WSserver ou Brook WSServer ou Brook Quicserver, como: 1.2.3.4:9999, ws: //1.2.3.4: 9999, WSS: //domain.com: 443/443/ WS, quic: //domain.com: 443
--tcptimeout = "": tempo (s) (padrão: 0)
--udptimeout = "": tempo (s) (padrão: 0)
Gerar um link de riacho
--address = "": Quando o servidor é Brook WSServer ou Brook WSSServer ou Brook Quicserver, especifique o endereço em vez de resolver endereços do host, como 1.2.3.4:443
--CA = "": Quando o servidor é Brook WSSServer ou Brook Quicserver, especifique a CA para certificado não confiável, como/pathy/to/ca.pem
-clienthkdfinfo = "": informações do cliente HKDF, na maioria das vezes você não precisa mudar isso, leia o protocolo Brook se você não souber o que é isso
-Exemplo : mostre um exemplo mínimo de uso
--Fragment = "": Quando o servidor é Brook WSSServer, divida o ClientHello em vários fragmentos e envie um por um por atrasos (milissegundos). O formato é min_length: max_length: min_delay: max_delay, não pode ser zero, como 50: 100: 10: 50
--Insecure : Quando o servidor é Brook WSSServer ou Brook Quicserver, o cliente não verifica a cadeia de certificados do servidor e o nome do host
--name = "": dê um nome a este servidor
-Password, -p = "": senha
- -server, -s = "": Suporte Brook Server, Brook WSServer, Brook WSServer, servidor Socks5, 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 = "": servidor hkdf informações, na maioria das vezes você não precisa alterar isso, leia o protocolo Brook se você não souber o que é isso
--tlsfingerprint = "": Quando o servidor é Brook WSSServer, selecione TLS Imprint, o valor pode ser: Chrome
--Token = "": um token representa a identidade de um usuário. Uma sequência codificada em hexadecimal. O servidor precisa ter --Userapi ativado. Observe que: Somente suportado pela GUI Brook (exceto OpenWrt) e Tun2brook
--udpoverstream : Quando o servidor é o Brook Quicserver, UDP sobre o fluxo. Em circunstâncias normais, você precisa deste parâmetro porque o tamanho do datagrama máximo para quic é muito pequeno. NOTA: Apenas Brook CLI e Tun2brook Suppport por enquanto
--udpovertcp : Quando o servidor é o servidor Brook, UDP sobre TCP
--username, -u = "": nome de usuário, quando o servidor é o servidor Socks5
--WithoutBrookProtocol : Quando o servidor é Brook WSserver ou Brook WSSServer ou Brook Quicserver, os dados não serão criptografados com o protocolo Brook
Execute um cliente e conecte -se a um link Brook, que suporta TCP e UDP. Ele pode iniciar um proxy do Socks5, [SRC <-> SOCKS5 <-> $ Brook Connect <-> $ Brook Server/WSServer/WSSserver/Quicserver <-> DST]
-Exemplo : mostre um exemplo mínimo de uso
--http = "": onde ouvir para conexões de proxy HTTP
- -link, -l = "": link Brook, você pode obtê -lo via link $ Brook
--SOCKS5 = "": onde ouvir as conexões de Socks5 (Padrão: 127.0.0.1:1080)
--Socks5Serverip = "": Somente se o seu servidor SOCKS5 IP for diferente de ouvir IP
--tcptimeout = "": tempo (s) (padrão: 0)