Come inoltrare una porta da una macchina all'altra?


19

Considera la seguente situazione:

A casa mia ho un router (che è collegato a Internet), un server (S) e la mia macchina principale (M). S è raggiungibile da Internet (ha un IP statico) ed è attivo 24/7, mentre M non lo è.

A volte, voglio rendere alcune app (che sono in ascolto su alcune porte su M, ad esempio 8888) accessibili da Internet esterno.

Per questo, volevo impostare una porta su S (2222) per inoltrare alla porta 8888 di M, in modo che chiunque accedesse a S: 2222 si sentisse come se stesse accedendo a M: 8888.

Ho provato a utilizzare il port forwarding ssh, il mio miglior tentativo è stato il seguente:

ssh -L 2222:M:8888 -N M

Ma ciò mi consente solo di accedere alla porta 2222 dal server stesso, non da altre macchine.

C'è un modo per farlo correttamente? Preferibilmente, mi piacerebbe che fosse un semplice comando, che sarei in grado di avviare e chiudere con ^ C quando non ho più bisogno di questo inoltro.


Prova localhost.run che è un sito web che puoi
visitare

Risposte:


16

Sì, questo si chiama GatewayPortsin SSH. Un estratto da ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

E puoi usare localhostinvece che Mnell'inoltro, poiché stai inoltrando alla stessa macchina a cui stai eseguendo SSH - se capisco correttamente la tua domanda.

Quindi, il comando diventerà questo:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

e sarà simile a questo in netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Ora chiunque acceda a questa macchina sulla porta 2222 TCP parlerà effettivamente con localhost: 8888 come visto nella macchina M. Si noti che questo non è lo stesso del semplice inoltro alla porta 8888 di M.


1
Grazie! Che funzioni! Ma c'è una stranezza - per qualche motivo, l'output contiene la riga "bind: indirizzo già in uso". Cosa potrebbe significare?
Rogach,

1
Hai già qualche processo in esecuzione su quella porta. Usa lo stesso netstatcomando per scoprire esattamente cosa. Probabilmente un altro SSH simile è ancora in esecuzione in background e lo uccide usando il netstat PID.
Gertvdijk,

La cosa divertente è che l'ho già fatto - nessun processo su quelle porte, sia su S che su M. Se ce ne fossero alcune, probabilmente l'intera costruzione non avrebbe funzionato.
Rogach,

10

C'è un altro modo. È possibile impostare il port forwarding da S: 2222 a W: 8888 con iptables. Comando singolo:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

dove 1.2.3.4 è l'indirizzo IP di M. Si chiama NAT (Network Address Translation).


1
Poiché qui si esegue solo il NAT di destinazione (al contrario del NAT di origine), funzionerà in modo affidabile solo in situazioni specifiche e potrebbe essere necessario modificare le tabelle di routing. Tuttavia, per l'inoltro a macchine virtuali (M) in esecuzione sull'host (S), potrebbe funzionare bene.
gertvdijk,

Questo comando dovrebbe essere emesso sul gateway. Presumo che S e M siano sulla stessa LAN. Il NAT di origine verrebbe eseguito automaticamente dal tracker di connessione nei moderni kernel Linux. Ho una tale configurazione nella mia rete dell'ufficio e funziona perfettamente. Tuttavia, è possibile rendere il comando più specifico (ad esempio, dicendo a iptables -i eth0 dove eth0 è l'interfaccia esterna).
Gevial,

Se S e M si trovano sulla stessa LAN, non è necessario il port forwarding lì, poiché il traffico non passa attraverso il gateway.
gertvdijk,

1
Sì, ma la connessione a M: 8888 è fatta da Internet, presumo. Qualcuno forma Internet -> S: 2222 -> M e S router LAN con iptables -> M: 8888
Gevial

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.