Copie dados através do túnel SSH em vários saltos

14

Temos dois ambientes principais em questão:

Desenvolvimento e controle de qualidade

Cada ambiente possui dois servidores:

  • Jump Box
  • Servidor de aplicação

Para conectar-se ao servidor de aplicativos, você deve primeiro conectar-se à caixa de salto e, em seguida, SSH ao servidor de aplicativos.

Existem algumas regras em vigor, cortesia do firewall:

  • Você DEVE se conectar ao servidor de aplicativos através da caixa de salto
  • O servidor de aplicativos não pode se conectar a nenhuma caixa de salto
  • As caixas de salto estão na mesma sub-rede e PODEM conversar entre si.

Nosso Problema

Temos muito conteúdo (670 GB) no DEVELOPMENT APPLICATION SERVERe precisamos levar isso para o QA APPLICATION SERVER.

Copiar esses dados para as caixas de salto não é uma opção porque eles não possuem a quantidade necessária de espaço.

Eu fiz algumas pesquisas e aprendi que poderíamos potencialmente fazer uma série de túneis através desses servidores para poder transmitir os dados diretamente de um servidor de aplicativos para outro através dos túneis. No entanto, o problema que não podemos conectar à caixa de salto do servidor de aplicativos.

Temos alguma opção? Isso está se tornando uma situação desesperadora, e o tempo é essencial. Não temos tempo para baixar os dados e enviá-los novamente. A cópia na rede nos servidores será rápida, pois é uma conexão de gigabit.

Barry Chapman
fonte
2
Depois que a conexão for estabelecida, você poderá copiar de qualquer maneira: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' ou outra maneira de contornar o tar.
111313 Alex_www
para que possamos conectar da caixa de salto do desenvolvedor ao servidor de aplicativos de desenvolvimento, mas não o contrário. Se tivermos essa conexão estabelecida, podemos copiar de qualquer maneira? qual é a melhor maneira de mover esse conteúdo para o outro servidor de aplicativos sem primeiro salvá-lo nas caixas de salto?
Barry Chapman
Exatamente, "canalizar" "alcatrão" é uma solução mais simples.
111313 Alex_www

Respostas:

15

De longe, a maneira mais fácil é copiá-lo via scp. Além disso, essa sintaxe realmente funciona ao contrário de outras sugestões.

Você não pode superar essa sintaxe com facilidade. Ele permite copiar recursivamente, rsync ou o que você quiser, sem o incômodo de considerar tubos potencialmente complexos. Essa sintaxe é intuitivamente clara, será mais facilmente suportada pelos administradores de sistema que o seguem e não faz uso inútil do gato .

scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to

Na página do manual scp : -3cópias entre dois hosts remotos são transferidas pelo host local. Sem essa opção, os dados são copiados diretamente entre os dois hosts remotos. Observe que esta opção desativa o medidor de progresso.

No exemplo abaixo

  • Sua estação de trabalho é denominada MacBook-Pro.
  • Dev Jump Box é nomeado devjumpserver
  • O servidor de aplicativos de desenvolvimento é chamado devapplicationserver
    • Está na zona DNS da LAN chamada .local
  • QA Jump Box é nomeado qajumpserver
  • O QA Application Server é denominado qaapplicationserver
    • Está na zona DNZ da LAN chamada .local
  • Executaremos uma cópia de teste de um arquivo / etc / hosts de 670 GB ;-)
  • Supõe-se que você tenha a autenticação de chave pública SSH configurada.



Aqui está um arquivo ~ / .ssh / config que configura o acesso direto da estação de trabalho aos servidores de aplicativos por meio do salto apropriado (também conhecido como servidor de bastiões).

MacBook-Pro: ~ barrychapman $ cat ~ / .ssh / config
Hospedeiro *
  ServerAliveInterval 60
Host devapplicationsever
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa [email protected] -W% ​​h:% p
  Usuário barrychapman
Host qaapplicationserver
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa [email protected] -W% ​​h:% p
  Usuário barrychapman

MacBook-Pro: ~ barrychapman $



Testando a presença do arquivo no servidor de destino, ele não estará lá.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: não é possível acessar / tmp / hosts: esse arquivo ou diretório não existe
Morto pelo sinal 1.
MacBook-Pro: ~ barrychapman $



Agora vamos copiar um arquivo do servidor de aplicativos de desenvolvimento para o aplicativo de controle de qualidade por meio da estação de trabalho.

MacBook-Pro: ~ barrychapman $ scp -3 devapplicationserver: / etc / hosts qaapplicationserver: / tmp /
Morto pelo sinal 1.
Morto pelo sinal 1.
MacBook-Pro: ~ barrychapman $



Agora vamos verificar a presença do arquivo copiado no QA Application Server. Será lá desta vez.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
Morto pelo sinal 1.
MacBook-Pro: ~ barrychapman $ 

