Pelo que entendi, os firewalls (assumindo as configurações padrão) negam todo o tráfego recebido que não possui tráfego de saída correspondente anterior.
Com base no Reversão de uma conexão ssh e no SSH Tunneling Made Easy , o tunelamento SSH reverso pode ser usado para contornar as restrições de firewall.
Eu gostaria de executar comandos shell em uma máquina remota. A máquina remota possui seu próprio firewall e está atrás de um firewall adicional (roteador). Possui um endereço IP como 192.168.1.126 (ou algo semelhante). Não estou atrás de um firewall e sei o endereço IP da máquina remota visto na Internet (não o endereço 192.168.1.126). Além disso, eu posso pedir a alguém para executar ssh (something)
como root na máquina remota em primeiro lugar.
Alguém poderia me explicar, passo a passo, como o encapsulamento SSH reverso funciona para contornar os firewalls (firewalls de máquinas locais e remotas e o firewall adicional entre eles)?
Qual é o papel dos interruptores ( -R
, -f
, -L
, -N
)?
Respostas:
Adoro explicar esse tipo de coisa através da visualização. :-)
Pense em suas conexões SSH como tubos. Tubos grandes. Normalmente, você acessará esses tubos para executar um shell em um computador remoto. O shell é executado em um terminal virtual (tty). Mas você já conhece essa parte.
Pense no seu túnel como um tubo dentro de um tubo. Você ainda tem a grande conexão SSH, mas a opção -L ou -R permite configurar um tubo menor dentro dela.
Todo tubo tem um começo e um fim. O tubo grande, sua conexão SSH, começou com seu cliente SSH e termina no servidor SSH ao qual você se conectou. Todos os tubos menores têm os mesmos pontos finais, exceto que o papel de "início" ou "fim" é determinado por você ter usado
-L
ou-R
(respectivamente) para criá-los.(Você não disse, mas vou assumir que a máquina "remota" que você mencionou, a que está atrás do firewall, pode acessar a Internet usando o Network Address Translation (NAT). Isso é meio importante, então corrija essa suposição se for falsa.)
Ao criar um túnel, você especifica um endereço e uma porta na qual ela responderá e um endereço e porta na qual será entregue. A
-L
opção informa ao túnel para responder no lado local do túnel (o host executando o seu cliente). A-R
opção informa ao túnel para responder no lado remoto (o servidor SSH).Portanto ... Para poder fazer o SSH da Internet em uma máquina atrás de um firewall, é necessário que a máquina em questão abra uma conexão SSH com o mundo externo e inclua um
-R
túnel cujo ponto de "entrada" é o lado "remoto" do a conexão dele.Dos dois modelos mostrados acima, você deseja o modelo à direita.
No host com firewall:
Isso diz ao seu cliente para estabelecer um túnel com um
-R
ponto de entrada emote. Qualquer coisa anexada à porta 22222 na extremidade do túnel alcançará "porta localhost 22", onde "localhost" é da perspectiva do ponto de saída do túnel (ou seja, seu cliente ssh).As outras opções são:
-f
diz ao ssh para fazer o segundo plano após a autenticação, para que você não precise ficar rodando algo no servidor remoto para que o túnel permaneça ativo.-N
diz que você deseja uma conexão SSH, mas na verdade não deseja executar nenhum comando remoto. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos.-T
desabilita a alocação de pseudo-tty, o que é apropriado porque você não está tentando criar um shell interativo.Haverá um desafio de senha, a menos que você tenha configurado chaves DSA ou RSA para um login sem senha.
Observe que é altamente recomendável que você use uma conta descartável (não o seu próprio login) que você configurou apenas para esse túnel / cliente / servidor.
Agora, a partir do seu shell no yourpublichost , estabeleça uma conexão com o host com firewall através do túnel:
Você terá um desafio importante do host, pois provavelmente nunca o atingiu antes. Em seguida, você terá um desafio de senha para a
username
conta (a menos que tenha configurado as chaves para o login sem senha).Se você estiver acessando esse host regularmente, também poderá simplificar o acesso adicionando algumas linhas ao seu
~/.ssh/config
arquivo:Ajuste
remotehostname
eremoteusername
se adapte. Oremoteusername
campo deve corresponder ao seu nome de usuário no servidor remoto, masremotehostname
pode ser qualquer nome de host que combina com você, não precisa corresponder a nada resolvível.(Para expor o ponto de extremidade reverso em um IP de host não local , confira esta postagem )
fonte
Eu desenhei alguns esboços
A máquina onde o comando ssh tunnel é digitado é chamado »seu host« .
Introdução
local:
-L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
significa: conectar com ssh aeconnectToHost
encaminhar todas as tentativas de conexão para o localsourcePort
a portaonPort
na máquina chamadaforwardToHost
, que pode ser acessada a partir daconnectToHost
máquina.controlo remoto:
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
significa: conectar com sshconnectToHost
e encaminhar todas as tentativas de conexão para o controle remotosourcePort
na portaonPort
da máquina chamadaforwardToHost
, que pode ser acessada a partir da sua máquina local.Opções adicionais
-f
diz ao ssh para fazer o segundo plano após a autenticação, para que você não precise ficar rodando algo no servidor remoto para que o túnel permaneça ativo.-N
diz que você deseja uma conexão SSH, mas na verdade não deseja executar nenhum comando remoto. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos.-T
desabilita a alocação de pseudo-tty, o que é apropriado porque você não está tentando criar um shell interativo.Seu exemplo
A terceira imagem representa esse túnel. Mas o computador azul chamado "seu host" representa o computador em que alguém inicia o túnel ssh, neste caso a máquina com firewall.
Portanto, peça a alguém para iniciar uma conexão de túnel ssh com sua máquina. O comando deve basicamente parecer
Agora o túnel está aberto. Agora você pode conectar via ssh à máquina com firewall através do túnel com o comando
que se conectará ao seu
localhost
(sua máquina) na porta12345
, mas a porta12345
será encaminhada pelo túnel para a porta 22 do host local do computador com firewall (ou seja, o próprio computador com firewall).fonte
O tunelamento ssh funciona usando a conexão ssh já estabelecida para enviar tráfego adicional.
Quando você se conecta a um servidor remoto, normalmente possui apenas 1 canal para a interação normal do usuário (ou 3 canais se considerar STDIN / STDOUT / STDERR separado). A qualquer momento, o processo ssh local ou remoto pode abrir canais adicionais na conexão existente. Esses canais enviam / recebem o tráfego do túnel. Ao enviar ou receber qualquer tráfego, o processo ssh simplesmente diz "esse tráfego é para o canal foobar".
Essencialmente funciona assim:
127.0.0.1
, mas pode ser alterada).Esse processo é exatamente o mesmo para os encapsulamentos para frente e para trás (apenas troque as palavras 'local' e 'remoto' no procedimento acima). Qualquer um dos lados pode iniciar o túnel. Nem precisa ser quando você inicia o ssh. Você pode abrir túneis enquanto o ssh já estiver em execução (consulte
ESCAPE CHARACTERS
, especificamente~C
).Para o papel de
-R
,-f
,-L
, e-N
, você realmente deve apenas consultar a página homem, que lhe dá a melhor explicação possível. Mas eu vou mencionar-R
e-L
.-R
diz ao ssh remoto para escutar as conexões e que o ssh local deve se conectar ao destino real.-L
diz ao ssh local para escutar as conexões e que o ssh remoto deve se conectar ao destino real.Observe que esta é uma descrição muito grosseira, mas deve fornecer informações suficientes para saber o que está acontecendo
fonte
Isso é explicado no manual SSH, especialmente as diferenças entre
-L
(local) e-R
(remoto).-L
O exemplo a seguir encapsula uma sessão de IRC da máquina cliente
127.0.0.1
(localhost
) usando a porta 1234 para o servidor remotoserver.example.com
:Nota: A
-f
opção backgrounds ssh e o comando remotosleep 10
são especificados para permitir uma quantidade de tempo para iniciar o serviço a ser tunelizado.Exemplo:
-N
Depois de conectar, aguarde um pouco (você não receberá um prompt de shell)-L 22000
A ligação terá origem na porta 22000 do seu, pessoal L máquina ocallocalhost:11000
-remote.server.com
garantirá que a outra extremidade do túnel seja alocalhost
porta11000
Fonte: Um guia ilustrado, tutorial, instruções, sobre encapsulamento ssh .
-R
Exemplo:
-N
Depois de conectar, aguarde um pouco (você não receberá um prompt de shell)-R
22000 A conexão terá origem na porta 22000 do computador emote R (neste caso, remote.server.com)localhost:11000
seu computador pessoal local garantirá que a outra extremidade do túnel seja alocalhost
porta11000
Fonte: Um guia ilustrado, tutorial, instruções, sobre encapsulamento ssh .
fonte