Os dados de encapsulamento sobre SSH são bastante diretos:
ssh -D9999 [email protected]
configura a porta 9999 no seu localhost
como um túnel para example.com
, mas tenho uma necessidade mais específica:
- Estou trabalhando localmente em
localhost
host1
é acessível paralocalhost
host2
só aceita conexões dehost1
- Eu preciso criar um túnel de
localhost
parahost2
Efetivamente, eu quero criar um túnel SSH "multi-hop". Como posso fazer isso? Idealmente, eu gostaria de fazer isso sem precisar ser superusuário em nenhuma das máquinas.
host2
nega o encaminhamentoRespostas:
Você basicamente tem três possibilidades:
Túnel de
localhost
parahost1
:Como observado acima, a conexão de
host1
parahost2
não será protegida.Túnel de
localhost
parahost1
ea partirhost1
dehost2
:Isso abrirá um túnel de
localhost
parahost1
e outro túnel dehost1
parahost2
. No entanto, a porta9999
parahost2:1234
pode ser usado por qualquer pessoa nahost1
. Isso pode ou não ser um problema.Túnel de
localhost
parahost1
ea partirlocalhost
dehost2
:Isso abrirá um túnel
localhost
para ohost1
qual o serviço SSHhost2
pode ser usado. Em seguida, um segundo túnel é aberto delocalhost
parahost2
através do primeiro.Normalmente, eu usaria a opção 1. Se a conexão de
host1
parahost2
precisar ser protegida, a opção 2. A opção 3 é principalmente útil para acessar um serviçohost2
que só pode ser acessado porhost2
si.fonte
-A
opção para ssh.-f
, ele entrará imediatamente em segundo plano localmente, assimssh -f -L 9999:localhost:9999 host1
será reconectado se você pressionar ctrl-c no primeiro caso. Ou adicione-f
ao comando double ssh original ao executá-lo pela primeira vez em segundo plano tudo imediatamente.Há uma excelente resposta explicando o uso da
ProxyCommand
diretiva de configuração para SSH :Adicione isso ao seu
~/.ssh/config
(vejaman 5 ssh_config
para detalhes):Em seguida
ssh host2
, o túnel passa automaticamentehost1
(também funciona com o encaminhamento do X11 etc.).Isso também funciona para uma classe inteira de hosts, por exemplo, identificados pelo domínio:
Atualizar
O OpenSSH 7.3 introduz uma
ProxyJump
diretiva, simplificando o primeiro exemplo parafonte
ssh
, inclusivegit
,sftp
etc.ssh -F /path/to/altconfig
. Cuidado, isso ignorará todo o sistema/etc/ssh/ssh_config
.O OpenSSH v7.3 em diante suporta um
-J
switch e umaProxyJump
opção, que permitem um ou mais hosts de salto separados por vírgula; portanto, você pode simplesmente fazer isso agora:fonte
Temos um gateway ssh em nossa rede privada. Se eu estiver do lado de fora e quiser um shell remoto em uma máquina dentro da rede privada, eu precisaria ssh no gateway e daí para a máquina privada.
Para automatizar esse procedimento, eu uso o seguinte script:
O que está acontecendo:
fonte
Depois de ler o texto acima e colar tudo juntos, criei o seguinte script Perl (salve-o como mssh em / usr / bin e torne-o executável):
Uso:
Para acessar o HOSTC via HOSTA e HOSTB (mesmo usuário):
Para acessar o HOSTC via HOSTA e HOSTB e usar números de porta SSH não padrão e usuários diferentes:
Para acessar o HOSTC via HOSTA e HOSTB e usar o encaminhamento X:
Para acessar a porta 8080 no HOSTC via HOSTA e HOSTB:
fonte
mssh HOSTA HOSTD
você vai realmente acabar em HostB (e talvez não vai perceber ..)Essa resposta é semelhante ao kynan, pois envolve o uso do ProxyCommand. Mas é mais conveniente usar o IMO.
Se você possui o netcat instalado em suas máquinas hop, você pode adicionar este trecho ao seu ~ / .ssh / config:
Então
fará o que você pediu.
Eu vim aqui procurando o lugar original onde li esse truque. Vou postar um link quando o encontrar.
fonte
Eu fiz o que acho que você queria fazer com
As duas senhas são solicitadas e, em seguida, posso usar o host local: 9999 para um proxy SOCKS para o host2. É o mais próximo que consigo pensar no exemplo que você mostrou em primeiro lugar.
fonte
Significa ligar ao localhost: 9999 e qualquer pacote enviado ao localhost: 9999 encaminhá-lo para o host2: 80
Significa que qualquer pacote recebido pelo host1: 9999 o encaminha para o localhost: 9999
fonte
channel 3: open failed: administratively prohibited: open failed
mensagem de erro.você poderá usar o encaminhamento de porta para acessar um serviço a
host2
partir delocalhost
. Um bom guia está localizado aqui . Excerto:Em seu elenco, substitua
localhost
no exemplo porhost2
ehost
comhost1
.fonte
Nesta resposta, passarei por um exemplo concreto. Você só precisa substituir os nomes de host, nomes de usuário e senhas dos computadores pelos seus.
Declaração do problema
Vamos supor que temos a seguinte topologia de rede:
Por uma questão de concretude, vamos supor que temos os nomes de host, nomes de usuário e senhas dos seguintes computadores:
Objetivo: queremos configurar um proxy SOCKS que escute na porta
9991
deLocalPC
forma que, toda vez que uma conexãoLocalPC
seja iniciada a partir da porta,9991
ela sejamit.edu
executadahec.edu
.Exemplo de caso de uso:
hec.edu
possui um servidor HTTP acessível apenas em http://127.0.0.1:8001 , por motivos de segurança. Gostaríamos de poder visitar http://127.0.0.1:8001 abrindo um navegador na WebLocalPC
.Configuração
Em
LocalPC
, adicione~/.ssh/config
:Em seguida, no terminal de
LocalPC
, execute:Ele solicitará a senha do
bob
onmit.edu
(iedylan123
), e depois a senha dojohn
onhec.edu
(iedoe456
).Nesse ponto, o proxy SOCKS agora está sendo executado na porta
9991
deLocalPC
.Por exemplo, se você quiser visitar uma página da Web sobre o
LocalPC
uso do proxy SOCKS, faça no Firefox:Algumas observações:
~/.ssh/config
,HEC
é o nome da conexão: você pode alterá-lo para o que quiser.-D9991
instruissh
para configurar um proxy SOCKS4 na porta9991
.fonte
Se você puder fazer o SSH nas duas máquinas, dê uma olhada na diretiva ProxyCommand do ssh. Isso permitirá que você vá direto do localhost para o host2 (em um comando fácil, se você usar chaves públicas !!). Então você pode fazer o que quiser com o host2.
http://www.statusq.org/archives/2008/07/03/1916/
fonte
A opção 2 da melhor resposta pode ser usada com usuários ssh diferentes do atual, também conhecido como: user @ host
fonte
No meu caso eu fiz
onde
host2:8890
está sendo executado em um notebook Jupyter.Então eu configurei o Firefox para usar
localhost:9999
como host SOCKS.Então agora eu tenho o notebook rodando
host2
acessível pelo Firefox nalocalhost:8890
minha máquina.fonte
As três opções mencionadas na resposta aceita não funcionaram para mim. Como não tenho muita permissão sobre os dois hosts, e parece que nossa equipe de DevOps tem regras bastante rígidas quando se trata de autenticação e está realizando MFA. De alguma forma, os comandos acima não podem funcionar bem com nossa autenticação.
Porém, o contexto é realmente semelhante às respostas acima: Eu não posso fazer o ssh diretamente no servidor de produção e preciso fazer um salto usando um servidor de salto.
Outra solução - ingênua
Acabei fazendo isso de uma maneira muito ingênua: em vez de tentar executar todos os comandos no meu laptop, executei os comandos em cada uma das máquinas , como abaixo:
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Se você for solicitado com alguma entrada de senha, digite-a.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Isso encaminhará qualquer solicitação na porta 6969 do seu laptop para o servidor de salto. Por sua vez, como configuramos em nossa etapa anterior, o servidor de salto encaminhará novamente as solicitações da porta 6969 para a porta 2222 no servidor de destino protegido.Você verá o comando "travar" depois de imprimir alguma mensagem - significa que eles estão funcionando! Uma exceção - você não verá uma mensagem de erro como
Could not request local forwarding.
, se a vir, ainda não está funcionando :(. Agora você pode tentar acionar a solicitação na porta 6969 do seu laptop e verificar se está funcionando.Espero que se você falhou em todos os métodos acima, talvez você possa tentar isso.
fonte