9 oktober 2018
1 april 2026
Leestijd 11 min
SSH Summer School: jump hosts en bestandsoverdracht
<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >SSH Summer School: jump hosts en bestandsoverdracht</span>
Share this via:

Deze blogpost is het laatste deel van een 3-delige serie over SSH (Secure Shell) verbindingen met OpenSSH. In dit laatste deel van de serie zal ik het hebben over jump/bastion hosts, het gebruik van 'screen' en het overdragen van bestanden. Het doel van deze serie blogposts is om je meer te leren over SSH. In deze blogposts ga ik ervan uit dat je een UNIX-achtig besturingssysteem met OpenSSH gebruikt.

Laten we beginnen met te praten over jump/bastion hosts en waarom ze zo handig zijn. Het komt steeds vaker voor dat de externe server die je wilt benaderen niet directbereikbaar is. In plaats daarvan moet je langs een jump of bastion host.En dat is een goede zaak, want:

  • applicatieservers moeten meestal niet direct aan het internet worden blootgesteld.
  • als je IPv4 gebruikt, is er geen noodzaak voor een publiek IPv4 adres voor elk van je servers.
  • De firewall van slechts één host hoeft te worden geconfigureerd om het IP-adres van uw kantoor toe te staan, wat veel werk bespaart als dit IP-adres verandert.

Het passeren van een jump host kan vervelend zijn omdat je door meerdere servers moet SSH-en. Gelukkig zijn er meerdere manieren om dit te doen. Ik heb hieronder 4 methoden opgesomd!

Hoe een jump host passeren

1. Handmatig

Eén methode om een jump host te passeren is om te SSH-en naar de jump host en dan vanaf de jump host te SSH-en naar je server.

user@local-computer $ ssh jumphostuser@my-jump-host jumphostuser@my-jump-host $ ssh remoteserveruser@my-remote-server [remoteserveruser@my-remote-server ~]$

SSH key

Je zult al snel tot de conclusie komen dat het verbinden met je remote server vanaf de jump host een SSH sleutel op de jump host vereist. Een oplossing zou kunnen zijn om een SSH-sleutel aan te maken op de jump host, maar dit is geen optie voor jump hosts die regelmatig worden vervangen. Dit is waarschijnlijk geen geschikte methode voor de meesten van ons, dus laten we verder gaan met de volgende methode. Oh, en tussen haakjes: kopieer nooit je lokale SSH sleutel naar een andere host zoals een jump host!

2. Agent doorsturen

Ik heb het ssh-agent concept al uitgelegd in de eerste blogpost van deze serie. Met agent forwarding kun je je lokale ssh-agent blootstellen aan een externe server, zoals een jump host. Je kunt ofwel de commandoregeloptie-A of de configuratiebestandoptieForwardAgent gebruiken.

user@local-computer $ ssh-add Voer wachtwoordzin in voor /Users/janbeerden/.ssh/id_rsa: Identiteit toegevoegd: /Users/user/.ssh/id_rsa (/Users/user/.ssh/id_rsa) user@local-computer $ ssh -A jumphostuser@my-jump-host jumphostuser@my-jump-host $ ssh remoteserveruser@my-remote-server [remoteserveruser@my-remote-server ~]$

Door dit te doen heb je geen intermediaire sleutel meer nodig. Je account op de jump-host en de remote server zouden alleen het publieke deel van je lokale SSH sleutel moeten bevatten. Makkelijk genoeg, toch?(smile)

Echter, omdat je je lokale ssh-agent blootstelt aan de jump host, kan de jump host je SSH sleutel gebruiken zonder de passphrase nodig te hebben. Als jij de enige bent die deze jump host gebruikt (en onderhoudt), dan zit je waarschijnlijk goed. Als dat niet het geval is (waarschijnlijk meestal), kan iemand jouw sleutel gebruiken terwijl deze wordt doorgestuurd naar de jump host.

Bij het starten van een SSH verbinding met agent doorsturen ingeschakeld, zal de SSH server een socket aanmaken om je ssh-agent bloot te stellen. Alleen jouw gebruiker op de jump host zal permissies hebben op deze socket, maar deze beperkingen gelden niet voor de root gebruiker of een gebruiker die voldoende permissies heeft via sudo.

3. ProxyCommand

Met de ProxyCommand optie kun je een commando specificeren dat moet worden gebruikt om verbinding te maken met de remote server. Deze optie kan gebruikt worden om SSH verbindingen te 'chainen'. Door "ssh -W" als ProxyCommand te gebruiken, vragen we dat standaard invoer en uitvoer op de client wordt doorgestuurd naar Hostname over het beveiligde kanaal naar my-jump-host.

