Adoro explicar esse tipo de coisa através da visualização. : -)
Pense nas suas conexões SSH como tubos. Grandes tubos. Normalmente, você alcançará 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 que você configure um tubo menor dentro dela.
Cada tubo tem um começo e um fim. O big tube, sua conexão SSH, começou com o seu cliente SSH e acabou no servidor SSH que você conectou. Todos os tubos menores têm os mesmos endpoints, exceto que o papel de "start" ou "end" é determinado se você usou -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á por trás do firewall, pode acessar a Internet usando NAT (Network Address Translation). Isso é meio que importante, por favor, corrija esta suposição se for falsa.)
Quando você cria um túnel, você especifica um endereço e porta na qual ele irá responder, e um endereço e porta para o qual ele será entregue. A opção -L
diz ao túnel para responder no lado local do túnel (o host que está executando o seu cliente). A opção -R
diz ao túnel para responder no lado remoto (o servidor SSH).
Então...ParaconseguirSSHdaInternetemumamáquinaatrásdeumfirewall,vocêprecisadamáquinaemquestãoparaabrirumaconexãoSSHparaomundoexternoeincluirumtúnel-R
cujopontode"entrada" é o lado "remoto" de sua conexão.
Dos dois modelos mostrados acima, você quer o da direita.
Do host com firewall:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Isto diz ao seu cliente para estabelecer um túnel com um ponto de entrada -R
emote. Qualquer coisa que se conecte à porta 22222 na extremidade mais distante do túnel atingirá a "porta do host local 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 se autenticar depois de autenticar, então você não precisa ficar sentado rodando alguma coisa no servidor remoto para o túnel permanecer vivo. -
-N
diz que você deseja uma conexão SSH, mas na verdade não quer executar comandos remotos. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos. -
-T
desativa a alocação pseudo-tty, que é apropriada 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 usar uma conta descartável (não seu próprio login) configurada apenas para este 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ê receberá um desafio de host, já que provavelmente nunca atingiu esse host antes. Em seguida, você receberá um desafio de senha para a conta username
(a menos que tenha configurado chaves para login sem senha).
Se você for acessar esse host regularmente, também poderá simplificar o acesso adicionando algumas linhas ao arquivo ~/.ssh/config
:
host remotehostname
User remoteusername
Hostname localhost
Port 22222
Ajuste remotehostname
e remoteusername
para adequar. O campo remoteusername
deve corresponder ao seu nome de usuário no servidor remoto, mas remotehostname
pode ser qualquer nome de host adequado para você, não precisa corresponder a nada que possa ser resolvido.
(Para expor o endpoint reverso em um IP não-localhost , confira este post )