Een transparante proxy met ssh en sshuttle

Gepost in Command line, Linux, Security, Open Source, 2 jaar geleden Leestijd: 3 minuten
image

Een van de meest krachtige tools die op elk unix of linux systeem beschikbaar zijn is ssh. Je kan het gebruiken om een secure shell te openen op een andere machine, of daar een commando te runnen, verkeer te tunnelen of zelfs om remote bestandssystemen te mounten. Je kan er ook een proxy mee opzetten en zelfs een transparant systeembreed vpn, met wat hulpscripts.

Als je gewoon een secure vpn nodig hebt is het logisch om daar een gebruikelijke oplossing zoals OpenVPN of Wireguard voor te gebruiken. Maar er zijn genoeg gevallen denkbaar waar dit lastig of onmogelijk is. Deze software is lang niet altijd beschikbaar en vaak heb je niet de rechten of mogelijkheid om die te installeren.

Maar een ssh server heb je vaak wel. Daarmee kun je zonder extra tools heel makkelijk een lokale SOCKS5 proxy opzetten.

Het SOCKS5 protocol heeft in de basis helemaal geen encryptie. Maar als je het verkeer tunnelt over ssh is alles natuurlijk wel encrypted. Dat maakt het samen met de authenticatie van ssh op basis van keys veilig genoeg.

Opzetten is simpel:

ssh -D8080 -N user@hostname
  • -D8080 opent een SOCKS server op de lokale tcp poort 8080
  • -N (optioneel) zorgt ervoor dat er geen commando (zoals een shell) wordt uitgevoerd op de remote host.

Vervolgens kun je in elk programma met ondersteuning voor SOCKS proxy's gebruik maken van deze tunnel. Dit moet je wel per applicatie configureren. Bijvoorbeeld in de network instellingen van firefox:

Screenshot van Firefox network proxy settings

Dit is meteen het nadeel: de applicatie moet wel SOCKS ondersteuning hebben. Veel applicaties hebben dat niet, en die kunnen dus niet gebruik maken van de proxy.

Je zou misschien zelf aan de gang kunnen gaan met bijvoorbeeld iptables om al het verkeer door de proxy te dwingen maar het is veel makkelijker en sneller om daar een kant en klare tool voor te gebruiken: sshuttle.

sshuttle is een python applicatie die de kracht van ssh combineert met tools als iptables (linux) of pfSense (MacOS). Hiermee wordt een transparante, systeembrede proxy gerealiseerd naar de remote server, zonder dat je daar iets extra's voor hoef te installeren of configureren. De tool is eenvoudig te installeren met brew install sshuttle onder MacOS, of met sudo apt install sshuttle onder Debian of Ubuntu.

Vervolgens zet je de transparante proxy op met:

sshuttle -r user@hostname 0.0.0.0/0

Tip: start dit in een screen sessie zodat de verbinding niet verbroken wordt als je de terminal sluit

Met 0.0.0.0/0 zorgen we ervoor dat al het verkeer over de tunnel gaat. Maar je kan hier specifieke ip-adressen en/of subnetten opgeven.

NB: Het redirecten van al het netwerkverkeer op een machine vereist root-rechten. De lokale user waaronder je dit draait heeft dus sudo rechten nodig om sshuttle als root te draaien. Op de remote machine heb je geen speciale rechten nodig.

Voor meer informatie zie de volledig documentatie.

Als de proxy draait kun je testen of het echt werkt met het volgende commando:

curl ifconfig.me

Dit geeft als output je externe ip, en dit zou nu in het ip van de remote server moeten zijn.

Gerelateerde posts

image
PHP: Frankenstein arrays

PHP is inmiddels best een mooie taal geworden, maar kent nog wel wat nare erfenissen uit het verleden. Zoals de verraderlijke Frankenstein abominatie ook wel bekend als de "array".

Lees meer →

image
Sublime Text als volwaardige PHP IDE

Sublime Text lijkt misschien op eerste gezicht meer een text editor dan een IDE, maar schijn bedriegt. Lees hier waarom ik Sublime Text prefereer boven andere editors of IDEs, en hoe je er het meeste uit kan halen met behulp van de juiste plugins.

Lees meer →

image
Nextcloud

Nextcloud wordt ook wel een "google killer" genoemd. Met dit veelzijdige open source pakket kun je veel google (en andere) cloud services vervangen en hiermee je persoonlijke data in eigen hand houden.

Lees meer →

image
Slimme generics in PHP

Type hinting in PHP8 is krachtig maar heeft ook beperkingen. In dit artikel bespreek ik hoe je met Generics die beperkingen voor een groot deel kan wegnemen.

Lees meer →