Host my-jump-host Hostnaam 192.168.0.10 Gebruiker jumphostuser Host my-remote-server Hostnaam 192.168.5.10 Gebruiker remoteserveruser ProxyCommand ssh my-jump-host -W %h:%p

Zoals je kunt zien, vereist dit enige configuratie, maar dat hoeft maar één keer gedaan te worden.

user@local-computer $ ssh my-remote-server [remoteserveruser@my-remote-server ~]$

Als deze configuratie eenmaal staat, kun je 'direct' naar je remote server ssh-en. Het passeren van de bastionhost wordt verzorgd door het ProxyCommando.

4. ProxyJump (ik raad deze aan!)

Sinds OpenSSH 7.3 is er een eenvoudiger te configureren alternatief voor ProxyCommand genaamd ProxyJump.

Host my-jump-host Hostnaam 192.168.0.10 Gebruiker jumphostuser Host my-remote-server Hostnaam 192.168.5.10 Gebruiker remoteservergebruiker ProxyJump my-jump-host

Zoals je kunt zien is de configuratie van deze optie een stuk eenvoudiger.

user@local-computer $ ssh my-remote-server [remoteserveruser@my-remote-server ~]$

Verbinden met je remote server is niet anders dan de ProxyCommand methode. Als je verbinding wilt maken met een remote server zonder deze toe te voegen aan je config bestand via een jump host (die je hebt toegevoegd aan je config bestand), dan is ProxyJump ook erg eenvoudig.

user@local-computer $ ssh remoteserveruser@192.168.0.20 -J my-jump-host

Wanneer je een SSH config bestand deelt met je team, kun je ook de bovenstaande configuratie toevoegen. Ze zullen het zeker waarderen dat ze de configuratie niet zelf hoeven te maken of toe te voegen!

Ik raad deze methode aan in plaats van de andere omdat

  • methode 1 te veel moeite kost elke keer dat je wilt SSH-en naar je externe server,
  • methode 2 een veiligheidsrisico is en nog steeds meerdere stappen vereist elke keer dat je wilt SSH-en naar je externe server,
  • de syntax van methode 3 is complexer en dus minder makkelijk te onthouden dan de ProxyJump methode.

Met methode 3 en 4 heb je ook het voordeel dat je bestanden direct kunt overzetten naar je externe server met scp of sftp zonder dat je ze eerst hoeft te kopiëren naar de jump host. Maar hoe begin je dan precies met het overzetten van bestanden? We zullen in de details van bestandsoverdracht duiken, maar laat me je eerst vertellen over het gebruik van 'screen'.

Scherm gebruiken

computer screen

Aangezien elke jump host een extra foutpunt introduceert, is dit het perfecte moment om 'screen' te gaan gebruiken. Heb je wel eens gehad dat je SSH sessie verbroken werd tijdens het uitvoeren van een langdurig en/of delicaat proces op een externe server? Als je SSH-sessie wordt verbroken, worden alle processen die in de sessie zijn gestart en op de voorgrond draaien beëindigd. Hierdoor moet je helemaal opnieuw beginnen of, afhankelijk van het proces, met een puinhoop achterblijven die je handmatig moet opruimen. Gelukkig kun je voorkomen dat dit een probleem wordt door 'screen' te gebruiken. Van de man pagina:

Screen is een schermvullende window manager die een fysieke terminal vermenigvuldigt tussen verschillende processen (typisch interactieve shells).

Enkele voordelen van het gebruik van screen

  • je shell blijft actief als je SSH sessie wordt verbroken,
  • je kunt lange processen draaien op een externe server zonder dat je een actieve SSH verbinding hoeft te onderhouden,
  • je kunt meerdere vensters gebruiken vanuit een enkele SSH sessie.

Allereerst moet screen geïnstalleerd zijn op je externe server. Als screen nog niet geïnstalleerd is, kun je de package manager van je systeem gebruiken om het te installeren.

Een nieuw scherm starten

Een screen starten is heel eenvoudig:

[remoteservergebruiker@mijn-remote-server ~]$ screen

Screen zal een nieuwe shell aanmaken, net zoals SSH'en naar een server zou doen.

Verbinding verbreken met een screen

Het verschil met een 'standaard' shell is dat je de verbinding kunt verbreken zonder alle subprocessen te doden. Eerst moet je het escape commando invoeren, watCTRL+a is, gevolgd doorCTRL+d

[detached from 4389.pts-0.my-remote-server] [remoteserveruser@my-remote-server ~]$

