Reverse SSH Tunnel

8

Estou tentando encaminhar o tráfego da web de um servidor remoto para minha máquina local para testar alguma integração de API (tropo, paypal etc.). Basicamente, estou tentando configurar algo semelhante ao que o tunnlr.com fornece.

Eu iniciei o túnel ssh com o comando

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

Então eu posso ver que o servidor agora está escutando na porta 7777 com

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

Então isso funciona bem. A solicitação de onda é realmente servida na máquina local.

Agora, como faço para ativar o server.com:8888 para ser roteado por esse túnel?

Eu tentei usar o nginx da seguinte forma:

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

No log de erros do nginx, vejo:

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

Eu tenho procurado usar iptables , mas não fiz nenhum progresso. iptables parece uma solução mais elegante do que rodar o nginx apenas para tunelamento. Qualquer ajuda é muito apreciada. Obrigado!

EDITAR (adicionando informações do servidor)

Detalhes do servidor: Ubuntu 10.10 Maverick (instalação padrão)

EDITAR (opção nginx)

As opções nginx trabalhadas mudaram de 0.0.0.0:7777 para 127.0.0.1:7777 como sugerido por @Marcel G. Ainda procurando por soluções não-nginx.

EDIT (atualização na solução final)

Como @sciurus apontou, certifique-se de que GatewayPorts yes no seu arquivo sshd_config. Eu inicialmente tinha essa linha no arquivo de configuração, mas eu precisava emitir um /etc/init.d/ssh reload em vez de restart (pelo menos parece que no Ubuntu).

Comando final usado na máquina local: ssh -nNT -R '*:8888:localhost:5000' user@server

Em seguida, o servidor deve indicar que está escutando em *: 8888 com 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)
    
por chris 07.03.2011 / 23:29

2 respostas

9

Não há necessidade de usar o nginx.

Em sua configuração do daemon ssh (deve ser / etc / ssh / sshd_config ) configure GatewayPorts para clientspecified e recarregue-o. Isso é necessário para que outros sistemas possam se conectar ao seu túnel. Sem isso, apenas os programas em execução no seu servidor poderão usá-lo.

Agora tudo que você precisa fazer é modificar o comando ssh para escutar na porta 8888 em vez da porta 7777. Isso pode parecer

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

O asterisco diz ao sshd para escutar a porta 8888 em todas as interfaces, em vez de apenas a interface de loopback. Isso falharia se você não alterasse GatewayPorts .

    
por 08.03.2011 / 00:08
1

Eu respondo segundo sciurus ', mas se por algum motivo você precisar usar nginx ... meu palpite é que sua definição de upstream está quebrada.

A maneira como você cria o seu túnel de reversão ssh, ele apenas escuta no localhost (127.0.0.1 e :: 1), então você pode querer tentar dar a seguinte definição de upstream:

upstream tunnel {
    server 127.0.0.1:7777;
}

Apenas para o registro: eu nunca configurei o nginx mesmo assim, isso é apenas um palpite.

    
por 08.03.2011 / 01:41