Vraag Hoe kan ik SSH naar machine A via B in één opdracht?


Ik wil bijvoorbeeld toegang krijgen tot een computer machine A die is gebaseerd op het netwerk van mijn universiteit. Deze computer is echter alleen toegankelijk via het interne netwerk van de universiteit, dus ik kan SSH niet rechtstreeks van thuis uit op deze computer gebruiken.

Dit is wat ik nu doe:

  1. Log bijvoorbeeld in bij een andere universiteitsmachine machine B

    (Deze machine B is toegankelijk via SSH vanaf mijn thuiscomputer.)

  2. Gebruik SSH op B om verbinding te maken met A.

Is er een manier om dat sneller te doen? Met slechts één ssh-opdracht.


70
2018-06-22 15:03


oorsprong




antwoorden:


Ja, met ProxyCommand in je SSH-configuratie.

Maak een SSH-configuratiebestand in je thuismap (tenzij je dit systeembreed wilt maken), ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

U kunt Machine A nu rechtstreeks bereiken met

ssh user@internalmachine

Merk ook op dat je nu een enkele SSH host-doelnaam ervoor hebt, je kunt dit ook in andere applicaties gebruiken. bijv .:

  • SCP om bestanden te kopiëren.

    scp somefile user@internalmachine:~/
    
  • In uw GUI-toepassingen:

    gebruik sftp://user@internalmachine/ als de locatie om door de machine te bladeren.

    KDE-gebaseerd (Dolphin): gebruik fish://user@internalmachine/

Notes

Verandering hostname.or.IP.address.internal.machine en de poort (22) naar de machine die u wilt bereiken alsof u dat wilt unibroker machine.

Afhankelijk van de netcat-versies op de unibroker-host, is de -q0 optie moet worden weggelaten. Wat betreft authenticatie; je maakt feitelijk twee SSH-verbindingen vanaf je werkstation. Dit betekent dat zowel de unibroker-host als de interne machin host worden geverifieerd / geverifieerd tegen de ene na de andere (voor zowel keypair / wachtwoord als host-sleutelverificatie).

Uitleg

Deze benadering van het gebruik van ProxyCommand en 'netcat' is maar een manier om het te doen. Ik vind dit leuk, omdat mijn SSH-client rechtstreeks met de doelcomputer praat, zodat ik de hostsleutel van mijn client kan verifiëren en ik mijn openbare-sleutelauthenticatie kan gebruiken zonder een andere sleutel op de broker te gebruiken.

Elk Host definieert de start van een nieuwe hostsectie. Hostname is de doelhostnaam of het IP-adres van die host. User is wat u zou geven als het gebruikersgedeelte in ssh user@hostname.

ProxyCommand wordt gebruikt als de pijp naar de doelcomputer. Door SSH te gebruiken voor de eerste machine en direct een eenvoudige 'netcat' in te stellen (nc) naar het doel vanaf daar, dit is eigenlijk gewoon een leesbare tekst voorwaarts naar de interne machine van de tussenpersoon tussen die. De -q opties zijn om elke uitvoer te stoppen (alleen een persoonlijke voorkeur).

Zorg ervoor dat netcat is geïnstalleerd op de broker (meestal standaard beschikbaar op Ubuntu) - een van beide netcat-openbsd Install netcat-openbsd of netcat-traditionele Install netcat-traditional.

Merk op dat u hier nog steeds SSH met versleuteling gebruikt. Hoewel het netcat-kanaal plaintext is, zal uw SSH-client op uw pc een ander gecodeerd kanaal instellen met de uiteindelijke doelcomputer.


77
2018-06-22 15:24



