Accesso SSH all'host dell'ufficio dietro il router NAT


33

Vorrei accedere alla porta SSH del mio host Linux da casa. Sfortunatamente l'host si trova dietro un router NAT. Pertanto, l'indirizzo IP non è disponibile pubblicamente. Vi è tuttavia l'accesso a un altro host Internet (Server) che purtroppo è solo un accesso non root. Dopo un po 'di ricerche non trovo una soluzione adatta.

Seguente installazione:

  • PC Office (Linux, accesso root) dietro NAT (IP non pubblico) ma accesso completo a Internet.
  • Server PC (Linux, nessun accesso root) IP pubblico e statico e accesso completo a Internet.
  • PC domestico (linux, accesso root) dietro NAT (IP non pubblico) ma accesso completo a Internet.

Possibili connessioni: PC Office -> Server <- PC di casa

Impossibile: PC di Office <-X- Server -X-> PC di casa

Né il PC di casa, né il server possono avviare l'accesso al PC di Office. Ma sia il PC di Office che il PC di casa possono avviare connessioni al server.

Tunnel SSH inverso impossibile: ho provato un metodo chiamato tunnel ssh inverso. Sfortunatamente questo richiede GatewayPorts su Server impostato su "yes" in / etc / ssh / sshd_config, dove non ho accesso root.

In linea di principio dovrebbe essere possibile:

0) Sul server avvio un programma di spazio utente che è in ascolto su 2 porte (1 in entrata, 1 in uscita)

1) Sul mio PC da ufficio eseguo un altro programma che mantiene aperta una connessione TCP alla porta in uscita sul server.

2) Da casa mi collego alla porta di ingresso del server.

Dovrebbe esserci una soluzione standard per questo là fuori.

Qual è la soluzione più rapida e pulita per risolvere questo?

Franco


1
il PC di lavoro può connettersi a casa configurando un tunnel ssh? it.gentoo-wiki.com/wiki/Autossh

È possibile utilizzare FileZilla con sftp e port forwarding. Check out: superuser.com/a/1286681/141314
Noam Manos

Risposte:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

Dopo:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

Quello che potresti fare è questo: nel passaggio 1 inoltra una porta remota dal PC dell'ufficio al server ( 12345viene utilizzato come esempio, qualsiasi porta> 1024 dovrebbe fare). Ora la connessione a 12345 sul server dovrebbe connetterti alla porta 22 su officepc.

Nel passaggio 2, inoltrare la porta 23456 dal computer di casa al 12345 sul server (da cui viene inoltrato a officepc: 22, come impostato nel passaggio 1)

Al passaggio 3, ci si collega alla porta locale 23456 con l'accesso al PC dell'ufficio . Questo viene inoltrato dal passaggio 2 alla porta 12345 sul server e dal passaggio 1 al PC dell'ufficio.

Nota che sto usando autossh per gli inoltri, in quanto è un wrapper ssh che ricollega automaticamente il tunnel in caso di disconnessione; comunque anche il normale ssh funzionerebbe, purché la connessione non cessi.

