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:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
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:
ssh -p 22222 username@localhost
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:
host remotehostname
User remoteusername
Hostname localhost
Port 22222
Ajuste remotehostname
e remoteusername
se adapte. O remoteusername
campo deve corresponder ao seu nome de usuário no servidor remoto, mas remotehostname
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 )