Screen zal je vertellen dat het je heeft losgekoppeld van een schermsessie. In dit geval heet de sessie 4389.pts-0.my-remote-server. Als je de shell wilt verlaten in plaats van de verbinding te verbreken voor de schermsessie, kun je dat doen alsof het iedere andere shell is. Enter:

  • exit
  • CTRL + d
  • ...

(warning) Wees echter voorzichtig! Screen beschermt je niet tegen het per ongeluk verlaten van je shell. (warning)

Lijst van actieve scherm sessies

Met de optie-ls kun je een lijst maken van alle actieve schermsessies.

[remoteserveruser@my-remote-server ~]$ screen -ls Er zijn schermen op: 4405.pts-0.my-remote-server (losgekoppeld) 4389.pts-0.my-remote-server (losgekoppeld) 2 Sockets in /var/run/screen/S-remoteserveruser.

Elke regel bestaat uit de proces-id en de sessienaam, gescheiden door een punt.

Een nieuw scherm starten met een aangepaste sessienaam

Zoals je kunt zien in de uitvoer hierboven, kunnen schermsessies moeilijk te identificeren zijn. Daarom kan het verstandig zijn om je schermsessie een naam te geven als je hem start:

[remoteserveruser@my-remote-server ~]$ screen -S server-upgrade [remoteserveruser@my-remote-server ~]$ screen -ls Er zijn schermen op: 4475.server-upgrade (Bijgevoegd) 1 Socket in /var/run/screen/S-remoteserveruser.

Aan een losgekoppelde schermsessie koppelen

Als je opnieuw wilt koppelen aan een schermsessie, kun je dat doen met de-r optie. Deze optie neemt ofwel het proces id of de sessienaam als parameter.

[remoteservergebruiker@mijn-remote-server ~]$ screen -r server-upgrade

Meerdere vensters in een enkele schermsessie

Elk van de volgende subsecties gaat ervan uit dat je verbonden bent met een schermsessie.

Een nieuw venster maken in uw schermsessie

DoorCTRL+a gevolgd doorCTRL+c uit te voeren, maak je een nieuw venster.

Lijst met geopende vensters

MetCTRL+a gevolgd doorCTRL+w krijg je een lijst met geopende vensters.

[remoteservergebruiker@mijn-remote-server ~]$ 0$ bash 1-$ bash 2*$ bash

Zoals je kunt zien in de bovenstaande uitvoer, heb ik 3 open vensters, geïdentificeerd door een nummer gevolgd door de titel.

Schakelen tussen vensters

Er zijn 4 (5) manieren om tussen vensters te schakelen:

  1. schakelen naar een specifiek venster
    1. CTRL+a gevolgd door het nummer van het venster
    2. CTRL+a gevolgd door", deze methode is waarschijnlijk het eenvoudigst omdat het je een interactieve vensterselector toont. Door de pijltjestoetsen te gebruiken, kun je het gewenste scherm selecteren en op de returntoets drukken om het te selecteren.
  2. naar het volgende venster gaan:CTRL+a gevolgd doorn
  3. naar het vorige venster gaan:CTRL+a gevolgd doorp
  4. naar het laatste venster gaan:CTRL+a gevolgd dooro

Andere schermtoetscombinaties

