SSH SOCKS-tunnel en Firefox

Ik heb een VPN. Maar dat is eigenlijk een management-VPN die bedoeld is om servers te beheren, en niet echt om internetverkeer te verwerken om spionerende netwerkbeheerders te slim af te zijn.

Dus, een andere oplossing. Een simpele oplossing.

Met SSH, en de jump host uit dit bericht is het zelfs heel simpel. SSH kan immers zonder al te veel moeite een SOCKS-tunnel opzetten, waarmee je al het verkeer dat naar de getunnelde poort gestuurd wordt kan doorsturen naar de remote host.

Het SSH-commando is simpel, de uitleg iets minder.

ssh -D 9999 -C -q -N pieter@vpn.helptux.be

Dit commando doet het volgende:

  • -D 9999: forward poort 9999 op jouw lokaal systeem naar vpn.helptux.be
  • -C: comprimeer het verkeer
  • -q: geen output
  • -N: er volgt geen commando (houdt de tunnel open)

Je maakt hiermee automatisch een SOCKS-tunnel aan die al het verkeer dat je naar poort 9999 stuurt zal forwarden naar vpn.helptux.be, waar het verkeer dan verder via het juiste protocol (bv. HTTP) wordt verwerkt.

Je kan dan in jouw browser als SOCKS-proxy (niet als HTTP(S)-proxy, dit zal niet werken) 127.0.0.1:9999 ingeven. Stuur al het verkeer (ook DNS) via de proxy, maar laat de instellingen voor de HTTP, HTTPS en FTP(S)-proxies leeg. SOCKS zal dit automatisch oplossen.

SSH Jump host

Als je meerdere servers hebt, dan is het aangeraden om een intern, management-only, netwerk te voorzien, om beheertaken (DNS, Puppet, Zabbix enz.) uit te voeren die je niet via het publieke netwerk wil sturen. Uiteraard heeft dit netwerk geen toegang tot het internet. Gezien mijn hosts niet allemaal in hetzelfde datacenter zitten, en ik geen geld heb voor een dedicated link, gebruik ik OpenVPN voor het achterliggende netwerk.

Nu wil ik wel kunnen inloggen op alle hosts via dit netwerk, voornamelijk omdat ik dan de interne domeinnamen kan gebruiken. Maar daarvoor heb je natuurlijk een toegang nodig, de jump host. Voor mij is dat de VPN-server (bereikbaar via SSH vanop het publieke netwerk).

Uiteraard ondersteunt SSH dit, en het is zelfs niet zo moeilijk.

Zeg dat alle hosts zich in het interne *.dc.helptux.be-domein bevinden, en dat pieter de gebruiker is om aan te loggen. vpn.helptux.be is de domeinnaam van de VPN-server (dit werkt ook met IP-adressen).

Voeg dan het volgende toe in $home/.ssh/config:

Host *.dc.helptux.be
 ProxyJump vpn.helptux.be

Omdat SSH eerst inlogt op de jump host kan je de hostnamen van het interne netwerk en de interne DNS-server gebruiken, zolang de jump host de domeinnamen kan resolven natuurlijk.

Als jouw lokale gebruiker niet gelijk is aan de gebruiker op de jump host, voeg dan je gebruikersnaam toe aan de jump host:

ProxyJump pieter@vpn.helptux.be

Uiteraard kan je ook User en IdentityFile toevoegen, maar let wel dat IdentityFile de locatie is op jouw lokaal systeem (bv. laptop) en niet op de jump host. User is de gebruiker waarmee je inlogt op de uiteindelijke host, niet de jump host.

Voor gebruikers van een OpenSSH-versie onder 7.3 werkt het bovenstaande, mooie commando niet. Maar, niet getreurd, ook voor hen is er hulp! In plaats van ProxyJump user@jumphost moet je het volgende in $home/.ssh/config plaatsen:

ProxyCommand ssh pieter@vpn.helptux.be -W %h:%p

Nu werkt het ook op Ubuntu …