È possibile inoltrare le richieste ssh che arrivano su una determinata porta a un'altra macchina?

StackOverflow https://stackoverflow.com/questions/45230

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una piccola rete locale.Solo una delle macchine è disponibile al mondo esterno (questo non è facilmente modificabile).Mi piacerebbe essere in grado di configurarlo in modo tale che le richieste ssh che non arrivano sulla porta standard vadano su un'altra macchina.È possibile?Se é cosi, come?

Oh, e tutte queste macchine eseguono Ubuntu o OS X.

È stato utile?

Soluzione

Un'altra strada da percorrere sarebbe quella di utilizzare il tunneling ssh (che avviene sul lato client).

Dovresti eseguire un comando ssh come questo:

ssh -L 8022:myinsideserver:22 paul@myoutsideserver

Questo ti collega alla macchina accessibile dall'esterno (myoutsideserver) e crea un tunnel attraverso quella connessione ssh alla porta 22 (la porta ssh standard) sul server accessibile solo dall'interno.

Quindi eseguiresti un altro comando ssh come questo (lasciando il primo ancora connesso):

ssh -p 8022 paul@localhost

Quella connessione alla porta 8022 sul tuo host locale verrà quindi incanalata attraverso la prima connessione ssh che ti porterà su myinsideserver.

Potrebbe esserci qualcosa che devi fare su myoutsideserver per consentire l'inoltro della porta ssh.Lo sto ricontrollando adesso.

Modificare

Hmm.La manpage ssh dice questo:**Solo il superutente può inoltrare le porte privilegiate.**

Questo implica per me che la prima connessione ssh deve essere come root.Forse qualcun altro può chiarirlo.

Sembra che i privilegi di superutente non siano richiesti finché la porta inoltrata (in questo caso, 8022) non è una porta privilegiata (come 22).grazie per il chiarimento Mike Pietra.

Altri suggerimenti

(In questo esempio, presumo che la porta 2222 andrà al tuo host interno.$externalip e $internalip sono rispettivamente gli indirizzi IP o i nomi host della macchina visibile e interna.)