Esiste una possibile vulnerabilità: chiunque sia in grado di connettersi a localhost: 12345 su serverpc ora può connettersi a officepc: 22 e provare ad hackerarlo. (Nota che se stai eseguendo un server SSH, dovresti comunque proteggerlo sopra le protezioni di base che sono attive di default; ti consiglio almeno di disabilitare il login di root e disabilitare l'autenticazione con password - vedi ad esempio questo )

Modifica : ho verificato questo con la stessa configurazione e funziona. GatewayPorts noriguarda solo le porte aperte al mondo in generale, non i tunnel locali. Ecco cosa sono le porte inoltrate:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

Quindi, per quanto riguarda lo stack di rete, è tutto il traffico locale sulle rispettive interfacce di loopback (oltre alle connessioni ssh a serverpc); pertanto, GatewayPortsnon viene controllato affatto.

Esiste, tuttavia, la direttiva AllowTcpForwarding: in tal caso no, questa installazione non riuscirà poiché non è consentito alcun inoltro, nemmeno attraverso l'interfaccia di loopback.

Avvertenze :

  • se usi autossh e ssh recenti, potresti voler usare ssh ServerAliveIntervale ServerAliveCountMaxper mantenere alto il tunnel. Autossh ha un controllo integrato, ma a quanto pare ha alcuni problemi su Fedora. -M0lo disabilita e -oServerAliveInterval=20 -oServerAliveCountMax=3verifica se la connessione è attiva - prova ogni 20 secondi, se fallisce 3 volte di seguito, interrompe ssh (e autossh ne crea una nuova):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • potrebbe essere utile riavviare ssh tunnel se l'inoltro fallisce, usando -oExitOnForwardFailure=yes- se la porta è già associata, potresti ottenere una connessione SSH funzionante, ma nessun tunnel inoltrato.

  • ~/.ssh/configè consigliabile usare per le opzioni (e le porte), altrimenti le righe di comando diventano troppo dettagliate. Per esempio:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

Quindi è possibile utilizzare solo l'alias del server:

    autossh -M0 fwdserverpc

Credo che questo metodo che stai supponendo sia chiamato "reverse ssh-tunnel". Sfortunatamente questo richiede GatewayPorts sul Server impostato su "yes" in / etc / ssh / sshd_config. Questo server non ha porte gateway abilitate e non ho accesso root lì.

3
@Frank: In realtà, io non la penso così: GatewayPorts nolimita le porte aperte ad essere accessibili solo sull'interfaccia loopback; nota che nel passaggio 2 stai inoltrando sull'interfaccia di loopback (in effetti, entrambi i forward sono "solo localhost"), quindi questo potrebbe funzionare ( AllowTcpForwarding nonella configurazione di sshd si romperà questo).
Piskvor,

3
@Frank: Sì, confermato. Funziona anche con GatewayPorts no; ha modificato la risposta. Nota che ci sono altre direttive (come PermitOpene AllowTcpForwarding) che possono interrompere questa configurazione: manpagez.com/man/5/sshd_config
Piskvor,

1
Risposta eccellente! Funziona, mi hai salvato il weekend! Grazie molto!!

1
la mia versione di autossh (Fedora Core) non poteva funzionare dal terminale senza -M. Ho anche collegato a un'altra persona che l'ha sperimentato. Hai ragione nel dire che nel manuale è contrassegnato come argomento facoltativo. Buono se funziona per molte persone, peccato che non per tutti.
Yaroslav Nikitenko,

4

Se puoi ssh sul server interno da casa e dal server interno alla tua macchina Linux dell'ufficio, da casa puoi usare ssh ProxyCommandper rimbalzare silenziosamente attraverso il server alla macchina interna tramite nc(netcat)

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

Quindi sei semplicemente ssh user@internalpce sei inoltrato silenziosamente attraverso la macchina del server, nessuna apertura di porte o tunnel richiesta su entrambe le estremità.


1
Grazie per la tua risposta. Sfortunatamente, né il PC di casa, né il server possono avviare l'accesso al PC di Office. Ma sia il PC di Office che il PC di casa possono avviare connessioni al server.

4

Installa Robo-TiTO sul computer a cui vuoi accedere a SSH da remoto.

  • Ciò ti consentirà di accedere a SSH utilizzando dalle app client di Google Talk ovunque.
  • Non è necessario un indirizzo IP pubblico o un'impostazione speciale.
  • È gratuito e open source, non paga più alcun servizio di applicazione.
  • Non è necessario aprire la porta SSH (proteggere il computer).
  • Non è necessario aprire alcun tunneling (ad es. VPN o qualcosa del genere)

Le seguenti istruzioni di installazione sono obsolete, poiché il sito è stato spostato. Il nuovo URL è https://github.com/formigarafa/robotito

Ho creato uno script (testato sul mio sistema operativo Raspbian in Raspberry Pi) in modo da poter installare facilmente Robo-TiTO su Raspberry Pi, Debian o Ubuntu Box (distribuzione di pacchetti Debian). questi sono i passaggi per rendere remotabile il tuo box Linux:

  1. Apri il comando Shell o puoi chiamarlo Terminale, vai alla cartella principale, Scarica lo script di installazione con il comando:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. dopodiché esegui lo script inserendo il comando:

    $ sudo ./robotito
    
  3. e quindi puoi modificare il file credentials.rbdalla cartella di configurazione di Robo-TiTO usando il tuo account GTalk e salvarlo premendo Ctrl+ Xe Y. L'impostazione predefinita utilizza nano editor.

  4. eseguendo il comando Robo-TiTO dalla cartella Robo-TiTO

    $ cd robotito
    $ ./jabbershd start
    
  5. Ora che hai fatto puoi usare SSH da qualsiasi client di Google Talk. Non dimenticare di aggiungere l'account Robo-TiTO GTalk al tuo account Google Talk e testarlo chattando a vicenda prima di utilizzare l'account.


5
Ho un serio problema con "Non c'è bisogno di porta SSH aperta (mantenere il computer Save )" - il bot shell-over-jabber che vi proponiamo è fissato con, citando, CLIENT_PASSPHRASE = "logmein"in chiaro . Questa è letteralmente sicurezza zero : stai facendo un buco di dimensioni camion per chiunque possa entrare. Contrasto con l'autenticazione con chiave pubblica SSH: sto eseguendo l'autenticazione su un canale sicuro , usando credenziali che non attraversano nemmeno il filo. Chi sta proteggendo il proprio computer adesso?
Piskvor,

@Piskvor, robotito eseguirà i comandi solo dai contatti autorizzati. github.com/formigarafa/robotito/blob/master/config/…
formigarafa

Non ho mai avuto problemi a causa dell'autenticazione basata sulla whitelist. Se non sbaglio, il trasferimento dei messaggi viene crittografato quando si utilizza con GTalk. In un modo o nell'altro, l'ho cambiato di recente e ora utilizza una password One Time da uno strumento come Google Authenticator o simili per consentire l'accesso.
formigarafa,

1
@formigarafa: (1) Se sei o sei stato coinvolto nello sviluppo di questo prodotto, devi dirlo esplicitamente. L'uso dello stesso nome non è sufficiente; la maggior parte delle persone non lo noterà. (Puoi menzionarlo nel tuo profilo .) (2) Quando modifichi un post, dovresti risolverlo il più possibile. Ad esempio, prova a catturare errori di battitura come "I'ts". E, se un collegamento è inattivo, non etichettarlo semplicemente come collegamento non funzionante; inserisci il nuovo URL nel post . Le persone non dovrebbero dover scavare tra i commenti per trovare le informazioni corrette.
G-Man dice "Ripristina Monica" il

@G-Man, la risposta e la modifica originali non erano mie. E non ho mai avuto l'intenzione di farlo sembrare il mio. Ho notato un link morto sulla risposta, non ho nemmeno creato il link. In realtà ero entusiasta di vederne il contenuto e ho cercato di seguirlo. Purtroppo non sono riuscito a trovare la risorsa. Ho segnato un link morto sulla speranza che chiunque abbia scritto la risposta sarebbe stato avvisato dalla modifica e avrebbe cercato di risolverlo.
Formigarafa,

3

La soluzione di Piskvor funziona ed è carina. Tuttavia, mantiene i terminali penzoloni aperti con le shell di login sospese. Non molto figo.

Ho sempre usato questo piccolo script che ho scritto per connettermi a un server e mantenerlo connesso eseguendolo in cron:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

Scommetto che potremmo risolvere la soluzione di Piskvor usando l'autossh più elegante a fianco forse di uno schermo staccato o usare gli argomenti -NT ssh per mantenere la connessione in background.


Grazie per i complimenti :) Per i miei casi d'uso, ho regolarmente bisogno dell'accesso alla shell e degli inoltri; inoltre, ho provato a mostrare il caso minimo qui (è possibile semplificare quanto sopra in due comandi con hopping dell'host SSH trasparente, ma ciò richiederebbe una configurazione aggiuntiva sul homepccomputer).
Piskvor,

2

Per me sembra che, invece di un tunnel SSH, dovresti provare una VPN: il tipo che funziona usando un server esterno per eseguire il proxy, come Hamachi . Ci sono altri software gratuiti come questo, ma Hamachi è il mio preferito.


1
Ora che alla 5.0.0.0/8rete sono effettivamente assegnati indirizzi IPv4 pubblici, Hamachi è nei guai (se Hamachi è in esecuzione, non è possibile accedere a una parte in qualche modo casuale di Internet). Inoltre, Hamachi non è più gratuito.
Piskvor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.