
Una herramienta de elusión de censura para evadir la detección por parte de adversarios estatales autoritarios
Cloak es un transporte conectable que mejora herramientas proxy tradicionales como OpenVPN para evadir la censura sofisticada y la discriminación de datos.
Cloak no es un programa proxy independiente. En cambio, funciona disfrazando el tráfico proxy como actividades normales de navegación web. En contraste con las herramientas tradicionales que tienen huellas de tráfico muy prominentes y pueden ser bloqueadas por simples reglas de filtrado, es muy difícil apuntar a Cloak con precisión y con pocos falsos positivos. Esto aumenta el daño colateral de las acciones de censura, ya que los intentos de bloquear Cloak también podrían dañar servicios de los que depende el estado censor.
Para cualquier observador externo, un servidor que ejecuta Cloak es indistinguible de un servidor web inocente. Tanto al observar pasivamente el flujo de tráfico hacia y desde el servidor, como al sondear activamente los comportamientos de un servidor Cloak. Esto se logra mediante el uso de una serie de técnicas de esteganografía criptográfica.
Cloak puede utilizarse junto con cualquier programa proxy que tunelice tráfico a través de TCP o UDP, como Shadowsocks, OpenVPN y Tor. Se pueden ejecutar múltiples servidores proxy en el mismo servidor anfitrión y el servidor Cloak actuará como un proxy inverso, conectando a los clientes con su extremo proxy deseado.
Cloak multiplexa el tráfico a través de múltiples conexiones TCP subyacentes, lo que reduce el bloqueo de cabeza de línea y elimina la sobrecarga del handshake TCP. Esto también hace que el patrón de tráfico sea más similar al de sitios web reales.
Cloak proporciona soporte multiusuario, permitiendo que múltiples clientes se conecten al servidor proxy en el mismo puerto (443 por defecto). También ofrece funciones de gestión de tráfico, como crédito de uso y control de ancho de banda. Esto permite que un servidor proxy sirva a múltiples usuarios incluso si el software proxy subyacente no fue diseñado para múltiples usuarios.
Cloak también soporta túneles a través de un servidor CDN intermediario como Amazon Cloudfront. Estos servicios son tan ampliamente utilizados que los intentos de interrumpir su tráfico pueden causar un daño colateral muy alto para el censor.
Para implementar rápidamente Cloak con Shadowsocks en un servidor, puede ejecutar este script escrito por @HirbodBehnam
git clone https://github.com/cbeuw/Cloak
cd Cloak
go get ./...
make
Los binarios compilados estarán en la carpeta build.
Los ejemplos de archivos de configuración se pueden encontrar en la carpeta example_config.
RedirAddr es la dirección de redirección cuando el tráfico entrante no proviene de un cliente Cloak. Idealmente debería configurarse en un sitio web importante permitido por el censor (por ejemplo, www.bing.com).
BindAddr es una lista de direcciones a las que Cloak se vinculará y escuchará (por ejemplo, [":443",":80"] para escuchar en los puertos 443 y 80 en todas las interfaces).
ProxyBook es un objeto cuya clave es el nombre del ProxyMethod utilizado en el lado del cliente (sensible a mayúsculas y minúsculas). Su valor es un arreglo cuyo primer elemento es el protocolo y el segundo elemento es una cadena IP:PORT del servidor proxy ascendente al que Cloak reenviará el tráfico.
Ejemplo:
{
"ProxyBook": {
"shadowsocks": [
"tcp",
"localhost:51443"
],
"openvpn": [
"tcp",
"localhost:12345"
]
}
}
PrivateKey es la clave privada Diffie-Hellman estática curve25519 codificada en base64.
BypassUID es una lista de UIDs autorizados sin restricciones de ancho de banda o crédito.
AdminUID es el UID del usuario administrador en base64. Puede dejar esto vacío si solo agrega usuarios a BypassUID.
DatabasePath es la ruta a userinfo.db, que se utiliza para almacenar la información de uso y las restricciones del usuario. Cloak creará el archivo automáticamente si no existe. Puede dejar esto vacío si solo agrega usuarios a BypassUID. Este campo tampoco tiene efecto si AdminUID no es un UID válido o está vacío.
KeepAlive es la cantidad de segundos que se le indica al SO que espere después de la inactividad antes de enviar sondas TCP KeepAlive al servidor proxy ascendente. Un valor cero o negativo lo desactiva. El valor predeterminado es 0 (desactivado).
UID es su UID en base64.
Transport puede ser direct o CDN. Si el anfitrión del servidor desea que se conecte directamente a él, use direct. Si en su lugar se usa un CDN, use CDN.
PublicKey es la clave pública estática curve25519 en base64, proporcionada por el administrador del servidor.
ProxyMethod es el nombre del método proxy que está utilizando. Debe coincidir exactamente con una de las entradas en el ProxyBook del servidor.
EncryptionMethod es el nombre del algoritmo de cifrado que desea que use Cloak. Las opciones son plain, aes-256-gcm (sinónimo de aes-gcm), aes-128-gcm y chacha20-poly1305. Nota: Cloak no está diseñado para proporcionar seguridad en el transporte. El propósito del cifrado es ocultar las huellas de los protocolos proxy y hacer que la carga útil sea estadísticamente aleatoria. Solo puede dejarlo como plain si está seguro de que su herramienta proxy subyacente ya proporciona TANTO cifrado como autenticación (a través de AEAD o técnicas similares).
ServerName es el dominio que desea que su ISP o firewall piensen que está visitando. Idealmente debería coincidir con RedirAddr en la configuración del servidor, un sitio importante permitido por el censor, pero no es obligatorio. Use random para aleatorizar el nombre del servidor en cada conexión.
AlternativeNames es un arreglo que se utiliza junto con ServerName para alternar entre diferentes ServerNames en cada nueva conexión. Esto puede entrar en conflicto con el modo de transporte CDN si el proveedor de CDN prohíbe el domain-fronting y rechaza los dominios alternativos.
Ejemplo:
{
"ServerName": "bing.com",
"AlternativeNames": ["cloudflare.com", "github.com"]
}
CDNOriginHost es el nombre de dominio del servidor de origen (es decir, el servidor que ejecuta Cloak) en modo CDN. Solo tiene efecto cuando Transport está configurado como CDN. Si no se establece, por defecto será el nombre de host remoto proporcionado a través del argumento de línea de comandos (en modo independiente) o por Shadowsocks (en modo plugin). Después de establecer una sesión TLS con el servidor CDN, este nombre de dominio se usará en el encabezado Host de la solicitud HTTP para pedirle al servidor CDN que establezca una conexión WebSocket con este host.
CDNWsUrlPath es la ruta de URL utilizada para construir la solicitud WebSocket enviada en modo CDN, y también solo tiene efecto cuando Transport está configurado como CDN. Si no se establece, por defecto será "/". Esta opción se utiliza para construir la primera línea de la solicitud HTTP después de que se establece una sesión TLS. Está pensada principalmente para un servidor Cloak detrás de un proxy inverso, donde solo se reenvían las solicitudes bajo una ruta de URL específica.
NumConn es la cantidad de conexiones TCP subyacentes que desea utilizar. El valor predeterminado de 4 debería ser adecuado para la mayoría de las personas. Configurarlo demasiado alto perjudicará el rendimiento. Configurarlo en 0 deshabilitará la multiplexación de conexiones y cada conexión TCP generará una sesión separada de corta duración que se cerrará después de terminarse. Esto hace que se comporte como GoQuiet. Puede ser útil para personas con conexiones inestables.
BrowserSig es el navegador que desea parecer estar utilizando. No está relacionado con el navegador que realmente está utilizando. Actualmente, se admiten chrome, firefox y safari.
KeepAlive es la cantidad de segundos que se le indica al SO que espere después de la inactividad antes de enviar sondas TCP KeepAlive al servidor Cloak. Un valor cero o negativo lo desactiva. El valor predeterminado es 0 (desactivado). Advertencia: activarlo puede hacer que su servidor sea más detectable como proxy, pero hará que el cliente Cloak detecte la interrupción de Internet más rápidamente.
StreamTimeout es la cantidad de segundos que Cloak espera a que una conexión entrante de un programa proxy envíe cualquier dato, después de lo cual la conexión será cerrada por Cloak. Cloak no impondrá ningún tiempo de espera en las conexiones TCP una vez establecidas.
ck-server -key. La pública debe entregarse a los usuarios, la privada debe mantenerse en secreto.ck-server -uid. El nuevo UID se usará como AdminUID.example_config/ckserver.json en la ubicación deseada. Cambie PrivateKey por la clave privada que acaba de obtener; cambie AdminUID por el UID que acaba de obtener.ProxyBook en el archivo de configuración en consecuencia.sudo ck-server -c <ruta a ckserver.json>. ck-server necesita privilegios de root porque se vincula a un puerto con número bajo (443). Alternativamente, puede seguir https://superuser.com/a/892391 para evitar otorgar privilegios de root a ck-server innecesariamente.Ejecute ck-server -uid y agregue el UID al campo BypassUID en ckserver.json.
AdminUID en ckserver.json, junto con una ruta a userinfo.db en DatabasePath (Cloak creará este archivo por usted si no existía).ck-client -s <IP del servidor> -l <Un puerto local> -a <AdminUID> -c <ruta a ckclient.json> para ingresar al modo administrador.index.html en un navegador. No se requiere ningún servidor web).127.0.0.1:<el puerto que ingresó en el paso 1> como API Base y haga clic en List.+.Nota: la base de datos de usuarios es persistente ya que está en disco. No es necesario agregar los usuarios nuevamente cada vez que inicie ck-server.
El cliente Android está disponible aquí: https://github.com/cbeuw/Cloak-android
example_config/ckclient.json en una ubicación de su elección. Ingrese el UID y PublicKey que obtuvo. Configure ProxyMethod para que coincida exactamente con la entrada correspondiente en ProxyBook en el extremo del servidor.ck-client -c <ruta a ckclient.json> -s <ip de su servidor>.Si encuentra útil este proyecto, puede visitar mi tienda de productos; alternativamente, puede donarme directamente
BTC: bc1q59yvpnh0356qq9vf0j2y7hx36t9ysap30spx9h
ETH: 0x8effF29a8F9bD38A367580527AC303972c92b60c