
bbs é um roteador para proxies SOCKS e HTTP. Ele expõe um serviço SOCKS5 (ou HTTP CONNECT) e encaminha as solicitações recebidas para proxies ou cadeias de proxies com base no destino da solicitação. O roteamento pode ser configurado com um script PAC (se compilado com suporte a PAC) ou por meio de um arquivo JSON.
O antigo bbs pode ser encontrado aqui
bbs é um roteador para proxies SOCKS e HTTP. Ele expõe serviços SOCKS5, HTTP
CONNECT ou encaminhamento de portas e encaminha as requisições recebidas para proxies ou cadeias de proxies
com base no destino da requisição. O roteamento pode ser configurado com um script PAC (se
compilado com suporte a PAC), ou por meio de um arquivo JSON.
go install github.com/synacktiv/bbs@master
Para instalar o bbs com suporte a script PAC:
go install -tags pac github.com/synacktiv/bbs@master
Nota: o PAC depende de bibliotecas de terceiros não auditadas.
A CLI Python bbscli.py é fornecida para facilitar a configuração do bbs e evitar escrever arquivos JSON manualmente.
Ela requer a biblioteca pyparsing, que é empacotada pelo Debian:
apt install python3-pyparsing
Se a biblioteca não for empacotada pela sua distribuição, ela pode ser instalada usando pip:
pip install pyparsing
A configuração é realizada em um arquivo JSON composto por várias seções:
O caminho do arquivo de configuração é informado pelo argumento -c <path> (padrão ./bbs.json).
O bbs recarrega os arquivos de configuração ao receber SIGHUP; use kill -HUP <pid> para recarregar.
Aqui está um exemplo dessa configuração:
{
"proxies": {
"proxy1": {
"connstring": "socks5://127.0.0.1:1337",
"user": "user",
"pass": "s3cr3t"
},
"proxy2": {
"connstring": "http://127.0.0.1:1338"
}
},
"chains": {
"chain1": {
"proxyDns": true,
"tcpConnectTimeout": 1000,
"tcpReadTimeout": 2000,
"proxies": [
"proxy1",
"proxy2"
]
},
"direct": {
"proxies": []
}
},
"routes": {
"table1": {
"default": "direct",
"blocks": [
{
"comment": "Block1 comment",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "me\\.gandi\\.net"
},
"route": "chain1"
},
{
"comment": "Route non web traffic towards 10.35.0.0/16 through proxy2",
"rules": {
"rule1": {
"rule": "subnet",
"content": "10.35.0.0/16"
},
"op": "AND",
"rule2": {
"rule": "regexp",
"variable": "port",
"content": "^(80|443)$",
"negate": true
}
},
"route": "proxy2"
},
{
"comment": "Drop traffic to 445",
"rules": {
"rule": "regexp",
"variable": "port",
"content": "^445$"
},
"route": "drop"
},
{
"comment": "Route *.corp.local through chain1",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain1",
"disable": true
}
]
},
"table2": {
"default": "drop",
"blocks": [
{
"comment": "Route *.corp.local through chain2",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain2"
}
]
}
},
"servers": [
"socks5://127.0.0.1:1081:table1",
"http://127.0.0.1:1080:table2",
"fwd://127.0.0.1:4445:chain1:10.0.0.1:445"
],
"hosts": {
"host1": "1.1.1.1",
"host2": "10.0.0.1",
"host3": "modified.host3",
"10.1.1.4": "10.1.1.5"
}
}
Os proxies upstream devem ser declarados na seção proxies como um mapa de estruturas
de proxy. As chaves do mapa são escolhidas livremente, mas devem corresponder às usadas na definição
das cadeias. As estruturas de proxy são assim:
connstring é obrigatória com o formato protocol://host:port (protocol pode ser socks5 ou httpconnect/http)user e pass são opcionaisPara cada proxy declarado, uma cadeia implícita (veja o próximo parágrafo) é criada com o mesmo nome. Ela tem parâmetros padrão e é composta pelo único proxy associado. Se você quiser usar parâmetros não padrão, deve criar explicitamente uma cadeia.
As cadeias devem ser declaradas na seção chains como um mapa de estruturas de cadeia.
As chaves do mapa são escolhidas livremente, mas devem corresponder às usadas na definição das rotas, e
devem ser diferentes das chaves do mapa da seção proxies.
As estruturas de cadeia têm parâmetros semelhantes aos do proxychains (cf. https://github.com/rofl0r/proxychains-ng):
proxyDns: booleano, opcional, padrão truetcpConnectTimeout: inteiro, opcional, padrão 1000 (usado ao conectar soquetes, seja ao primeiro proxy
da cadeia ou diretamente ao destino)tcpReadTimeout: inteiro, opcional, padrão 2000 (usado ao ler as respostas de handshake do proxy em soquetes conectados)proxies: lista de strings, opcional, padrão lista vaziaA chave proxies de uma chain deve conter um array de nomes de proxies declarados como chaves na seção proxies.
Como mencionado no parágrafo anterior, para cada proxy declarado na seção proxies, uma cadeia
implícita (veja o próximo parágrafo) é criada com o mesmo nome. Ela tem parâmetros padrão e é
composta pelo único proxy associado.
O modo de configuração embutido para roteamento é por meio do arquivo de configuração. Ele associa
endereços a nomes de cadeias. O arquivo deve conter um mapa de tabelas de roteamento. As chaves do mapa
são escolhidas livremente, mas devem corresponder às usadas na seção servers.
Cada tabela de roteamento contém uma chave default representando a rota padrão e uma chave blocks
que é um array de blocos de regras. Cada
bloco de regras contém um comment, um conjunto de rules e um nome de cadeia
associado. As regras são avaliadas: dado um endereço no formato host:port, elas podem
ser true ou false. Para um determinado endereço, os blocos são avaliados na sua
ordem de declaração. Os blocos podem ser desabilitados definindo o campo disable como true.
Isso permite uma forma de "comentário", o que não é possível em JSON.
A avaliação para no primeiro bloco que for true e
o nome da cadeia associado é retornado. Cada servidor aberto (da seção servers)
é associado a uma tabela de roteamento da configuração. As requisições recebidas em
cada servidor são roteadas de acordo com a tabela de roteamento correspondente. Se todos os blocos forem avaliados como
false, a rota padrão é usada. Se default não estiver definido, as conexões são descartadas por padrão.
Campos do bloco:
comment (string)rules (Rule ou RuleCombo)route (string)disable (bool)Campos da regra:
rule (string): tipo de regra, regexp, subnet.variable (string): variável para avaliação de regexp, host, port ou addr (host:port).content (string): conteúdo da regra, depende do tipo de regra (veja abaixo).negate (bool) [opcional]: se deve negar a regra.Campos do RuleCombo:
rule1 (Rule ou RuleCombo): operando esquerdo.op (string): operador, AND, And, and, &, &&, OR, Or, or, |, ||.rule2 (Rule ou RuleCombo): operando direito.