Hai un paio di opzioni, a seconda di quanto permanente vuoi che sia il proxy:

  • Una sorta di proxy TCP.Su Linux, l'idea di base è questa Prima il pacchetto in entrata viene elaborato, se lo desideri cambiarne la destinazione-cioè.NAT di destinazione preinstradamento:

    iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport 1024:65535 -j DNAT --to $internalip:22

  • Utilizzo di SSH per stabilire il port forwarding temporaneo.Da qui, hai ancora due opzioni:

    • Proxy trasparente, in cui il client pensa che il tuo host visibile (sulla porta 2222) sia solo un normale server SSH e non si rende conto che lo sta attraversando.Anche se perdi un po' di controllo dettagliato, ottieni comodità (specialmente se vuoi usare SSH per inoltrare VNC o X11 fino all'host interno).

      • Dalla macchina interna: ssh -g -R 2222:localhost:22 $externalip
      • Poi dal mondo esterno: ssh -p 2222 $externalip

      Si noti che le macchine "interne" ed "esterne" non devono trovarsi sulla stessa LAN.Puoi effettuare il port forwarding in tutto il mondo in questo modo.

    • Forzare prima l'accesso alla macchina esterna.Questo è vero "inoltro", non "proxying";ma l'idea di base è questa:Costringi le persone ad accedere alla macchina esterna (in modo da controllare chi può accedere e quando e ottenere i registri dell'attività) e da lì possono accedere tramite SSH all'interno.Sembra un compito ingrato, ma se tu imposta semplici script di shell sulla macchina esterna con i nomi dei tuoi host interni, abbinati a coppie di chiavi SSH senza password quindi è molto semplice per un utente accedere.COSÌ:

      • Sulla macchina esterna, crei un semplice script, /usr/local/bin/internalhost che semplicemente funziona ssh $internalip
      • Dal mondo esterno, gli utenti fanno: ssh $externalip internalhost e una volta effettuato l'accesso alla prima macchina, vengono immediatamente inoltrati a quella interna.

      Un altro vantaggio di questo approccio è che le persone non hanno problemi di gestione delle chiavi, poiché l'esecuzione di due servizi SSH su un indirizzo IP farà arrabbiare il client SSH.

Per tua informazione, se vuoi accedere tramite SSH a un server e non vuoi preoccuparti delle chiavi, fai così

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

Ho un alias nella mia shell chiamato "nossh", quindi posso farlo e basta nossh somehost e ignorerà tutti gli errori chiave.Tieni solo presente che stai ignorando le informazioni di sicurezza quando lo fai, quindi esiste un rischio teorico.

Molte di queste informazioni provengono da un discorso che ho tenuto al Barcamp Bangkok sui fantasiosi trucchi SSH.Puoi vedere le mie diapositive, ma consiglio il versione testuale poiché le diapositive S5 sono un po' difettose.Dai un'occhiata alla sezione chiamata "Inoltra qualsiasi cosa:Inoltro porta semplice" per informazioni.Sono disponibili anche informazioni sulla creazione di un proxy SOCKS5 con OpenSSH.Si, puoi farlo.OpenSSH è fantastico in questo modo.

(Infine, se stai attraversando molto la rete interna, valuta la possibilità di configurare una VPN.Sembra spaventoso, ma OpenVPN è abbastanza semplice e funziona su tutti i sistemi operativi.Direi che è eccessivo solo per SSH;ma una volta che inizi il port forwarding tramite i tuoi port forwarding per ottenere VNC, HTTP o altre cose;o se hai molti host interni di cui preoccuparti, può essere più semplice e più gestibile.)

@Mark Biek

Stavo per dirlo, ma mi hai preceduto!Ad ogni modo, volevo solo aggiungere che esiste anche l'opzione -R:

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

La differenza sta nel tipo di macchina a/da cui ti stai connettendo.Il mio capo mi ha mostrato questo trucco non molto tempo fa, ed è davvero bello sapere...eravamo dietro un firewall e dovevamo fornire accesso esterno a una macchina...è riuscito a aggirare il problema tramite ssh -R su un'altra macchina accessibile ...quindi le connessioni a quella macchina sono state inoltrate alla macchina dietro il firewall, quindi è necessario utilizzare -R o -L in base alla macchina su cui ti trovi e alla quale stai comunicando.

Inoltre, sono abbastanza sicuro che tu possa usare un utente normale purché la porta che stai inoltrando (in questo caso la porta 8022) non sia al di sotto dell'intervallo limitato (che penso sia 1024, ma potrei sbagliarmi) , perché quelli sono i porti "riservati".Non importa che lo stai inoltrando a una porta "limitata" perché quella porta non viene aperta (la macchina sta semplicemente ricevendo traffico inviato attraverso il tunnel, non è a conoscenza del tunnel), la porta 8022 IS essendo aperto e quindi limitato in quanto tale.

MODIFICARE:Ricorda solo che il tunnel è aperto solo finché l'ssh iniziale rimane aperto, quindi se scade il timeout o se ne esci, il tunnel verrà chiuso.

Per farlo è possibile utilizzare il Port Forwarding.Dai un'occhiata qui:

http://portforward.com/help/portforwarding.htm

In questa pagina sono disponibili istruzioni su come configurare il router per la richiesta di port forwarding:

http://www.portforward.com/english/routers/port_forwarding/routerindex.htm

In Ubuntu, puoi installare Avviatore di fuoco e poi usarlo Servizio in avanti funzione per inoltrare il traffico SSH da una porta non standard sulla macchina con accesso esterno alla porta 22 sulla macchina all'interno della rete.

Su OS X puoi modificare il file /etc/nat/natd.plist file per abilitare il port forwarding.

Senza scherzare con le regole del firewall, puoi impostare un file ~/.ssh/config.

Supponiamo che 10.1.1.1 sia il sistema "gateway" e 10.1.1.2 sia il sistema "client".

Host gateway
  Hostname 10.1.1.1 
  LocalForward 8022 10.1.1.2:22 

Host client
  Hostname localhost
  Port 8022

Puoi aprire una connessione ssh a "gateway" tramite:

ssh gateway

In un altro terminale, apri una connessione al client.

ssh client
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top