Túnel SSH inverso

8

Estoy tratando de reenviar el tráfico web desde un servidor remoto a mi máquina local para probar alguna integración de API (tropo, paypal, etc.). Básicamente, estoy tratando de configurar algo similar a lo que ofrece tunnlr.com.

He iniciado el túnel ssh con el comando

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

Entonces puedo ver que el servidor ahora está escuchando en el puerto 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

Entonces eso funciona bien. La solicitud de curl se sirve realmente desde la máquina local.

Ahora, ¿cómo habilito server.com:8888 para enrutarse a través de ese túnel?

He intentado usar nginx así:

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;
  }
}

Desde el registro de errores nginx veo:

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

He estado tratando de usar iptables, pero no he hecho ningún progreso. iptablesparece una solución más elegante que ejecutar nginx solo para hacer túneles. Cualquier ayuda es muy apreciada. ¡Gracias!

EDITAR (agregar información del servidor)

Detalles del servidor: Ubuntu 10.10 maverick (instalación estándar)

EDITAR (opción nginx)

Las opciones nginx trabajadas por cambiaron 0.0.0.0:7777 a 127.0.0.1:7777 como sugirió @Marcel G. Sin embargo, todavía estoy buscando una solución que no sea nginx.

EDITAR (actualización de la solución final)

Como señaló @sciurus, asegúrese de que GatewayPorts yesen su archivo sshd_config. Inicialmente tenía esta línea en el archivo de configuración, pero necesitaba emitir un en /etc/init.d/ssh reloadlugar de restart(al menos así parece en ubuntu).

Comando final utilizado en la máquina local: ssh -nNT -R '*:8888:localhost:5000' user@server

Entonces el servidor debe indicar que está escuchando *: 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)
Chris
fuente

Respuestas:

9

No hay necesidad de usar nginx.

En su configuración de ssh daemon (debe ser / etc / ssh / sshd_config ) configure GatewayPorts a los clientes especificados y vuelva a cargarlo. Esto es necesario para que otros sistemas puedan conectarse a su túnel. Sin él, solo los programas que se ejecutan en su servidor podrán usarlo.

Ahora todo lo que necesita hacer es modificar su comando ssh para escuchar en el puerto 8888 en lugar del puerto 7777. Esto podría parecer

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

El asterisco le dice a sshd que escuche el puerto 8888 en todas las interfaces, en lugar de solo la interfaz de bucle invertido. Esto fallaría si no ha cambiado GatewayPorts .

Sciurus
fuente
Ok, cambié a su sugerencia y cuando curl http://server.com:8888recibo el error curl: (7) couldn't connect to host. Todavía puedo enrollar localhost: 8888 desde el shell del servidor y golpea la máquina local.
Chris
por cierto, detuve nginx antes de probar el nuevo comando que proporcionó.
Chris
@chris ¿GatewayPorts está habilitado en sshd_config de su servidor? Si no, habilítelo. Después de comenzar el túnel, asegúrese de que ssh esté escuchando más que solo la dirección de bucle invertido; puede reemplazar netstat y grep con lsof -i tcp:8888.
Sciurus
¡Increíble! Así que tuve GatewayPorts yesen sshd_config y creo que solo hice un reinicio /etc/init.d/ssh, pero esta vez lo hice reload. No estoy seguro de cuál es la diferencia, ¡pero ahora funciona totalmente! Un millón de gracias @sciurus.
Chris
1

Respiro la respuesta de Sciurus, pero si por alguna razón necesitas usar nginx ... supongo que tu definición aguas arriba está rota.

La forma en que crea su túnel inverso ssh solo escucha en localhost (127.0.0.1 y :: 1), por lo que puede intentar probar la siguiente definición ascendente:

upstream tunnel {
    server 127.0.0.1:7777;
}

Solo para el registro: nunca he configurado nginx por mi cuenta, así que esto es solo una suposición.

Marcel G
fuente
¡Gracias! Esto realmente lo hizo funcionar. Si es posible, preferiría no usar nginx solo para hacer que el túnel funcione, pero es bueno saber que es posible
Chris