
bbs es un enrutador para proxies SOCKS y HTTP. Expone un servicio SOCKS5 (o HTTP CONNECT) y reenvía las solicitudes entrantes a proxies o cadenas de proxies según el destino de la solicitud. El enrutamiento se puede configurar con un script PAC (si se compila con soporte PAC) o mediante un archivo JSON.
El antiguo bbs se puede encontrar aquí
bbs es un enrutador para proxies SOCKS y HTTP. Expone servicios SOCKS5, HTTP
CONNECT o redirección de puertos y reenvía las peticiones entrantes a proxies o cadenas de proxies
según el destino de la petición. El enrutamiento se puede configurar con un script PAC (si
está compilado con soporte PAC), o mediante un archivo JSON.
go install github.com/synacktiv/bbs@master
Para instalar bbs con soporte de scripts PAC:
go install -tags pac github.com/synacktiv/bbs@master
Nota: PAC depende de librerías de terceros no auditadas.
El CLI de Python bbscli.py se proporciona para facilitar la configuración de bbs y evitar escribir archivos JSON manualmente.
Requiere la librería pyparsing, que está empaquetada por Debian:
apt install python3-pyparsing
Si la librería no está empaquetada por su distribución, se puede instalar usando pip:
pip install pyparsing
La configuración se realiza en un único archivo JSON compuesto por varias secciones:
La ruta del archivo de configuración se proporciona mediante el argumento -c <path> (por defecto ./bbs.json).
bbs recarga los archivos de configuración al recibir SIGHUP, use kill -HUP <pid> para recargar.
A continuación se muestra un ejemplo de dicha configuración:
{
"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"
}
}
Los proxies ascendentes deben declararse en la sección proxies como un mapa de estructuras
de proxy. Las claves del mapa se eligen libremente pero deben coincidir con las utilizadas en la definición
de cadenas. Las estructuras de proxy son así:
connstring es obligatoria con el formato protocol://host:port (protocol puede ser socks5 o httpconnect/http)user y pass son opcionalesPor cada proxy declarado, se crea una cadena implícita (ver siguiente párrafo) con el mismo nombre. Tiene los parámetros por defecto y está compuesta por el único proxy asociado. Si se desea usar parámetros no predeterminados, se debe crear explícitamente una cadena.
Las cadenas deben declararse en la sección chains como un mapa de estructuras de cadena.
Las claves del mapa se eligen libremente pero deben coincidir con las utilizadas en la definición de rutas, y
deben ser diferentes de las claves del mapa de la sección proxies.
Las estructuras de cadena tienen parámetros similares a proxychains (cf. https://github.com/rofl0r/proxychains-ng):
proxyDns: booleano, opcional, por defecto truetcpConnectTimeout: entero, opcional, por defecto 1000 (se usa al conectar sockets, ya sea al primer proxy
de la cadena o directamente al destino)tcpReadTimeout: entero, opcional, por defecto 2000 (se usa al leer las respuestas de handshake de los proxies en los sockets conectados)proxies: lista de cadenas, opcional, por defecto lista vacíaLa clave proxies de una chain debe contener un array de nombres de proxies declarados como claves en la sección proxies.
Como se mencionó en el párrafo anterior, por cada proxy declarado en la sección proxies, se crea una cadena
implícita (ver siguiente párrafo) con el mismo nombre. Tiene los parámetros por defecto y está
compuesta por el único proxy asociado.
El modo de configuración integrado para el enrutamiento es mediante el archivo de configuración. Asocia
direcciones con nombres de cadenas. El archivo debe contener un mapa de tablas de enrutamiento. Las claves del mapa
se eligen libremente pero deben coincidir con las utilizadas en la sección servers.
Cada tabla de enrutamiento contiene una clave default que representa la ruta por defecto y una clave blocks
que es un array de bloques de reglas. Cada
bloque de reglas contiene un comment, un conjunto de rules y un nombre de cadena
asociado. Las reglas se evalúan: dada una dirección en el formato host:port, pueden
ser true o false. Para una dirección dada, los bloques se evalúan en su
orden de declaración. Los bloques se pueden deshabilitar estableciendo el campo disable a true.
Esto permite una forma de "comentado", que no es posible en JSON.
La evaluación se detiene en el primer bloque que sea true y
se devuelve el nombre de cadena asociado. Cada servidor abierto (de la sección servers)
está asociado con una tabla de enrutamiento de la configuración. Las peticiones recibidas en
cada servidor se enrutan según la tabla de enrutamiento correspondiente. Si todos los bloques se evalúan como
false, se utiliza la ruta por defecto. Si default no está definido, las conexiones se descartan por defecto.
Campos de un bloque:
comment (cadena)rules (Rule o RuleCombo)route (cadena)disable (booleano)Campos de una regla:
rule (cadena): tipo de regla, regexp, subnet.variable (cadena): variable para la evaluación de la regexp, host, port o addr (host:port).content (cadena): contenido de la regla, depende del tipo de regla (ver más abajo).negate (booleano) [opcional]: indica si se debe negar la regla.