Nota

Ao fechar uma conexão ProxyCommand, você verá a mensagem de aviso "Morto pelo sinal 1". Isso é SSH destruindo a conexão ProxyCommand e não é nada para se alarmar. Você pode se livrar dele adicionando LogLevel Quietà estrofe de configuração do host do bastião.

appx
fonte
Saúde, isso resolveu o nosso problema. Feliz Natal!
Barry Chapman
O que você quer dizer com "estrofe de configuração do host bastião"? @BraveNewCurrency?
Andrew Wolfe
Considero cada linha "Host" e as configurações abaixo uma estrofe (como na poesia). Se você adicionar "LogLevel Quiet" sob a linha "Host" do bastião, isso se aplicará apenas a esse host.
BraveNewCurrency
8

TUBOS!

Se a internet é uma série de tubos , o Unix é uma série de tubos - algo como:

cat ginormous-file | ssh user@host1 "cat | ssh user@host2 \"cat >out\" "

Deveria trabalhar.

Se você precisar atravessar mais hosts, adicione mais pipes (e mais camadas aninhadas de \cotação com escape), conforme necessário. (Observe, no entanto, que se o pipeline / escape se torna tão complexo que você precisa desenhar um diagrama ou contar com os dedos para determinar quantas vezes você precisa dobrar os escapes , provavelmente é hora de admitir a derrota e configurar uma VPN adequada !)

voretaq7
fonte
1
Como Alex_www apontou em seu comentário, se você não precisar do arquivo intermediário para qualquer coisa, também pode canalizar a saída tar. (Também em você não precisa o catnas fases intermédias do gasoduto - sshtem o prazer de comer stdin e retransmiti-lo A. catSó me faz sentir melhor e é um marcador para outros comandos úteis que você pode querer usar, como tee.)
voretaq7
Eu acho que o problema do OP é que não há máquina que tanto tem os dados e pode fazer as conexões, nem há qualquer máquina que pode ver tudo e todos (para atuar como conector para todos os tubos).
21913 MadHatter
1
@MadHatter Se esse for o caso, uma combinação de nossas duas respostas funcionará (conecte-se ao servidor dev, encaminhando uma porta para a porta SSH do servidor de salto e execute o pipeline SSH nessa porta). Este é, naturalmente, tornando a solução cada vez mais nojento até o ponto onde as pessoas vão começar a protestar fora do seu escritório com grandes sinais que dizem VPN! NOW!sobre eles ...
voretaq7
Porque sim. Sim, eles fariam. Esperançosamente!
precisa
Fazer isso significa que o servidor intermediário (nesse caso user@host1) em algum momento terá o cat ginormous-filearmazenamento total em algum momento? Ou os dados são enviados diretamente para user@host2? Ou é de alguma forma transmitido? Como isso é tarrelevante? Eu acho que é relevante para a penúltima pergunta que fiz. Nenhuma dessas questões são retóricas btw ...
hello_there_andy
1

Se bem entendi, você tem dois servidores de salto (jump-qa e jump-dev) protegendo dois servidores de aplicativos (app-qa e app-dev); os servidores de salto podem ssh um para o outro; nenhuma caixa que não seja o servidor de salto relevante pode ssh no servidor de aplicativos correspondente. Os servidores de aplicativos podem ssh para ninguém. Um arquivo deve ser transferido de app-dev para app-qa. Ambos os servidores de salto não têm espaço para uma cópia provisória dos dados.

Você pode resolver isso com o tunelamento ssh. Estabelecemos uma conexão com um servidor de aplicativos remoto, carregando um túnel remoto que se conecta de volta a uma porta não utilizada em seu servidor de salto. Configuramos uma segunda conexão de um servidor de salto para o outro, carregando um túnel que pega a extremidade pendente da porta remotamente remetida do túnel um e a envia para a porta ssh do outro servidor de aplicativos.

Configure os túneis (cada um desses comandos precisará ser executado em uma janela separada jump-qa):

jump-qa% ssh app-qa -R 2345:localhost:2346
jump-qa% ssh jump-dev -L 2346:app-dev:22

Agora você deve achar que no app-qa, você pode fazer telnet localhost 2345e obter o banner ssh do app-dev. Você pode copiar o arquivo de dados:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat
Chapeleiro Louco
fonte
Existem duas caixas de salto - uma na frente do servidor de aplicativos de controle de qualidade e outra na frente do servidor de aplicativos DEV. As caixas de salto podem se comunicar umas com as outras
Barry Chapman
O cliente tem espaço para uma cópia provisória?
21913 MadHatter
Não, não há espaço suficiente
Barry Chapman
quando você diz cliente, a qual servidor você está se referindo?
Barry Chapman
Eu tinha entendido mal. Meu entendimento atual é que não há cliente; existem dois servidores de salto e dois servidores de aplicativos.
MadHatter