Questão Encaminhar o tráfego SSH através de uma máquina do meio


O tunelamento SSH é muito confuso para mim. Eu estou querendo saber se eu posso fazer isso no Linux.

Eu tenho 3 maquinas ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Então eu posso SSH de A -> B e de B -> C, mas não de A -> C.

Existe uma maneira de configurar um túnel SSH de A a B, então quando eu executo outros comandos SSH eles apenas funcionam na minha máquina local A? Eu estou basicamente tentando clonar um repositório git do trabalho para casa (e não consigo instalar o git na máquina B).

Além disso, uma vez configurado ... Como eu iria desarranjá-lo também?


102


origem


Eu acredito que há uma pergunta duplicada em algum lugar, mas minha busca-fu é fraca hoje. - quack quixote
isso seria meu: superuser.com/questions/96489/ssh-tunnel-via-multiple-hops - Mala


Respostas:


Coloque isso no seu .ssh/config arquivo no hostA (veja man 5 ssh_config para detalhes):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Agora, o seguinte comando será automaticamente tunelado por hostB

hostA:~$ ssh hostC

Você pode gostar de adicionar opções como -oCiphers=arcfour e -oClearAllForwardings=yes para acelerar as coisas, desde o envolvimento ssh dentro ssh é computacionalmente mais caro e o esforço extra e o wrapper não precisam ser tão seguros quando o tráfego já criptografado é tunelizado.


Se você estiver usando o OpenSSH antes de 5.3, o -W opção não está disponível. Neste caso você pode implementar o acima usando netcat (nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

119



Isto é brilhante! Obrigado. Isso resolve um problema que vem me consumindo nos últimos dois dias: o hostC fica atrás de um firewall e tem dados que eu desejo acessar do hostA, um laptop que pode estar em qualquer lugar do mundo. O hostB também está atrás do mesmo firewall com hostC, mas tem uma porta SSH aberta para o mundo. Assim eu posso ssh de hostC -> hostB. Eu configurei um túnel SSH reverso entre hostC e hostB, então eu também posso ssh de hostB -> hostC (encaminhado através de localhost). Com o seu truque eu posso ir de hostA -> hostC! Funciona perfeitamente com o SCP & Fugu no OSX! Obrigado! - AndyL
o -W opção deve ser usada em vez do nc opção. - vy32
Qual SSH deve suportar -W, apenas o de hostA (a origem) ou também o de hostB (a máquina do meio)? - gioele
Para informações, se você tem vários hosts, você precisa acessar pelo mesmo hostB, é possível declarar múltiplos Host hostC linhas acima do ProxyCommand tornando super fácil acessar vários hosts através do servidor do meio. - fduff


Edit: Esta é a abordagem errada. Vejo resposta do ephemient em vez de. Esta resposta irá funcionar, mas é potencialmente menos segura e definitivamente menos impressionante.

Parece que você quer uma solução como a seguinte:

ssh -L localhost:22:machinec:22 machineb

Isso vai te dar uma concha machineb. Deixe isso sozinho; minimizar a janela do terminal.

Agora, sempre que você fizer uma conexão ssh com localhost, você estará realmente conectado a machinec através machineb. Quando terminar o túnel, basta fechar o terminal em que você executou o comando acima.

Observe que você precisará de privilégios de superusuário para executar o comando.


6



+1 Obrigado Wesley. Esta é a verdadeira resposta de tunelamento ssh. Aqui está um artigo sobre isso: securityfocus.com/infocus/1816 - Larry K
No geral, isso é muito ruim ... mas eu tive que fazer isso com versões antigas do OpenSSH, ou outros clientes ssh. Você pode escolher uma porta alta como 8022: dessa forma, ela não interfere em nenhum serviço ssh no host local e não requer a execução como root. Basta adicionar -p 8022 para seus comandos ssh. E é fácil de usar com o git: use o URI ssh://localhost:8022/path/to/repo.git. - ephemient


Parece que você quer um alias de shell em A que faz com que o ssh ocorra em C

  1. Eu suponho que em A, você pode digitar ssh me @ b "ssh eu @ c hostname" e voltar "C"
  2. Faça um alias sshc que expanda sshc foo em ssh @ b "ssh me @ c foo"
  3. Para a sintaxe exata da criação do alias, consulte superuser.com

3



Você pode ter que adicionar -t para as opções do ssh externo se você quiser um shell interativo, uma vez que ssh assume -T se é dado um comando. - ephemient


Se o seu empregador fornecer uma VPN, recomendamos usá-la.

Dessa forma, você não precisará configurar nenhum aplicativo especialmente (até mesmo o ssh) e poderá ver qualquer máquina atrás do firewall. Além disso, todo o seu tráfego será criptografado pelo software da VPN, que adicionará segurança a qualquer tráfego inadvertidamente ou deliberadamente não criptografado.


0



Às vezes é a VPN que é a razão pela qual precisamos desses truques ... - Louis


YASS ainda outra solução simples

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Primeiro comando abre uma conexão ssh para HostB e diga HostB para encaminhar conexões de localhost: 2222 para HostC: 22.
  • a -f parâmetro diz ao SSH para ir para o segundo plano depois de estabelecida a conexão
  • Segundo comando abrir simplesmente uma conexão do cliente para localhost: 2222
  • Opção HostKeyAlias não são necessários, mas podem ajudar a impedir a conexão com o host errado
  • Nota: comando sleep 10 são necessários para manter a conexão até que o segundo comando ssh use a porta encaminhada. Então primeiro ssh vai fechar quando o segundo ssh deixe a porta encaminhada.

Agora você pode executar sessões ssh subseqüentes:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Variante:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

sessões ssh subseqüentes podem ser abertas executando:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

A principal vantagem de usar o parâmetro -M e -S é que apenas uma conexão é aberta de HostA para HostC, a sessão subseqüente não será autenticada novamente e será executada muito mais rapidamente.


0