
Ein Werkzeug zur Zensurumgehung, um der Erkennung durch autoritäre Staatsgegner zu entgehen.
Cloak ist ein pluggbarer Transport, der traditionelle Proxy-Tools wie OpenVPN verbessert, um fortgeschrittene Zensur und Datendiskriminierung zu umgehen.
Cloak ist kein eigenständiges Proxy-Programm. Stattdessen tarnt es den Proxy-Verkehr als normale Webbrowsing-Aktivitäten. Im Gegensatz zu traditionellen Tools, die sehr auffällige Verkehrsfingerabdrücke haben und durch einfache Filterregeln blockiert werden können, ist es sehr schwierig, Cloak mit geringen Fehlalarmen präzise zu blockieren. Dies erhöht den Kollateralschaden von Zensurmaßnahmen, da Versuche, Cloak zu blockieren, auch Dienste beschädigen könnten, auf die der zensierende Staat angewiesen ist.
Für jeden externen Beobachter ist ein Host, der einen Cloak-Server betreibt, nicht von einem harmlosen Webserver zu unterscheiden – sowohl bei passiver Beobachtung des Datenverkehrs zum und vom Server als auch bei aktiver Prüfung des Verhaltens eines Cloak-Servers. Dies wird durch eine Reihe von kryptografischen Steganografie-Techniken erreicht.
Cloak kann mit jedem Proxy-Programm verwendet werden, das Datenverkehr über TCP oder UDP tunnelt, wie Shadowsocks, OpenVPN und Tor. Auf demselben Server-Host können mehrere Proxy-Server laufen, und der Cloak-Server fungiert als Reverse-Proxy, der Clients mit dem gewünschten Proxy-Endpunkt verbindet.
Cloak multiplexiert den Datenverkehr über mehrere zugrunde liegende TCP-Verbindungen, was Head-of-Line-Blocking reduziert und den TCP-Handshake-Overhead eliminiert. Dies macht das Verkehrsmuster realen Websites ähnlicher.
Cloak bietet Multi-User-Unterstützung, sodass mehrere Clients auf demselben Port (standardmäßig 443) eine Verbindung zum Proxy-Server herstellen können. Es bietet auch Verkehrsverwaltungsfunktionen wie Nutzungsguthaben und Bandbreitenkontrolle. So kann ein Proxy-Server mehrere Benutzer bedienen, selbst wenn die zugrunde liegende Proxy-Software nicht für mehrere Benutzer ausgelegt ist.
Cloak unterstützt auch das Tunneln durch einen zwischengeschalteten CDN-Server wie Amazon Cloudfront. Solche Dienste sind so weit verbreitet, dass Versuche, den Datenverkehr zu ihnen zu stören, zu sehr hohem Kollateralschaden für den Zensor führen können.
Um Cloak schnell mit Shadowsocks auf einem Server bereitzustellen, können Sie dieses Skript von @HirbodBehnam ausführen.
git clone https://github.com/cbeuw/Cloak
cd Cloak
go get ./...
make
Die erstellten Binärdateien befinden sich im Ordner build.
Beispiele für Konfigurationsdateien finden Sie im Ordner example_config.
RedirAddr ist die Weiterleitungsadresse, wenn der eingehende Datenverkehr nicht von einem Cloak-Client stammt. Idealerweise sollte sie auf eine große, vom Zensor erlaubte Website gesetzt werden (z. B. www.bing.com).
BindAddr ist eine Liste von Adressen, an die Cloak bindet und lauscht (z. B. [":443",":80"], um auf allen Schnittstellen auf den Ports 443 und 80 zu lauschen).
ProxyBook ist ein Objekt, dessen Schlüssel der Name der auf Client-Seite verwendeten Proxy-Methode ist (Groß-/Kleinschreibung beachten). Sein Wert ist ein Array, dessen erstes Element das Protokoll und das zweite Element ein IP:PORT-String des vorgelagerten Proxy-Servers ist, an den Cloak den Datenverkehr weiterleitet.
Beispiel:
{
"ProxyBook": {
"shadowsocks": [
"tcp",
"localhost:51443"
],
"openvpn": [
"tcp",
"localhost:12345"
]
}
}
PrivateKey ist der statische curve25519 Diffie-Hellman-Private-Key, Base64-kodiert.
BypassUID ist eine Liste von UIDs, die ohne Bandbreiten- oder Guthabenbeschränkungen autorisiert sind.
AdminUID ist die UID des Admin-Benutzers in Base64. Sie können dies leer lassen, wenn Sie Benutzer nur zu BypassUID hinzufügen.
DatabasePath ist der Pfad zu userinfo.db, das zur Speicherung von Benutzernutzungsinformationen und -beschränkungen verwendet wird. Cloak erstellt die Datei automatisch, wenn sie nicht existiert. Sie können dies leer lassen, wenn Sie Benutzer nur zu BypassUID hinzufügen. Dieses Feld hat auch keine Wirkung, wenn AdminUID keine gültige UID oder leer ist.
KeepAlive ist die Anzahl der Sekunden, die das Betriebssystem nach Inaktivität warten soll, bevor TCP-Keepalive-Sonden an den vorgelagerten Proxy-Server gesendet werden. Null oder ein negativer Wert deaktiviert es. Standard ist 0 (deaktiviert).
UID ist Ihre UID in Base64.
Transport kann entweder direct oder CDN sein. Wenn der Server-Host wünscht, dass Sie sich direkt mit ihm verbinden, verwenden Sie direct. Wenn stattdessen ein CDN verwendet wird, verwenden Sie CDN.
PublicKey ist der statische curve25519 Public-Key in Base64, vom Server-Administrator bereitgestellt.
ProxyMethod ist der Name der verwendeten Proxy-Methode. Dieser muss exakt mit einem Eintrag in der ProxyBook-Liste des Servers übereinstimmen.
EncryptionMethod ist der Name des Verschlüsselungsalgorithmus, den Cloak verwenden soll. Optionen sind plain, aes-256-gcm (synonym zu aes-gcm), aes-128-gcm und chacha20-poly1305. Hinweis: Cloak ist nicht für die Transportsicherheit gedacht. Der Zweck der Verschlüsselung ist es, Fingerabdrücke von Proxy-Protokollen zu verbergen und die Nutzdaten statistisch zufällig erscheinen zu lassen. Sie dürfen es nur dann auf plain belassen, wenn Sie sicher sind, dass Ihr zugrunde liegendes Proxy-Tool bereits sowohl Verschlüsselung als auch Authentifizierung (via AEAD oder ähnlichen Techniken) bietet.
ServerName ist die Domain, von der Ihr ISP oder Ihre Firewall denken soll, dass Sie sie besuchen. Idealerweise sollte sie mit RedirAddr in der Serverkonfiguration übereinstimmen – einer großen Seite, die der Zensor erlaubt –, muss es aber nicht. Verwenden Sie random, um den Server-Namen für jede Verbindung zu randomisieren.
AlternativeNames ist ein Array, das zusammen mit ServerName verwendet wird, um bei jeder neuen Verbindung zwischen verschiedenen ServerNamen zu mischen. Dies kann mit dem CDN-Transportmodus in Konflikt geraten, wenn der CDN-Anbieter Domain-Fronting verbietet und die alternativen Domains ablehnt.
Beispiel:
{
"ServerName": "bing.com",
"AlternativeNames": ["cloudflare.com", "github.com"]
}
CDNOriginHost ist der Domainname des Origin-Servers (d. h. des Servers, auf dem Cloak läuft) im CDN-Modus. Dies wirkt sich nur aus, wenn Transport auf CDN gesetzt ist. Falls nicht gesetzt, wird standardmäßig der Remote-Hostname verwendet, der über das Befehlszeilenargument (im Standalone-Modus) oder von Shadowsocks (im Plugin-Modus) bereitgestellt wird. Nachdem eine TLS-Sitzung mit dem CDN-Server hergestellt wurde, wird dieser Domainname im Host-Header der HTTP-Anfrage verwendet, um den CDN-Server aufzufordern, eine WebSocket-Verbindung mit diesem Host herzustellen.
CDNWsUrlPath ist der URL-Pfad, der zum Erstellen der WebSocket-Anfrage im CDN-Modus verwendet wird, und wirkt sich ebenfalls nur aus, wenn Transport auf CDN gesetzt ist. Falls nicht gesetzt, wird standardmäßig "/" verwendet. Diese Option dient zum Erstellen der ersten Zeile der HTTP-Anfrage, nachdem eine TLS-Sitzung hergestellt wurde. Sie ist hauptsächlich für einen Cloak-Server hinter einem Reverse-Proxy gedacht, bei dem nur Anfragen unter einem bestimmten URL-Pfad weitergeleitet werden.
NumConn ist die Anzahl der zugrunde liegenden TCP-Verbindungen, die Sie verwenden möchten. Der Standardwert 4 sollte für die meisten Benutzer angemessen sein. Ein zu hoher Wert beeinträchtigt die Leistung. Ein Wert von 0 deaktiviert das Connection-Multiplexing, und jede TCP-Verbindung erzeugt eine separate kurzlebige Sitzung, die nach ihrer Beendigung geschlossen wird. Dies verhält sich wie GoQuiet. Dies könnte für Benutzer mit instabilen Verbindungen nützlich sein.
BrowserSig ist der Browser, den Sie scheinbar verwenden möchten. Es hat nichts mit dem tatsächlich verwendeten Browser zu tun. Derzeit werden chrome, firefox und safari unterstützt.
KeepAlive ist die Anzahl der Sekunden, die das Betriebssystem nach Inaktivität warten soll, bevor TCP-Keepalive-Sonden an den Cloak-Server gesendet werden. Null oder ein negativer Wert deaktiviert es. Standard ist 0 (deaktiviert). Warnung: Die Aktivierung könnte Ihren Server als Proxy leichter erkennbar machen, aber der Cloak-Client erkennt Internetunterbrechungen schneller.
StreamTimeout ist die Anzahl der Sekunden, die Cloak auf eine eingehende Verbindung von einem Proxy-Programm wartet, um Daten zu senden, wonach die Verbindung von Cloak geschlossen wird. Cloak erzwingt nach dem Aufbau keine Timeouts für TCP-Verbindungen.
ck-server -key aus. Der öffentliche Schlüssel sollte den Benutzern gegeben werden, der private Schlüssel sollte geheim bleiben.ck-server -uid aus. Die neue UID wird als AdminUID verwendet.example_config/ckserver.json an einen gewünschten Ort. Ändern Sie PrivateKey in den soeben erhaltenen privaten Schlüssel; ändern Sie AdminUID in die soeben erhaltene UID.ProxyBook in der Konfigurationsdatei entsprechend.sudo ck-server -c <Pfad zu ckserver.json> aus. ck-server benötigt Root-Rechte, da es an einen niedrigen Port (443) bindet. Alternativ können Sie https://superuser.com/a/892391 folgen, um Root-Rechte für ck-server zu vermeiden.Führen Sie ck-server -uid aus und fügen Sie die UID in das Feld BypassUID in ckserver.json ein.
AdminUID generiert und in ckserver.json gesetzt haben, zusammen mit einem Pfad zu userinfo.db in DatabasePath (Cloak erstellt diese Datei für Sie, falls sie noch nicht existiert).ck-client -s <IP des Servers> -l <Ein lokaler Port> -a <AdminUID> -c <Pfad zu ckclient.json> aus, um den Admin-Modus zu aktivieren.index.html in einem Browser öffnen. Es ist kein Webserver erforderlich).127.0.0.1:<den in Schritt 1 eingegebenen Port> als API-Basis ein und klicken Sie auf List.+-Panel klicken.Hinweis: Die Benutzerdatenbank ist persistent, da sie auf der Festplatte gespeichert ist. Sie müssen die Benutzer nicht jedes Mal erneut hinzufügen, wenn Sie ck-server starten.
Der Android-Client ist hier verfügbar: https://github.com/cbeuw/Cloak-android
example_config/ckclient.json an einen Ort Ihrer Wahl. Geben Sie die erhaltene UID und PublicKey ein. Setzen Sie ProxyMethod so, dass es exakt mit dem entsprechenden Eintrag in ProxyBook auf dem Server übereinstimmt.ck-client -c <Pfad zu ckclient.json> -s <IP Ihres Servers> aus.Wenn Sie dieses Projekt nützlich finden, können Sie meinen Merch-Store besuchen; alternativ können Sie direkt an mich spenden.
BTC: bc1q59yvpnh0356qq9vf0j2y7hx36t9ysap30spx9h
ETH: 0x8effF29a8F9bD38A367580527AC303972c92b60c