Een SSH-client maakt verbinding met een Secure Shell-server, waarmee u terminalopdrachten kunt uitvoeren alsof u voor een andere computer zit. Maar een SSH-client stelt je ook in staat om een poort te “tunnelen” tussen je lokale systeem en een externe SSH-server.
Er zijn drie verschillende soorten SSH-tunneling en ze worden allemaal voor verschillende doeleinden gebruikt. Elk omvat het gebruik van een SSH-server om verkeer van de ene netwerkpoort naar de andere om te leiden. Het verkeer wordt verzonden via de gecodeerde SSH-verbinding, dus het kan tijdens de overdracht niet worden gecontroleerd of gewijzigd.
U kunt dit doen met de ssh
commando opgenomen op Linux, macOS en andere UNIX-achtige besturingssystemen. Op Windows, dat geen ingebouwde ssh-opdracht bevat, raden we de gratis tool PuTTY aan om verbinding te maken met SSH-servers. Het ondersteunt ook SSH-tunneling.
Local Port Forwarding: maak externe bronnen toegankelijk op uw lokale systeem
Met “Local port forwarding” krijgt u toegang tot lokale netwerkbronnen die niet toegankelijk zijn voor internet. Stel dat u vanuit uw huis toegang wilt tot een databaseserver op uw kantoor. Om veiligheidsredenen is die databaseserver alleen geconfigureerd om verbindingen van het lokale kantoornetwerk te accepteren. Maar als je op kantoor toegang hebt tot een SSH-server, en die SSH-server staat verbindingen van buiten het kantoornetwerk toe, dan kun je vanuit huis verbinding maken met die SSH-server en toegang krijgen tot de databaseserver alsof je op kantoor bent. Dit is vaak het geval, omdat het gemakkelijker is om een enkele SSH-server te beveiligen tegen aanvallen dan om verschillende netwerkbronnen te beveiligen.
Om dit te doen, brengt u een SSH-verbinding tot stand met de SSH-server en geeft u de client opdracht om verkeer van een specifieke poort van uw lokale pc – bijvoorbeeld poort 1234 – door te sturen naar het adres van de databaseserver en de poort op het kantoornetwerk. Dus als u probeert toegang te krijgen tot de databaseserver op poort 1234 van uw huidige pc, “localhost”, wordt dat verkeer automatisch via de SSH-verbinding “getunneld” en naar de databaseserver gestuurd. De SSH-server zit in het midden en stuurt verkeer heen en weer. U kunt elke opdrachtregel of elk grafisch hulpmiddel gebruiken om toegang te krijgen tot de databaseserver alsof deze op uw lokale pc draait.
Om lokaal doorsturen te gebruiken, maakt u normaal verbinding met de SSH-server, maar levert u ook het -L
argument. De syntaxis is:
ssh -L local_port:remote_address:remote_port username@server.com
Stel dat de databaseserver op uw kantoor zich op het kantoornetwerk bevindt op 192.168.1.111. Je hebt toegang tot de SSH-server van het kantoor op ssh.youroffice.com
, en uw gebruikersaccount op de SSH-server is bob
. In dat geval ziet uw commando er als volgt uit:
ssh -L 8888:192.168.1.111:1234 bob@ssh.youroffice.com
Nadat je die opdracht hebt uitgevoerd, heb je toegang tot de databaseserver op poort 8888 op localhost. Dus als de databaseserver webtoegang biedt, kunt u http: // localhost: 8888 in uw webbrowser steken om er toegang toe te krijgen. Als je een opdrachtregelprogramma had dat het netwerkadres van een database nodig heeft, zou je het naar localhost: 8888 verwijzen. Al het verkeer dat naar poort 8888 op uw pc wordt verzonden, wordt getunneld naar 192.168.1.111:1234 op uw kantoornetwerk.
Het is iets meer verwarrend als u verbinding wilt maken met een servertoepassing die op hetzelfde systeem draait als de SSH-server zelf. Stel dat u een SSH-server hebt die op poort 22 op uw kantoorcomputer draait, maar u hebt ook een databaseserver die op poort 1234 draait op hetzelfde systeem op hetzelfde adres. U wilt vanuit huis toegang tot de databaseserver, maar het systeem accepteert alleen SSH-verbindingen op poort 22 en de firewall staat geen andere externe verbindingen toe.
In dit geval zou u een commando kunnen uitvoeren zoals het volgende:
ssh -L 8888:localhost:1234 bob@ssh.youroffice.com
Wanneer u probeert toegang te krijgen tot de databaseserver op poort 8888 op uw huidige pc, wordt het verkeer via de SSH-verbinding verzonden. Wanneer het aankomt op het systeem waarop de SSH-server draait, stuurt de SSH-server het naar poort 1234 op “localhost”, wat dezelfde pc is waarop de SSH-server zelf draait. Dus de “localhost” in de bovenstaande opdracht betekent “localhost” vanuit het perspectief van de externe server.
Om dit te doen in de PuTTY-toepassing op Windows, selecteert u Verbinding> SSH> Tunnels. Selecteer de optie “Lokaal”. Voer bij “Source Port” de lokale poort in. Geef bij “Bestemming” het bestemmingsadres en de poort op in de vorm remote_address: remote_port.
Als u bijvoorbeeld dezelfde SSH-tunnel als hierboven wilt opzetten, gaat u naar 8888
als de bronpoort en localhost:1234
als bestemming. Klik daarna op “Toevoegen” en klik vervolgens op “Openen” om de SSH-verbinding te openen. U moet natuurlijk ook het adres en de poort van de SSH-server zelf invoeren op het hoofdscherm “Sessie” voordat u verbinding maakt.
Remote Port Forwarding: maak lokale bronnen toegankelijk op een extern systeem
“Remote port forwarding” is het tegenovergestelde van lokale forwarding en wordt niet zo vaak gebruikt. Hiermee kunt u een bron op uw lokale pc beschikbaar maken op de SSH-server. Stel dat u een webserver uitvoert op de lokale pc waar u voor zit. Maar uw pc zit achter een firewall die geen inkomend verkeer naar de serversoftware toestaat.
Ervan uitgaande dat u toegang hebt tot een externe SSH-server, kunt u verbinding maken met die SSH-server en externe port forwarding gebruiken. Uw SSH-client zal de server vertellen om een specifieke poort, zeg maar poort 1234, op de SSH-server door te sturen naar een specifiek adres en poort op uw huidige pc of lokaal netwerk. Wanneer iemand toegang krijgt tot poort 1234 op de SSH-server, wordt dat verkeer automatisch via de SSH-verbinding “getunneld”. Iedereen met toegang tot de SSH-server heeft toegang tot de webserver die op uw pc draait. Dit is in feite een manier om door firewalls te tunnelen.
Om extern doorschakelen te gebruiken, gebruikt u de ssh
commando met de -R
argument. De syntaxis is grotendeels hetzelfde als bij lokaal doorsturen:
ssh -R remote_port:local_address:local_port username@server.com
Stel dat u een servertoepassing die luistert op poort 1234 op uw lokale pc beschikbaar wilt maken op poort 8888 op de externe SSH-server. Het adres van de SSH-server is ssh.youroffice.com
en je gebruikersnaam op de SSH-server is Bob. U zou de volgende opdracht uitvoeren:
ssh -R 8888:localhost:1234 bob@ssh.youroffice.com
Iemand zou dan verbinding kunnen maken met de SSH-server op poort 8888 en die verbinding zou worden getunneld naar de servertoepassing die wordt uitgevoerd op poort 1234 op de lokale pc waarvan je de verbinding hebt gemaakt.
Om dit in PuTTY op Windows te doen, selecteert u Verbinding> SSH> Tunnels. Selecteer de optie “Remote”. Voer bij “Bronpoort” de externe poort in. Geef bij “Bestemming” het bestemmingsadres en de poort op in de vorm local_address: local_port.
Als u bijvoorbeeld het bovenstaande voorbeeld wilt instellen, voert u in 8888
als de bronpoort en localhost:1234
als bestemming. Klik daarna op “Toevoegen” en klik vervolgens op “Openen” om de SSH-verbinding te openen. U moet natuurlijk ook het adres en de poort van de SSH-server zelf invoeren op het hoofdscherm “Sessie” voordat u verbinding maakt.
Mensen konden dan verbinding maken met poort 8888 op de SSH-server en hun verkeer zou worden getunneld naar poort 1234 op uw lokale systeem.
Standaard luistert de externe SSH-server alleen naar verbindingen van dezelfde host. Met andere woorden, alleen mensen op hetzelfde systeem als de SSH-server zelf kunnen verbinding maken. Dit is om veiligheidsredenen. U moet de optie “GatewayPorts” inschakelen in sshd_config op de externe SSH-server als u dit gedrag wilt negeren.
Dynamic Port Forwarding: gebruik uw SSH-server als een proxy
VERWANT: Wat is het verschil tussen een VPN en een proxy?
Er is ook “dynamische poortdoorschakeling”, die op dezelfde manier werkt als een proxy of VPN. De SSH-client maakt een SOCKS-proxy waarmee u toepassingen kunt configureren. Al het verkeer dat via de proxy wordt verzonden, wordt via de SSH-server verzonden. Dit is vergelijkbaar met lokaal doorsturen: het neemt lokaal verkeer dat naar een specifieke poort op uw pc wordt gestuurd en verzendt het via de SSH-verbinding naar een externe locatie.
VERWANT: Waarom het gebruik van een openbaar Wi-Fi-netwerk gevaarlijk kan zijn, zelfs bij toegang tot gecodeerde websites
Stel dat u een openbaar wifi-netwerk gebruikt. U wilt veilig browsen zonder te worden bekeken. Als je thuis toegang hebt tot een SSH-server, kun je er verbinding mee maken en dynamische port forwarding gebruiken. De SSH-client maakt een SOCKS-proxy op uw pc. Al het verkeer dat naar die proxy wordt verzonden, wordt via de SSH-serververbinding verzonden. Niemand die het openbare Wi-Fi-netwerk bewaakt, kan uw browsen controleren of de websites waartoe u toegang hebt, censureren. Vanuit het perspectief van alle websites die u bezoekt, is het alsof u thuis achter uw pc zit. Dit betekent ook dat je deze truc kunt gebruiken om toegang te krijgen tot websites die alleen in de VS zijn, terwijl je buiten de VS bent – ervan uitgaande dat je natuurlijk toegang hebt tot een SSH-server in de VS.
Als een ander voorbeeld wilt u misschien toegang krijgen tot een mediaservertoepassing op uw thuisnetwerk. Om veiligheidsredenen heeft u mogelijk alleen een SSH-server die is blootgesteld aan internet. U staat geen inkomende verbindingen van internet naar uw mediaservertoepassing toe. U kunt dynamische poortdoorschakeling instellen, een webbrowser configureren om de SOCKS-proxy te gebruiken en vervolgens toegang krijgen tot servers die op uw thuisnetwerk draaien via de webbrowser alsof u thuis achter uw SSH-systeem zit. Als uw mediaserver zich bijvoorbeeld op poort 192.168.1.123 op uw thuisnetwerk bevindt, kunt u het adres invoeren 192.168.1.123
in elke toepassing die de SOCKS-proxy gebruikt en u toegang krijgt tot de mediaserver alsof u zich op uw thuisnetwerk bevindt.
Om dynamisch doorsturen te gebruiken, voert u de opdracht ssh uit met de -D
argument, zoals zo:
ssh -D local_port username@server.com
Stel dat u toegang heeft tot een SSH-server op ssh.yourhome.com
en je gebruikersnaam op de SSH-server is bob
. U wilt dynamisch doorsturen gebruiken om een SOCKS-proxy te openen op poort 8888 op de huidige pc. U zou de volgende opdracht uitvoeren:
ssh -D 8888 bob@ssh.yourhome.com
Je zou dan een webbrowser of een andere applicatie kunnen configureren om je lokale IP-adres (127.0.01) en poort 8888 te gebruiken. Al het verkeer van die applicatie zou door de tunnel worden geleid.
Om dit in PuTTY op Windows te doen, selecteert u Verbinding> SSH> Tunnels. Selecteer de optie “Dynamisch”. Voer bij “Source Port” de lokale poort in.
Als u bijvoorbeeld een SOCKS-proxy op poort 8888 wilt maken, voert u in 8888
als de bronpoort. Klik daarna op “Toevoegen” en klik vervolgens op “Openen” om de SSH-verbinding te openen. U moet natuurlijk ook het adres en de poort van de SSH-server zelf invoeren op het hoofdscherm “Sessie” voordat u verbinding maakt.
U kunt dan een toepassing configureren om toegang te krijgen tot de SOCKS-proxy op uw lokale pc (dat wil zeggen IP-adres 127.0.0.1, dat naar uw lokale pc verwijst) en de juiste poort specificeren.
VERWANT: Hoe u een proxyserver in Firefox configureert
U kunt Firefox bijvoorbeeld configureren om de SOCKS-proxy te gebruiken. Dit is vooral handig omdat Firefox zijn eigen proxy-instellingen kan hebben en geen systeembrede proxy-instellingen hoeft te gebruiken. Firefox zal zijn verkeer door de SSH-tunnel sturen, terwijl andere applicaties uw internetverbinding normaal zullen gebruiken.
Wanneer u dit in Firefox doet, selecteert u “Handmatige proxyconfiguratie”, voert u “127.0.0.1” in het SOCKS-hostvak in en voert u de dynamische poort in het vak “Poort” in. Laat de vakken HTTP-proxy, SSL-proxy en FTP-proxy leeg.
De tunnel blijft actief en open zolang je de SSH-sessieverbinding open hebt staan. Wanneer u uw SSH-sessie beëindigt en de verbinding met een server verbreekt, wordt de tunnel ook gesloten. Maak gewoon opnieuw verbinding met het juiste commando (of de juiste opties in PuTTY) om de tunnel opnieuw te openen.