RawLink is een in Rust geschreven tool voor het creëren van versleutelde TCP-tunnels. Het systeem fungeert als een SOCKS5-proxy die verkeer versleutelt met AES-256-GCM en dit verzendt naar een remote server.
De belangrijkste kenmerken zijn:
- Beveiliging: Gebruik van pre-shared keys (PSK) voor authenticatie en XOR-maskering van headers via XChaCha20 om het verkeer onherkenbaar te maken.
- Obfuscatie: Er zijn twee modi beschikbaar om detectie te voorkomen:
rand (willekeurige data) en ssh (het nabootsen van een SSH-sessie).
- Functionaliteit: Ondersteuning voor multiplexing (meerdere streams over één verbinding), automatische reconnects en het gebruik van meerdere tunnels.
Het project is momenteel in ontwikkeling. De auteur benadrukt dat er nog een uitgebreide beveiligingsaudit nodig is en adviseert gebruikers om de software op eigen risico te gebruiken.
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 0 | Bytes 1..9 | Bytes 9..17 | Bytes 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.
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 0 | Bytes 1..9 | Bytes 9..17 | Bytes 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.