
bbs è un router per proxy SOCKS e HTTP. Espone un servizio SOCKS5 (o HTTP CONNECT) e inoltra le richieste in arrivo a proxy o catene di proxy in base alla destinazione della richiesta. Il routing può essere configurato con uno script PAC (se compilato con supporto PAC) o tramite un file JSON.
Il vecchio bbs può essere trovato qui
bbs è un router per proxy SOCKS e HTTP. Espone servizi SOCKS5, HTTP CONNECT o port forwarding e inoltra le richieste in arrivo a proxy o catene di proxy in base alla destinazione della richiesta. Il routing può essere configurato con uno script PAC (se compilato con il supporto PAC) oppure tramite un file JSON.
go install github.com/synacktiv/bbs@master
Per installare bbs con il supporto degli script PAC:
go install -tags pac github.com/synacktiv/bbs@master
Nota: PAC si basa su librerie di terze parti non sottoposte a revisione.
La CLI Python bbscli.py è fornita per facilitare la configurazione di bbs ed evitare di scrivere manualmente i file JSON.
Richiede la libreria pyparsing, inclusa nei pacchetti di Debian:
apt install python3-pyparsing
Se la libreria non è inclusa nei pacchetti della tua distribuzione, può essere installata usando pip:
pip install pyparsing
La configurazione viene effettuata in un unico file JSON composto da più sezioni:
Il percorso del file di configurazione viene fornito tramite l'argomento -c <path> (predefinito: ./bbs.json).
bbs ricarica i file di configurazione al ricevimento di SIGHUP; usa kill -HUP <pid> per ricaricare.
Ecco un esempio di tale configurazione:
{
"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"
}
}
I proxy a monte devono essere dichiarati nella sezione proxies come una mappa di strutture proxy. Le chiavi della mappa sono scelte liberamente ma devono corrispondere a quelle usate nella definizione delle catene. Le strutture proxy sono così composte:
connstring è obbligatoria con formato protocol://host:port (protocol può essere socks5 o httpconnect/http)user e pass sono opzionaliPer ogni proxy dichiarato, viene creata una catena implicita (vedi paragrafo successivo) con lo stesso nome. Ha parametri predefiniti ed è composta dal singolo proxy associato. Se si desidera utilizzare parametri non predefiniti, è necessario creare esplicitamente una catena.
Le catene devono essere dichiarate nella sezione chains come una mappa di strutture di catena. Le chiavi della mappa sono scelte liberamente ma devono corrispondere a quelle usate nella definizione delle route e devono essere diverse dalle chiavi della mappa della sezione proxies. Le strutture di catena hanno parametri simili a quelli di proxychains (cfr. https://github.com/rofl0r/proxychains-ng):
proxyDns: booleano, opzionale, predefinito truetcpConnectTimeout: intero, opzionale, predefinito 1000 (usato durante la connessione dei socket, sia al primo proxy della catena che direttamente alla destinazione)tcpReadTimeout: intero, opzionale, predefinito 2000 (usato durante la lettura delle risposte di handshake dei proxy sui socket connessi)proxies: elenco di stringhe, opzionale, predefinito elenco vuotoLa chiave proxies di una chain deve contenere un array di nomi di proxy dichiarati come chiavi nella sezione proxies. Come accennato nel paragrafo precedente, per ogni proxy dichiarato nella sezione proxies viene creata una catena implicita (vedi paragrafo successivo) con lo stesso nome. Ha parametri predefiniti ed è composta dal singolo proxy associato.
La modalità di configurazione integrata per il routing avviene tramite il file di configurazione. Associa gli indirizzi ai nomi delle catene. Il file deve contenere una mappa di tabelle di routing. Le chiavi della mappa sono scelte liberamente ma devono corrispondere a quelle usate nella sezione servers. Ogni tabella di routing contiene una chiave default che rappresenta la route predefinita e una chiave blocks che è un array di blocchi di regole. Ogni blocco di regole contiene un comment, un insieme di rules e un nome di catena associato. Le regole vengono valutate: dato un indirizzo nel formato host:port, possono essere true o false. Per un dato indirizzo, i blocchi vengono valutati nell'ordine di dichiarazione. I blocchi possono essere disabilitati impostando il campo disable a true. Ciò consente una forma di "commento", non possibile in JSON. La valutazione si ferma al primo blocco che risulta true e viene restituito il nome della catena associata. Ogni server aperto (dalla sezione servers) è associato a una tabella di routing della configurazione. Le richieste ricevute su ciascun server vengono instradate in base alla tabella di routing corrispondente. Se tutti i blocchi vengono valutati false, viene utilizzata la route predefinita. Se default non è definita, le connessioni vengono scartate per impostazione predefinita.
Campi del blocco:
comment (stringa)rules (Rule o RuleCombo)route (stringa)disable (booleano)Campi della regola:
rule (stringa): tipo di regola, regexp, subnet.variable (stringa): variabile per la valutazione regexp, host, port o addr (host:port).content (stringa): contenuto della regola, dipende dal tipo di regola (vedi sotto).negate (booleano) [opzionale]: indica se negare la regola.