RawLink: Een betrouwbaar versleuteld transport met ingebouwde SSH-obfuscatie

Let op: De code is geschreven met assistentie van AI en is grondig beoordeeld door de auteur. Desondanks is er nog een uitgebreidere en diepgaandere beveiligingsaudit nodig. Gebruik de software op eigen risico en pas passende beveiligingsmaatregelen toe bij het gebruik voor gevoelig werk.

Kenmerken

  • Versleutelde verbindingen: Maakt gebruik van AES-256-GCM.
  • Multiplexing: Eén verbinding kan meerdere streams dragen.
  • Traffic Obfuscation: Optionele obfuscatie om de verbinding moeilijker herkenbaar te maken.
  • SSH-mimicry: Optionele mogelijkheid om SSH-verkeer na te bootsen.
  • Automatische reconnect: Herstelt automatisch de verbinding wanneer een tunnel faalt.
  • Meerdere tunnels: Ondersteunt het gebruik van meerdere tunnels.
  • Authenticatie: Maakt gebruik van een pre-shared key (PSK) om verbindingen te authenticeren.

Hoe het werkt

RawLink neemt verkeer over van een lokale SOCKS5-proxy, versleutelt dit en verzendt het via een tunnel naar de remote server. De server ontsleutelt de data en stuurt deze door naar de uiteindelijke bestemming. Meerdere verbindingen kunnen dezelfde tunnel delen.

Pakketformaat

RawLink versleutelt gegevens met AES-256-GCM (ondersteuning voor andere versleutelingsschema's kan in de toekomst worden toegevoegd) en voegt informatie toe zoals een sessie-ID en een pakketnummer. Bij gebruik van TCP heeft elk pakket ook een lengte-prefix, zodat de ontvanger kan bepalen waar het pakket eindigt.

Structuur van het pakket:

Byte 0Bytes 1..9Bytes 9..17Bytes 17..
ver (4) \kp (1) \r (3)Session ID (u64, LE)Pakketnummer (u64, LE)Versleutelde body + 16-byte tag
17-byte header (AAD)AES-256-GCM

De header is niet versleuteld, omdat de ontvanger het sessie-ID en het pakketnummer moet kunnen lezen voordat de juiste sleutel kan worden opgezocht om de body te ontsleutelen. Om dit probleem op te lossen, wordt elke 17-byte header XOR-gemasked met een XChaCha20-keystream voordat deze over het netwerk wordt verzonden. Hierdoor zou het volledige pakket voor iedereen zonder de PSK verschijnen als uniforme willekeurige data.

Obfuscatielaag

De optionele obfuscatielaag past aan hoe het verkeer op het netwerk verschijnt, waardoor het moeilijker te herkennen is als RawLink-verkeer. Deze laag kan ook optionele SSH-traffic mimicry gebruiken en is gescheiden van het kernprotocol.

Momenteel zijn er twee optionele obfuscatie-modi beschikbaar:

  • rand: Zorgt ervoor dat verkeer lijkt op willekeurige data. Het maskeert pakketheaders, voegt willekeurige padding toe en kan dummy-verkeer verzenden tijdens perioden van inactiviteit.
  • ssh: Laat de verbinding lijken op een SSH-sessie, inclusief de initiële handshake, voordat er wordt overgeschakeld naar versleuteld tunnelverkeer.

Gebruiksaanwijzing

Basisgebruik

Server:

rawlink server --listen 0.0.0.0:6123 \
--psk <64-hex-chars>

Client:

rawlink client --server <server-ip>:6123 \
--socks-listen 127.0.0.1:1080 \
--psk <64-hex-chars>

Gebruik via proxy:

curl --proxy socks5h://127.0.0.1:1080 https://example.com

Met SSH-obfuscatie

Server: (SSH-camouflage, waardoor het lijkt op een gewone sshd)

target/release/rawlink server --listen 0.0.0.0:6123 --psk <64-hex> \
--obfs ssh --ssh-banner 'SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.5'

Client: (Let op: de banners moeten overeenkomen)

target/release/rawlink client --server <server-ip>:6123 \
--socks-listen 127.0.0.1:1080 --psk <64-hex> --obfs ssh

Met random noise-obfuscatie

Server:

target/release/rawlink server --listen 0.0.0.0:6123 --psk <64-hex> --obfs rand

Client: (Moet overeenkomen met de modus van de server)

target/release/rawlink client --server <server-ip>:6123 \
--socks-listen 127.0.0.1:1080 --psk <64-hex> --obfs rand

Documentatie

Er is een blogpost gepubliceerd op de persoonlijke blog van de auteur waarin wordt uitgelegd hoe het protocol en de implementatie werken: https://zola.ink/blog/posts/rawlink-building-a-vpn-protocol-from-scratch

De specificaties en meer gedetailleerde documentatie zijn nog in ontwikkeling.

Status

RawLink is in ontwikkeling. De beveiliging en de weerstand tegen netwerkcensuur zijn nog niet geverifieerd. Feedback op dit project is welkom; voel je vrij om issues te openen en PR's in te dienen.

Ondersteuning

Wie de ontwikkeling van dit project wil ondersteunen, kan dat doen via: https://zola.ink/support

Licentie

Beschikbaar onder de MIT- of Apache-2.0-licentie.