Er zijn verschillende toetscombinaties die kunnen worden gebruikt in een schermsessie, na het geven van de besturingsopdracht(CTRL+a). Je kunt een overzicht krijgen van de beschikbare toetscombinaties door op de toets? te drukken. Druk eerst opCTRL+a en dan op de toets?

                    Schermtoetscombinaties, pagina 1 van 2. Commandotoets:  Letterlijk ^A: a break ^B b license , removebuf = clear C lockscreen ^X x reset Z colon : log H screen ^C c copy ^[ [ login L select ' detach ^D d meta a silence _ digraph ^V monitor M split S displays * next ^@ ^N sp n suspend ^Z z dumptermcap .            nummer N tijd ^T t fit F only Q title A flow ^F f other ^A vbell ^G focus ^I pow_break B version v hardcopy h pow_detach D width W help ? prev ^H ^P p ^?   windows ^W w history { } quit ^ wrap ^R r info i readbuf < writebuf > kill K k redisplay ^L l xoff ^S s lastmsg ^M m remove X xon ^Q q [Druk op de spatiebalk voor de volgende pagina; Terug naar het einde.

Een van mijn favorieten iscopy. Zoals de naam al verraadt, kun je hiermee tekst van het ene venster naar het andere kopiëren. Kijk voor een compleet overzicht en uitleg van de beschikbare commandoregelopties en toetscombinaties op de manpage.

Bestanden overzetten

Zoals hierboven beloofd, gaan we het hebben over het overzetten van bestanden. Er zijn een aantal methoden om bestanden over te zetten van, naar en tussen hosts op afstand. In deze sectie zal ik het hebben over bestandsoverdracht via SCP, SFTP en SSH 'streaming'. Alle drie deze methoden werken ook als je een jump host gebruikt wanneer je de ProxyCommand of ProxyJump richtlijn gebruikt zoals hierboven beschreven.

SCP

Met scp of secure copy kun je veilig bestanden kopiëren van, naar of tussen hosts op afstand.

Van

user@local-computer $ scp my-remote-server:~/file.txt ~/Downloads/local/

Naar

user@local-computer $ scp ~/Downloads/local/file.txt my-remote-server:~/

Tussen

user@local-computer $ scp my-remote-server:~/file.txt my-other-remote-server:~/

Bekijk voor meer informatie over het gebruik van scp de man page.

user@local-computer $ man scp

sftp of secure file transfer protocol is een interactief programma voor bestandsoverdracht, vergelijkbaar met ftp, waarmee bestanden veilig van en naar een server op afstand gekopieerd kunnen worden. Door het commando "?" in te voeren krijg je een lijst met mogelijke commando's.

user@local-computer $ sftp my-remote-server sftp> ?
Beschikbare commando's:
bye Sluit sftp af cd path Verander de map op afstand in 'path' chgrp grp path Verander de groep van bestand 'path' in 'grp' chmod mode path Verander de rechten van bestand 'path' in 'mode' chown own path Verander de eigenaar van bestand 'path' in 'own' df [-hi] [path] Geef statistieken weer voor de huidige directory of het bestandssysteem dat 'path' bevat exit Sluit sftp get [-afPpRr] remote [local] Download bestand reget [-fPpRr] remote [local] Hervat download bestand reput [-fPpRr] [local] remote Hervat upload bestand help Geef deze hulptekst weer lcd path Verander lokale directory in 'path' lls [ls-opties [path]]            Geef lokale maplijst weer lmkdir path Maak lokale map ln [-s] oldpath newpath Koppel bestand op afstand (-s voor symlink) lpwd Druk lokale werkmap af ls [-1afhlnrSt] [path] Geef externe maplijst weer lumask umask Stel lokale umask in op 'umask' mkdir path Maak externe map aan progress Schakelt weergave van voortgangsmeter put [-afPpRr] local [remote] Upload bestand pwd Weergave remote werkdirectory quit Sluit sftp af rename oldpath newpath Hernoem remote bestand rm path Verwijder remote bestand rmdir path Verwijder remote directory symlink oldpath newpath Symlink remote bestand version Toon SFTP-versie !commando Voer 'commando' uit in lokale commandoregel !                                  Ontsnappen naar lokale shell ?                                  Synoniem voor help

Voor meer informatie over het gebruik van sftp, bekijk de man page.

user@lokaal-computer $ man sftp

Streamen' via SSH

Stel dat je een archief nodig hebt van de logbestanden op je externe server, maar je hebt niet genoeg ruimte op die server om het archief aan te maken. In plaats van het archief aan te maken op de externe server en het dan te kopiëren, kun je het ook 'streamen' naar je lokale machine. Net als scp kan deze methode worden gebruikt om bestanden van, naar of tussen externe servers te kopiëren.

Van

user@local-computer $ ssh remoteserveruser@my-remote-server "tar -zcf - /var/log/" > ~/log-archief.tgz

Naar

user@local-computer $ tar -zcf - /var/log/ | ssh remoteserveruser@my-remote-server "cat - > ~/log-archive.tgz".

Tussen

user@local-computer $ ssh remoteserveruser@my-remote-server "tar -zcf - /var/log/" | ssh remoteserveruser@my-remote-server "cat - > ~/log-archive.tgz"
In de bovenstaande voorbeelden zul je merken dat ik een streepje "-" gebruik als bestandsnaam, dit is de manier om tar, cat en verschillende andere programma's te instrueren om naar standaard uitvoer (stdout) te schrijven of van standaard invoer (stdin) te lezen.
En daar hebben we het! Zoals altijd, als je vragen of opmerkingen hebt, laat het ons weten.

ACA Group Team
ACA Group Team
Solution Engineer, ACA Group
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas
Contact us

Want to dive deeper into this topic?

Get in touch with our experts today. They are happy to help!

ACA mug mok koffie tas