
Un outil de contournement de la censure pour échapper à la détection par des adversaires étatiques autoritaires
Cloak est un transport enfichable qui améliore les outils proxy traditionnels comme OpenVPN pour contourner la censure sophistiquée et la discrimination des données.
Cloak n'est pas un programme proxy autonome. Il fonctionne en faisant passer le trafic proxyé pour des activités de navigation web normales. Contrairement aux outils traditionnels qui ont des empreintes de trafic très visibles et peuvent être bloqués par des règles de filtrage simples, il est très difficile de cibler précisément Cloak avec peu de faux positifs. Cela augmente les dommages collatéraux des actions de censure, car les tentatives de blocage de Cloak pourraient également endommager les services dont dépend l'État censeur.
Pour tout observateur tiers, un hôte exécutant un serveur Cloak est impossible à distinguer d'un serveur web innocent. À la fois en observant passivement le flux de trafic vers et depuis le serveur, ainsi qu'en sondant activement les comportements d'un serveur Cloak. Ceci est réalisé grâce à une série de techniques de stéganographie cryptographique.
Cloak peut être utilisé avec tout programme proxy qui tunnelise le trafic via TCP ou UDP, comme Shadowsocks, OpenVPN et Tor. Plusieurs serveurs proxy peuvent fonctionner sur le même hôte serveur et le serveur Cloak agira comme un proxy inverse, faisant le pont entre les clients et leur proxy de destination.
Cloak multiplexe le trafic via plusieurs connexions TCP sous-jacentes, ce qui réduit le blocage de tête de ligne et élimine la surcharge d'établissement de liaison TCP. Cela rend également le modèle de trafic plus similaire à celui des sites web réels.
Cloak offre un support multi-utilisateurs, permettant à plusieurs clients de se connecter au serveur proxy sur le même port (443 par défaut). Il offre également des fonctionnalités de gestion du trafic telles que le crédit d'utilisation et le contrôle de la bande passante. Cela permet à un serveur proxy de servir plusieurs utilisateurs même si le logiciel proxy sous-jacent n'a pas été conçu pour plusieurs utilisateurs.
Cloak prend également en charge le tunnelage via un serveur CDN intermédiaire tel qu'Amazon Cloudfront. Ces services sont si largement utilisés que les tentatives de perturbation de leur trafic peuvent entraîner des dommages collatéraux très élevés pour le censeur.
Pour déployer rapidement Cloak avec Shadowsocks sur un serveur, vous pouvez exécuter ce script écrit par @HirbodBehnam
git clone https://github.com/cbeuw/Cloak
cd Cloak
go get ./...
make
Les binaires compilés se trouveront dans le dossier build.
Des exemples de fichiers de configuration se trouvent dans le dossier example_config.
RedirAddr est l'adresse de redirection lorsque le trafic entrant ne provient pas d'un client Cloak. Idéalement, elle doit être définie sur un site majeur autorisé par le censeur (par exemple www.bing.com).
BindAddr est une liste d'adresses sur lesquelles Cloak se liera et écoutera (par exemple [":443",":80"] pour écouter sur les ports 443 et 80 sur toutes les interfaces).
ProxyBook est un objet dont la clé est le nom de la méthode proxy utilisée côté client (sensible à la casse). Sa valeur est un tableau dont le premier élément est le protocole et le second élément est une chaîne IP:PORT du serveur proxy amont vers lequel Cloak transmettra le trafic.
Exemple :
{
"ProxyBook": {
"shadowsocks": [
"tcp",
"localhost:51443"
],
"openvpn": [
"tcp",
"localhost:12345"
]
}
}
PrivateKey est la clé privée statique Diffie-Hellman curve25519 encodée en base64.
BypassUID est une liste d'UID autorisés sans aucune restriction de bande passante ou de crédit.
AdminUID est l'UID de l'utilisateur admin en base64. Vous pouvez laisser ce champ vide si vous n'ajoutez que des utilisateurs à BypassUID.
DatabasePath est le chemin vers userinfo.db, qui est utilisé pour stocker les informations d'utilisation et les restrictions des utilisateurs. Cloak créera le fichier automatiquement s'il n'existe pas. Vous pouvez laisser ce champ vide si vous n'ajoutez que des utilisateurs à BypassUID. Ce champ est également sans effet si AdminUID n'est pas un UID valide ou est vide.
KeepAlive est le nombre de secondes à attendre après une inactivité avant d'envoyer des sondes TCP KeepAlive au serveur proxy amont. Une valeur nulle ou négative désactive cette fonction. La valeur par défaut est 0 (désactivé).
UID est votre UID en base64.
Transport peut être direct ou CDN. Si l'hôte du serveur souhaite que vous vous connectiez directement, utilisez direct. Si un CDN est utilisé, utilisez CDN.
PublicKey est la clé publique curve25519 statique en base64, fournie par l'administrateur du serveur.
ProxyMethod est le nom de la méthode proxy que vous utilisez. Cela doit correspondre exactement à l'une des entrées de ProxyBook du serveur.
EncryptionMethod est le nom de l'algorithme de chiffrement que vous souhaitez utiliser avec Cloak. Les options sont plain, aes-256-gcm (synonyme de aes-gcm), aes-128-gcm et chacha20-poly1305. Remarque : Cloak n'a pas pour but de fournir une sécurité de transport. L'intérêt du chiffrement est de masquer les empreintes des protocoles proxy et de rendre la charge utile statistiquement aléatoire. Vous ne devez le laisser en plain que si vous êtes certain que votre outil proxy sous-jacent fournit à la fois le chiffrement et l'authentification (via AEAD ou des techniques similaires).
ServerName est le domaine que vous souhaitez faire croire à votre FAI ou pare-feu que vous visitez. Idéalement, il doit correspondre à RedirAddr dans la configuration du serveur, un site majeur autorisé par le censeur, mais ce n'est pas obligatoire. Utilisez random pour randomiser le nom du serveur pour chaque connexion.
AlternativeNames est un tableau utilisé en complément de ServerName pour mélanger différents ServerNames pour chaque nouvelle connexion. Cela peut entrer en conflit avec le mode de transport CDN si le fournisseur CDN interdit le domain fronting et rejette les domaines alternatifs.
Exemple :
{
"ServerName": "bing.com",
"AlternativeNames": ["cloudflare.com", "github.com"]
}
CDNOriginHost est le nom de domaine du serveur d'origine (c'est-à-dire le serveur exécutant Cloak) en mode CDN. Cela n'a d'effet que lorsque Transport est défini sur CDN. S'il n'est pas défini, il prendra par défaut le nom d'hôte distant fourni via l'argument de ligne de commande (en mode autonome) ou par Shadowsocks (en mode plugin). Après l'établissement d'une session TLS avec le serveur CDN, ce nom de domaine sera utilisé dans l'en-tête Host de la requête HTTP pour demander au serveur CDN d'établir une connexion WebSocket avec cet hôte.
CDNWsUrlPath est le chemin d'URL utilisé pour construire la requête websocket envoyée en mode CDN, et n'a également d'effet que lorsque Transport est défini sur CDN. S'il n'est pas défini, il prendra par défaut "/". Cette option est utilisée pour construire la première ligne de la requête HTTP après l'établissement d'une session TLS. Elle est principalement destinée à un serveur Cloak derrière un proxy inverse, où seules les requêtes sous un chemin d'URL spécifique sont transmises.
NumConn est le nombre de connexions TCP sous-jacentes que vous souhaitez utiliser. La valeur par défaut de 4 devrait convenir à la plupart des gens. La définir trop élevée nuira aux performances. La définir sur 0 désactivera le multiplexage des connexions et chaque connexion TCP générera une session éphémère séparée qui sera fermée après sa terminaison. Cela le fait se comporter comme GoQuiet. Cela peut être utile pour les personnes ayant des connexions instables.
BrowserSig est le navigateur que vous souhaitez paraître utiliser. Cela n'a aucun rapport avec le navigateur que vous utilisez réellement. Actuellement, chrome, firefox et safari sont pris en charge.
KeepAlive est le nombre de secondes à attendre après une inactivité avant d'envoyer des sondes TCP KeepAlive au serveur Cloak. Une valeur nulle ou négative désactive cette fonction. La valeur par défaut est 0 (désactivé). Avertissement : L'activer pourrait rendre votre serveur plus détectable en tant que proxy, mais cela permettra au client Cloak de détecter plus rapidement une interruption Internet.
StreamTimeout est le nombre de secondes pendant lequel Cloak attend qu'une connexion entrante d'un programme proxy envoie des données, après quoi la connexion sera fermée par Cloak. Cloak n'imposera aucun délai d'attente sur les connexions TCP après leur établissement.
ck-server -key. La clé publique doit être donnée aux utilisateurs, la clé privée doit rester secrète.ck-server -uid. Le nouvel UID sera utilisé comme AdminUID.PrivateKey par la clé privée que vous venez d'obtenir ; remplacez AdminUID par l'UID que vous venez d'obtenir.ProxyBook dans le fichier de configuration en conséquence.sudo ck-server -c <chemin vers ckserver.json>. ck-server nécessite les privilèges root car il se lie à un port bas (443). Sinon, vous pouvez suivre https://superuser.com/a/892391 pour éviter d'accorder inutilement les privilèges root à ck-server.Exécutez ck-server -uid et ajoutez l'UID dans le champ BypassUID de ckserver.json.
AdminUID dans ckserver.json, ainsi qu'un chemin vers userinfo.db dans DatabasePath (Cloak créera ce fichier pour vous s'il n'existe pas déjà).ck-client -s <IP du serveur> -l <un port local> -a <AdminUID> -c <chemin-vers-ckclient.json> pour entrer en mode admin.index.html dans un navigateur. Aucun serveur web n'est nécessaire).127.0.0.1:<le port saisi à l'étape 1> comme API Base, puis cliquez sur List.+.Remarque : la base de données utilisateur est persistante car elle est stockée sur disque. Vous n'avez pas besoin d'ajouter les utilisateurs à chaque démarrage de ck-server.
Le client Android est disponible ici : https://github.com/cbeuw/Cloak-android
example_config/ckclient.json dans un emplacement de votre choix. Saisissez l'UID et la PublicKey que vous avez obtenus. Définissez ProxyMethod pour qu'il corresponde exactement à l'entrée correspondante dans ProxyBook côté serveur.ck-client -c <chemin vers ckclient.json> -s <ip de votre serveur>.Si vous trouvez ce projet utile, vous pouvez visiter ma boutique de produits dérivés ; vous pouvez également me faire un don directement.
BTC: bc1q59yvpnh0356qq9vf0j2y7hx36t9ysap30spx9h
ETH: 0x8effF29a8F9bD38A367580527AC303972c92b60c