Túnel SSH reverso

8

Estou tentando encaminhar o tráfego da web de um servidor remoto para minha máquina local, a fim de 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 curvatura é realmente atendida na máquina local.

Agora, como habilito o server.com:8888 para ser roteado através desse túnel?

Eu tentei usar o nginx assim:

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 erro do nginx, vejo:

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

Eu estive tentando usar iptables, mas não fiz nenhum progresso. iptablesparece uma solução mais elegante do que executar o nginx apenas para tunelamento. Qualquer ajuda é muito apreciada. Obrigado!

EDIT (adicionando informações do servidor)

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

EDIT (opção nginx)

As opções do nginx alteradas 0.0.0.0:7777 para 127.0.0.1:7777, como sugerido por @Marcel G. Ainda procurando por uma solução não-nginx.

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

Como o @sciurus apontou, verifique GatewayPorts yesno seu arquivo sshd_config. Inicialmente, eu tinha essa linha no arquivo de configuração, mas precisava emitir um em /etc/init.d/ssh reloadvez de restart(pelo menos parece assim 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á ouvindo *: 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)
chris
fonte

Respostas:

9

Não há necessidade de usar o nginx.

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

Agora tudo o que você precisa fazer é modificar seu 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 ouvir a porta 8888 em todas as interfaces, em vez de apenas na interface de loopback. Isso falharia se você não alterasse o GatewayPorts .

sciurus
fonte
Ok, mudei para a sua sugestão e quando curl http://server.com:8888recebo o erro curl: (7) couldn't connect to host. Ainda consigo enrolar o localhost: 8888 no shell do servidor e ele atinge a máquina local.
chris
Aliás, parei o nginx antes de tentar o novo comando que você forneceu.
chris
@chris O GatewayPorts está ativado no sshd_config do seu servidor? Caso contrário, ative-o. Após iniciar o túnel, verifique se o ssh está escutando mais do que apenas o endereço de loopback; você pode substituir netstat e grep por lsof -i tcp:8888.
sciurus
Impressionante! Então, eu tinha GatewayPorts yesno sshd_config e acho que apenas reiniciei o /etc/init.d/ssh, mas desta vez o fiz reload. Não sei ao certo qual é a diferença, mas agora funciona totalmente !! Muito obrigado @sciurus.
chris
1

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

A maneira como você cria seu túnel reverso ssh, apenas escuta no localhost (127.0.0.1 e :: 1), portanto, tente tentar a seguinte definição upstream:

upstream tunnel {
    server 127.0.0.1:7777;
}

Apenas para constar: eu nunca configurei o nginx sozinho, então isso é apenas um palpite.

Marcel G
fonte
Obrigado! Isso realmente fez o trabalho. Se possível eu ainda preferem não usar nginx apenas para obter tunelamento de trabalho, mas bom saber que é possível
chris