Ik moest de optie -q0 verwijderen omdat deze niet werd ondersteund door de machine die ik gebruikte. Anders dan dat, werkte het allemaal. Dit is een FANTASTISCHE tip. Heel erg bedankt. :) - Gerry
Ik kwam een ​​probleem tegen, je antwoord werkt prima voor mij vanaf de terminal, maar ik kan het niet doen met behulp van de handleiding, het zegt: een niet-verwerkte foutmelding, een time-out bij het inloggen. - Vikash B
@VikashB Nou, het zou echt moeten werken. Overweeg een NIEUWE vraag te maken voor uw specifieke situatie. - gertvdijk
Ik deed hier is de vraag: askubuntu.com/questions/688567/... - Vikash B
Om het goede woord van @gertvdijk aan te vullen, is er een geweldige wikibook over het onderwerp ssh-proxies en jump-hosts die kan dienen als een referentie van onschatbare waarde. - Travis Clarke


Spring in één keer

Een voor de hand liggend alternatief voor de ProxyCommand-aanpak die ik heb aangeboden mijn andere antwoord zou direct naar de doelmachine 'springen':

ssh -t user@machineB ssh user@machineA

Merk op -t op de eerste ssh opdracht. Zonder het zal het mislukken:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Het zorgt ervoor dat een echte TTY wordt toegewezen

Nadeel hiervan is dat nu alle configuratie, verificatie en authenticatie plaatsvindt bij Machine B, wat ik om veiligheidsredenen in mijn situatie echt niet leuk vind. Ik houd van mijn sleutelpaar op mijn eigen pc en verifieer en verifieer de uiteindelijke doelmachine vanaf mijn eigen pc. Bovendien kun je de interactieve shell alleen gebruiken voor SSH, dus dit zal niet omgaan met andere tools zoals SCP of het gebruik van je GUI-bestandsbeheer.

Om alle bovengenoemde redenen raad ik u ten zeerste aan de ProxyCommand-aanpak, maar voor een snelle verbinding werkt dit prima.


36
2018-06-22 15:47



Waarom niet één antwoord hebben met zowel de 'One Off'- en permanente oplossingen? - demure
@demure Zo werken StackExchange-sites ... Zie: Wat is de officiële etiquette bij het tweemaal beantwoorden van een vraag? zegt "Het is beter om twee verschillende antwoorden te plaatsen, dan om ze in één antwoord te plaatsen.". En ik beschouw dit niet als dezelfde oplossing. Permanent / tijdelijk is niet wat deze benadering anders maakt, naar mijn mening. - gertvdijk
werkt! Dank je ! - nikosdi


Probeer het te gebruiken

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

in je ~ / .ssh / config en doe het allemaal in één shot met toetsen die zich alleen op je computer bevinden.


14
2017-07-29 13:49



Standaard vreselijk geformatteerd: - SSH Help
Dit is meer schoon dan het introduceren van netcat in de mix. Ook hoeft de privé SSH-sleutel niet te bestaan ​​op de B machine, hetzij. - danemacmillan


Je zou de kunnen gebruiken -J opdrachtregeloptie:

ssh -J user@machineB user@machineA

Van man ssh:

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

Het werd geïntroduceerd in OpenSSH versie 7.3 (uitgebracht in augustus 2016). Het is beschikbaar in Ubuntu 16.10 en later.


11
2018-01-16 16:19



+1 omdat dit werkt, zelfs als u het sleutelbestand voor machineA moet opgeven - Grief


ProxyCommand is een schone oplossing voor een geval waarin u shell-toegang in beide systemen toestaat. We wilden externe gebruikers via een broker (B) toegang geven tot een interne machine (A), maar zonder de gebruiker toegang tot B te verlenen voor een betere beveiliging. Dit werkte:

Vervang de login-shell

Vervang de login-shell (gebruik chsh) voor extuser bij de makelaar met het volgende script (opgeslagen in een bestand):

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

Als er geen wachtwoordaanmelding is ingesteld in extuser @ B voor de externe gebruiker en in interne gebruiker @ A voor extuser @ B, voert de volgende opdracht de externe gebruiker direct naar A uit.

ssh extuser@B

