
bbs is a router for SOCKS and HTTP proxies. It exposes a SOCKS5 (or HTTP CONNECT) service and forwards incoming requests to proxies or chains of proxies based on the request's target. Routing can be configured with a PAC script (if built with PAC support), or through a JSON file.
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
, se utiliza la ruta por defecto. Si 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.Campos de RuleCombo:
rule1 (Rule o RuleCombo): operando izquierdo.op (cadena): operador, AND, And, and, &, &&, OR, Or, or, |, ||.rule2 (Rule o RuleCombo): operando derecho.Tipos de reglas:
regexp: compara la variable definida en variable (host, port o addr=host:port) con la regexp en content.subnet: comprueba si el host está en la subred definida en content. Si el host es un nombre de dominio y no una dirección de subred, la regla devuelve false.Los bloques de reglas de la sección routes o la función PAC deben devolver nombres
de cadenas declaradas, no nombres de proxies. Si se desea usar un solo proxy, se debe envolver
en una cadena. El nombre drop es especial y no necesita declararse en
esta configuración. Si la función PAC o un bloque de enrutamiento devuelve drop como
nombre de cadena, entonces la conexión se descarta.
Si bbs está compilado con soporte PAC y el argumento -pac apunta a un archivo PAC, las rutas
definidas en el archivo de configuración no se utilizarán. El enrutamiento mediante archivo PAC no admite
múltiples tablas de enrutamiento. Se usará el mismo archivo PAC para cada servidor abierto.
Los listeners abiertos por bbs deben declararse en la sección servers como una lista de
cadenas de conexión con el formato protocol://bind_addr:bind_port:routing_table o
protocol://bind_addr:bind_port:chain:dest_addr:dest_port.
protocol puede ser http o socks5 si se proporciona routing_tableprotocol puede ser fwd si se proporcionan chain, dest_addr y dest_portrouting_table debe coincidir con una de las tablas definidas en la sección routeschain debe coincidir con una de las cadenas definidas en la sección chainsLa resolución personalizada de hosts (similar a /etc/hosts) se puede configurar en la
sección hosts como un mapa de cadenas. Las claves del mapa corresponden al nombre de host
y los valores, a la dirección IP a la que debe resolverse el host.
Cabe señalar que las claves del mapa también pueden ser direcciones IP. En ese caso, la dirección IP de la clave será reemplazada por la dirección IP del valor. De manera similar, los valores del mapa pueden ser nombres de host y reemplazarán a la clave correspondiente.
Si está definida, la resolución personalizada de hosts ocurre al comienzo de la fase de conexión, después de tomar la decisión de enrutamiento y antes de cualquier resolución DNS local (si la cadena está configurada con proxyDns=false) y antes de enviar la dirección de destino a los distintos proxies de la cadena.
Si bbs está compilado con soporte PAC, el enrutamiento se puede configurar con un script PAC
en lugar de un archivo de configuración JSON. Sin embargo, esto requiere usar una librería
Go no confiable. La ruta del archivo PAC debe proporcionarse con -pac.
El script PAC debe definir la función FindProxyForURL(url, host). Los
valores devueltos por esta función deben coincidir con los nombres de las cadenas (no de los
proxies) declaradas en la configuración JSON.
falsedefault