inverte o túnel ssh do servidor para o laptop

2

Pergunta Eu gostaria de saber como encapsular solicitações feitas em um servidor (debian) para a porta 80 em meu laptop usando o tunelamento ssh.

Problema Eu posso abrir um túnel com o seguinte comando que não se comporta como eu gostaria:

ssh -R 4445:localhost:80 [email protected]

Depois de executar isso e obter um shell em example.com, o comando a seguir é executado como esperado, retornando a página da web que está sendo hospedada no meu laptop:

wget localhost:4445

No entanto, ao tentar executar esse mesmo comando usando example.com:4445 em vez de localhost: 4445, recebo uma conexão recusada.

Informações adicionais: também tentei escrever uma regra de encaminhamento usando o shorewall:

DNAT            net             $FW:127.0.0.1:4445        tcp     4446

e depois tentei

wget example.com:4446

Quando o wget falha em algum dos casos acima, eu entendo isso:

--2011-02-16 13:48:26--  http://example.com:4446/
Resolving example.com... 70.90.XXX.XX
Connecting to example.com|70.90.XXX.XX|:4446... failed: Connection refused.

Alguma idéia de onde ir a partir daqui? Além disso, se houver uma maneira diferente / melhor para alcançar esse efeito, estou completamente aberto à ideia.

EDITAR Obrigado pelas sugestões! Tentei o seguinte:

ssh -R example.com:4445:localhost:80 [email protected]

e

ssh -R :4445:localhost:80 [email protected]

Então, ao executar o mesmo wget acima, retornamos com o mesmo erro. Eu devo mencionar que este servidor tem duas interfaces (eth0 public eth1 private).

EDITAR

Eu sou um idiota :( Tinha que definir

GatewayPorts yes

no sshd_config. Obrigado pela ajuda a todos!

    
por Hersheezy 16.02.2011 / 19:57

3 respostas

2

O ssh é configurado por motivos de segurança para fazer com que os novos túneis escutem no host local. Você tem que usar:

ssh -R :4445:localhost:80 [email protected]

Na página man do openssh:

 -R [bind_address:]port:host:hostport

Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side. This works by allocating a socket to listen to port on the remote side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the local machine.

Port forwardings can also be specified in the configuration file. Privileged ports can be forwarded only when logging in as root on the remote machine. IPv6 addresses can be specified by enclosing the address in square braces or using an alternative syntax: [bind_address/]host/port/hostport.

By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server’s GatewayPorts option is enabled (see sshd_config(5)).

    
por 16.02.2011 / 20:30
2

A primeira coisa a ter em mente é que os túneis têm um ponto final específico. Esse ponto final não tem como o cliente ou o servidor, mas os dados são criptografados apenas entre o cliente e o servidor.

Se você quiser que uma conexão no servidor seja encapsulada em example.com, você pode executar

 ssh -R 4445:example.com:80 [email protected]

Quando qualquer pessoa no servidor se conecta ao localhost: 4445, o pacote será encapsulado em criptografia para o seu cliente. Do seu cliente, o pacote viajará sem criptografia para example.com: 80. O SSH não realiza nenhuma análise do seu protocolo de conexão, os pacotes simplesmente entram em uma extremidade e saem pela outra.

Um túnel só pode ir para um ponto final. Se você quiser ir a outro lugar (digamos, example.org), será necessário fechar a conexão ssh e criar uma nova com -R 4445:example.org:80 . Se você deseja se conectar ao example.com e ao example.org, é necessário configurar dois túneis diferentes com portas locais diferentes: -R 4445:example.com:80 -R 4446:example.com:80 .

Por padrão (muito bom), os túneis só podem "vir de" um local (o localhost do servidor para túneis -R, o localhost do cliente para túneis -L). Para túneis -R, se você habilitar GatewayPorts no arquivo sshd_config do servidor, poderá instruí-lo a escutar no endereço IP do servidor para qualquer pessoa que possa se conectar ao servidor:

ssh -R server:4445:example.com:80 ...

Então, qualquer pessoa que pode acessar o servidor: 4445 teria sua viagem de pacote não criptografada para o servidor, o servidor a encapsularia criptografada para o cliente, então o cliente a enviaria sem criptografia para example.com : 80.

    
por 16.02.2011 / 20:33
0

O problema é que você está tentando abrir a porta em example.com:4445, que não está realmente aberto.

Se você quiser acertar a porta tunelada 4445 no host local ao referenciar example.com no comando wget ou no navegador, será necessário adicionar a entrada ao arquivo / etc / hosts

127.0.0.1 example.com

que então permitirá que você pressione a porta tunelada no host local ao executar

wget example.com:4445

Outra coisa útil aqui para estabelecer túnel é, se você pretende usá-lo em base regular é configurar o arquivo .ssh/config e fazer um bloco como esse.

Host example
Hostname example.com
User    someuser
LocalForward 4445 localhost:80

Isso fará o encapsulamento da porta 80 de example.com para localhost: 4445 simplesmente invocando ssh example

    
por 16.02.2011 / 21:33