Túnel de meias reversas SSH

26

ssh -D pode fazer uma porta de meias na máquina local, que passa o tráfego para o controle remoto e depois para outros lugares.

ssh -L port:host:hostport, escute a porta na máquina local, passe o tráfego para "host: hostport" do ponto de vista da máquina remota.

ssh -R port:host:hostporté a contraparte de ssh -L, que escuta a porta na máquina remota e passa o tráfego para "host: hostport" do ponto de vista da máquina local.

Mas qual é a contrapartida de ssh -D, por exemplo, como abrir uma porta de meias na máquina remota, que passará o tráfego para o local e depois para outros lugares?

baga
fonte
1
a pergunta perde valor porque você aceitou uma resposta que não funciona e não pode funcionar. Este (que o respondente mencionado no comentário) faz isso embora stackoverflow.com/questions/842021/...
barlop

Respostas:

12

Com -D& -Lvocê tem uma maneira de se comunicar de qualquer maneira entre as duas máquinas.

Tão...

  • Na máquina local, use -Rpara criar uma porta de escuta na máquina remota apontada para o sshd da máquina local.
  • Use -Dna máquina remota, apontada para a porta que você criou acima.

Eu acho que o preenchimento abaixo fará com que funcione ...

ssh remotehost -R remoteport:localhost:localport "ssh -D 9050 localhost -p remoteport"

' remotehost', ' remoteport' & ' localport' acima precisam ser alterados. Um proxy de meias será formado em 9050.

Caro
fonte
Ah, parece que isso foi solicitado no SO: stackoverflow.com/questions/842021/… A única resposta é a mesma idéia. Tenho certeza de que um funcionará ;-) EDIT - sim, esse estava mais certo que o meu. Eu consertei o meu.
Caro
Na verdade, eu usei esse método indireto na minha própria situação. Mas na situação do meu amigo, ele não tinha o privilégio de root; portanto, ele não pode ter o serviço sshd, ele tem apenas o cliente OpenSSH. Então, eu quero descobrir há um método direto, mas OpenSSH não parece ... Graças a você a mesma
Berry
1
@barlop e isso não funcionará porque, por exemplo, você executa o executável ssh de 10.0.0.10, o -R diz para encaminhar para 10.0.0.10:9050 Mas o servidor SOCKS está sendo executado em 10.0.0.5
barlop
1
@PriceChild você realmente testou seu comando?
barlop 25/05
5
-1 Você não se preocupou em testá-lo e seu comando está completamente errado. Você tentou fazer como a outra resposta SO, mas não conseguiu. SSHing de A a B, Aquele ao qual você vincula tem ssh -D ouve A. Você ouve B. Ele está errado. Você tem o proxy SOCKS ouvindo do lado que está ouvindo.
barlop
14

Pode ser alcançado de forma transparente com este trecho em ~ / .ssh / config:

Host sockstunnel
    ProxyCommand ssh -D 3128 localhost nc -q 1 localhost 22

Host target
    RemoteForward 3128 localhost:3128
    ProxyCommand ssh -W target:22 sockstunnel

Detalhes

Queremos um DynamicForward reverso. Isso é obtido usando dois comandos ssh:

  • ssh -D 3128 localhost
  • ssh -R 3128:localhost:3128 target

Dessa maneira, o destino possui um túnel SOCKS para o cliente SSH.

O que fiz foi usar a maneira clássica de encadear o ssh para alcançar um destino remoto através de hosts intermediários, para que a criação do túnel do SOCKS seja tratada de forma transparente durante o login no destino. O primeiro truque ProxyCommand + nc é obrigatório porque -W implica ClearAllForwardings.

user305311
fonte
1
isso vale uma medalha de ouro.
Dakatine 21/07
Você poderia fornecer uma explicação mais detalhada sobre o que seus comandos fazem?
Alonso é
3

Não há facilidade para fornecer um túnel de meias reversas com o OpenSSH, portanto, você deve executar o comando ssh fornecendo o proxy de meias na máquina "remota".

Se a máquina remota não puder ssh na máquina local, crie primeiro uma conexão ssh de local para remota que encaminhe a porta 22 para, por exemplo, 2222. Em seguida, a máquina remota pode fazer o ssh na máquina local na porta 2222.

Thorbjørn Ravn Andersen
fonte
2
local$ ssh -R 1080 remote
remote$ curl --socks5 localhost https://example.com

desde o OpenSSH 7.6

ssh (1): adiciona suporte para encaminhamento dinâmico reverso. Nesse modo, o ssh atuará como um proxy SOCKS4 / 5 e encaminhar conexões para destinos solicitados pelo cliente remoto SOCKS. Esse modo é solicitado usando a sintaxe estendida para as opções -R e RemoteForward e, por ser implementado apenas no cliente, não requer que o servidor seja atualizado para ser suportado.

https://www.openssh.com/txt/release-7.6

zmx
fonte
Você pode fornecer uma referência para isso?
Scott
A propósito, há um bug no openssh-client 8.0 no qual você não pode escolher um endereço de ligação com a porta ( ssh -R 127.0.0.3:1080 remote); atualmente, você pode vincular um proxy SOCKS reverso apenas a uma porta.
Adam Katz