Een transparante proxy met ssh en sshuttle

Gepost in Command line, Linux, Security, Open Source, 1 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
Een complete Mastodon API client bouwen

Mastodon heeft een behoorlijk uitgebreide API, maar geen openapi spec. Het was best een uitdaging om een complete client hiervoor te maken.

Lees meer →

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
Dertig jaar Debian!

Vandaag, 16 augustus 2023, is de dertigste verjaardag van de Debian GNU/Linux distributie. Het was de alleerste linux-versie die installeerde nadat ik Windows voorgoed achter me liet. Vandaag is Debian nog steeds relevant.

Lees meer →

image
Een nieuw blogplatform

Ik vond het wel eens tijd om wat meer over mijn vak te schrijven. Dus heb ik een blog opgezet. Hiervoor heb mijn eigen custom blogplatform gebouwd. En daar schrijf ik dus meteen maar een eerste post over.

Lees meer →