Tunnel SSH inverso


8

Sto cercando di inoltrare il traffico Web da un server remoto al mio computer locale per testare l'integrazione dell'API (tropo, paypal, ecc.). Fondamentalmente, sto cercando di impostare qualcosa di simile a quello che offre tunnlr.com.

Ho avviato il tunnel ssh con il comando

$ssh –nNT –R :7777:localhost:5000 user@server

Quindi posso vedere che il server ora è in ascolto sulla porta 7777 con

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

Quindi funziona benissimo. La richiesta di arricciatura viene effettivamente servita dal computer locale.

Ora, come posso abilitare server.com:8888 per essere instradato attraverso quel tunnel?

Ho provato ad usare nginx in questo modo:

upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    proxy_pass http://tunnel;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
  }
}

Dal registro degli errori nginx vedo:

[error] 11389#0: *1 connect() failed (111: Connection refused)

Ho cercato di provare a usare iptables, ma non ho fatto alcun progresso. iptablessembra una soluzione più elegante rispetto all'esecuzione di nginx solo per il tunneling. Qualsiasi aiuto è molto apprezzato. Grazie!

EDIT (aggiunta di informazioni sul server)

Dettagli server: Ubuntu 10.10 maverick (installazione standard)

EDIT (opzione nginx)

Le opzioni di nginx hanno funzionato cambiando da 0.0.0.0:7777 a 127.0.0.1:7777 come suggerito da @Marcel G. Comunque sto ancora cercando una soluzione non nginx.

EDIT (aggiornamento sulla soluzione finale)

Come sottolineato da @sciurus, assicurati che GatewayPorts yesnel tuo file sshd_config. Inizialmente avevo questa linea nel file di configurazione, ma dovevo emettere un /etc/init.d/ssh reloadinvece di restart(almeno sembra così su Ubuntu).

Comando finale utilizzato sul computer locale: ssh -nNT -R '*:8888:localhost:5000' user@server

Quindi il server dovrebbe indicare che è in ascolto su *: 8888 con lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)

Risposte:


9

Non è necessario utilizzare nginx.

Nella configurazione del demone ssh (dovrebbe essere / etc / ssh / sshd_config ) impostare GatewayPorts su client specificato e ricaricarlo. Ciò è necessario per consentire ad altri sistemi di connettersi al tunnel. Senza di essa, solo i programmi in esecuzione sul tuo server saranno in grado di usarlo.

Ora tutto ciò che devi fare è modificare il comando ssh per l'ascolto sulla porta 8888 anziché sulla porta 7777. Potrebbe sembrare

ssh -nNT -R '*:8888:localhost:5000' user@server

L'asterisco dice a sshd di ascoltare la porta 8888 su tutte le interfacce, anziché solo l'interfaccia di loopback. Ciò fallirebbe se non hai cambiato GatewayPorts .


Ok, sono passato al tuo suggerimento e quando curl http://server.com:8888ottengo l'errore curl: (7) couldn't connect to host. Posso ancora arricciare localhost: 8888 dalla shell del server e colpisce la macchina locale.
chris

a proposito, ho smesso di nginx prima di provare il nuovo comando che hai fornito.
chris

@chris GatewayPorts è abilitato in sshd_config del tuo server? In caso contrario, abilitalo. Dopo aver avviato il tunnel, assicurati che ssh stia ascoltando più dell'indirizzo di loopback; puoi sostituire netstat e grep con lsof -i tcp:8888.
sciurus

Eccezionale! Quindi ho avuto GatewayPorts yesin sshd_config e penso di aver fatto solo un riavvio /etc/init.d/ssh, ma questa volta l'ho fatto reload. Non sono sicuro di quale sia la differenza, ma ora funziona totalmente !! Grazie mille @sciurus.
chris

1

Ho una seconda risposta da sciurus ma se per qualche motivo devi usare nginx ... la mia ipotesi è che la tua definizione a monte sia rotta.

Il modo in cui crei il tunnel inverso ssh è in ascolto solo su localhost (127.0.0.1 e :: 1), quindi potresti provare a provare la seguente definizione a monte:

upstream tunnel {
    server 127.0.0.1:7777;
}

Solo per la cronaca: non ho mai configurato nginx da solo, quindi questa è solo una supposizione.


Grazie! Questo in realtà l'ha fatto funzionare. Se possibile, preferirei ancora non utilizzare nginx solo per far funzionare il tunneling, ma è bene sapere che è possibile
chris
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.