Tip: Maak de benodigde aanmeldingsrechten voor geen wachtwoord bij authorized_keys in extuser @ B voordat u naar de aangepaste login-shell gaat. Na de wijziging, omdat dit account door een shell voor niemand toegankelijk is, kan alleen sudoer @ B wijzigingen aanbrengen in het bestand authorized_keys door het rechtstreeks te bewerken.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

De laatste regel is om de aanmeldingsbannerweergave van B te onderdrukken, zodat de externe gebruiker een transparante toegang tot A heeft.


1
2018-06-08 18:27



Zeer interessante benadering. De belangrijkste nadelen hiervan zijn echter: 1) Gebruik is beperkt tot standaard SSH-gebruik (geen SFTP / SCP-ondersteuning). 2) Een gebruiker kan niet een andere doelhost selecteren behalve de enkele (omdat deze in de login-shell is gecodeerd) 3) Hostsleutelvalidatie kan niet worden gedaan van werkstation naar de uiteindelijke doelhost (sinds het gebruik van het broker SSH binaire bestand). 4) Privésleutels voor gebruikers om toegang te krijgen tot de uiteindelijke doelhost bevinden zich op de makelaar in plaats van bij de gebruiker. Dit maakt nabootsing van de gebruiker door een admin mogelijk (wat normaal niet mogelijk is). - gertvdijk
Alle punten waar, bedankt voor het uitwerken. Het primaire doel is echter om een ​​vertrouwde gebruiker ssh-toegang tot A te bieden zonder in te loggen op B. Aangezien alleen de beheerder de openbare sleutel van de vertrouwde gebruiker kan toevoegen aan B (via sudo, zonder in te loggen), impliceert dit al dat de gebruiker ( admin) toegang tot de privésleutel van extuser @ B (niet van de vertrouwde gebruiker buiten), en heeft deze op de eerste plaats ingesteld! - Sunthar


Dit is een zeer nuttige suggestie. Nadat ik urenlang had gepijnigd, vond ik deze notitie en bevestigde dat dit precies werkte zoals gedocumenteerd. Om via MachineA te verbinden met MachineB, vanuit remote machineC:

bijv .: [xuser @ machineC ~] ssh -t MachineA ssh MachineB

De "-t" is kritiek, ssh mislukt als deze niet aanwezig is. U wordt twee keer gevraagd, eerst om wachtwoord op MachineA, daarna voor de tweede keer MachineB. Merk ook op dat dit veronderstelt dat gebruiker "xuser" gedefinieerd is voor iedereen drie machines. Als dat niet het geval is, gebruikt u gewoon de ssh-syntaxis: "yuser @ MachineA ...". Merk ook op dat je kunt gestippelde quad raw IP # s gebruiken, als je dat wilt. Dit is handig als u linkt via een particulier lokaal net dat IP's gebruikt die niet zijn blootgesteld aan de wereld, dat wil zeggen. niet in uw lokale hostbestand of een DNS. Om een ​​bestand op te halen van MachineB, naar remote machineC, u kunt scp van MachineB naar MachineA, vervolgens van MachineA naar externe machineC. (Bijvoorbeeld de remote machineC kan MachineA, maar niet MachineB, pingen.) Voorbehoud: ik heb getest met Fedora en WindowsXP, MachineA is een XP-box met ICS (Internet Connection Sharing), terwijl MachineB en remote machineC Fedora-Linux-boxen zijn. Deze suggestie loste een belangrijk probleem voor mij op - ie. beperkte, gecontroleerde externe toegang tot mijn remote site lan. Merk ook op dat wanneer u "uitlogt" vanuit MachineB, u twee "Verbinding met xxx.xxx.xxx.xxx gesloten" zou moeten zien. berichten.


0
2018-04-16 22:34



Als u public key-verificatie instelt en configureert, hoeft u zich geen zorgen te maken over het invoeren van uw wachtwoorden. Maar -t is nog steeds vereist. - Felipe Alvarez
@FelipeAlvarez U moet zich nog zorgen maken over het invoeren van het tweede wachtwoord als u niet vertrouwd dat machine B een wachtwoordloze aanmelding bij A heeft! - Michael