Skopiuj dane przez tunel SSH na wielu przeskokach

14

Mamy dwa główne środowiska, o których mowa:

Rozwój i kontrola jakości

Każde środowisko ma dwa serwery:

  • Jump Box
  • Serwer aplikacji

Aby połączyć się z serwerem aplikacji, musisz najpierw połączyć się z polem skoku, a następnie SSH z serwerem aplikacji.

Dzięki zaporze firewall obowiązuje kilka zasad:

  • MUSISZ połączyć się z serwerem aplikacji za pomocą pola skoku
  • Serwer aplikacji nie może połączyć się z żadnym z pól skoku
  • Skocznie znajdują się w tej samej podsieci i MOGĄ ze sobą rozmawiać.

Nasz problem

Mamy dużo treści (670 GB) na DEVELOPMENT APPLICATION SERVERi musimy to zrobić QA APPLICATION SERVER.

Kopiowanie tych danych do pól skoku nie jest opcją, ponieważ brakuje im wymaganej ilości miejsca.

Przeprowadziłem badania i dowiedziałem się, że możemy potencjalnie wykonać szereg tuneli przez te serwery, abyśmy mogli przesyłać dane bezpośrednio z jednego serwera aplikacji do drugiego za pośrednictwem tuneli. Jednak problem polegający na tym, że nie możemy połączyć się ze skoczkiem z serwera aplikacji.

Czy mamy jakieś opcje? To staje się rozpaczliwa sytuacja, a czas jest najważniejszy. Nie mamy czasu na pobranie danych i ponowne przesłanie. Kopiowanie w sieci na serwerach przebiegnie szybko, ponieważ jest to połączenie gigabitowe.

Barry Chapman
źródło
2
Po ustanowieniu połączenia możesz skopiować w dowolny sposób: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' lub w inny sposób wokół tar.
Alex_www
dzięki czemu możemy połączyć się ze skoku deweloperskiego z serwerem aplikacji dla programistów, ale nie w drugą stronę. Jeśli mamy ustanowione to połączenie, możemy skopiować w obie strony? jaki jest najlepszy sposób przeniesienia tej zawartości na inny serwer aplikacji bez uprzedniego zapisania jej w skrzynkach skoku?
Barry Chapman,
Dokładnie, „pipowanie” „tar” jest najprostszym rozwiązaniem.
Alex_www 12.12.13

Odpowiedzi:

15

Zdecydowanie najprostszym sposobem jest po prostu skopiowanie go za pomocą scp. Ponadto ta składnia faktycznie działa inaczej niż niektóre inne sugestie.

Nie możesz łatwo pokonać tej składni. Pozwala na rekurencyjne kopiowanie, rsync lub cokolwiek zechcesz bez konieczności rozważania potencjalnie skomplikowanych potoków. Ta składnia jest intuicyjnie przejrzysta, łatwiej będzie ją wspierać administratorzy Sys, którzy podążają za tobą i nie będą bezużyteczne korzystanie z cat .

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

Ze strony podręcznika scp : -3Kopie między dwoma hostami zdalnymi są przesyłane przez hosta lokalnego. Bez tej opcji dane są kopiowane bezpośrednio między dwoma zdalnymi hostami. Pamiętaj, że ta opcja wyłącza miernik postępu.

W poniższym przykładzie

  • Twoja stacja robocza nazywa się MacBook-Pro.
  • Dev Jump Box nosi nazwę devjumpserver
  • Serwer aplikacji deweloperskich nosi nazwę devapplicationserver
    • Znajduje się w strefie DNS LAN o nazwie .local
  • QA Jump Box nosi nazwę qajumpserver
  • Serwer aplikacji QA nosi nazwę qaapplicationserver
    • Znajduje się w strefie LAN DNZ o nazwie .local
  • Wykonamy kopię testową pliku 670 GB / etc / hosts ;-)
  • Przyjmuje się, że masz skonfigurowane uwierzytelnianie klucza publicznego SSH.



Oto plik ~ / .ssh / config, który konfiguruje bezpośredni dostęp ze stacji roboczej do serwerów aplikacji poprzez odpowiedni skok (inaczej serwer bastionowy).

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

MacBook-Pro: ~ barrychapman $



Testowanie obecności pliku na serwerze docelowym, nie będzie go tam.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: nie można uzyskać dostępu do / tmp / hosts: brak takiego pliku lub katalogu
Zabity sygnałem 1.
MacBook-Pro: ~ barrychapman $



Teraz skopiujmy plik z serwera aplikacji Dev do aplikacji QA za pośrednictwem stacji roboczej.

MacBook-Pro: ~ barrychapman $ scp -3 devapplicationserver: / etc / hosts qaapplicationserver: / tmp /
Zabity sygnałem 1.
Zabity sygnałem 1.
MacBook-Pro: ~ barrychapman $



Teraz sprawdźmy obecność skopiowanego pliku na serwerze aplikacji QA. Tym razem będzie tam.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
Zabity sygnałem 1.
MacBook-Pro: ~ barrychapman $ 

Uwaga

Podczas zamykania połączenia ProxyCommand zobaczysz komunikat ostrzegawczy „Zabity sygnałem 1”. To SSH rozbija połączenie ProxyCommand i nie ma się czym martwić. Możesz się go pozbyć, dodając LogLevel Quietdo sekcji konfiguracji hosta bastionu.

appx
źródło
Pozdrawiam, to rozwiązało nasz problem. Wesołych Świąt!
Barry Chapman
Co rozumiesz przez „zwrotkę konfiguracji hosta bastionu”? @BraveNewCurrency?
Andrew Wolfe,
Uważam, że każda linia „Host” i znajdujące się pod nią konfiguracje to zwrotka (jak w poezji). Jeśli dodasz „LogLevel Quiet” pod linią „Host” bastionu, będzie ona mieć zastosowanie tylko do tego hosta.
BraveNewCurrency
8

RURY!

Jeśli internet to seria rur , Unix to seria rur - coś w stylu:

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

powinno działać.

Jeśli chcesz przejść przez większą liczbę hostów, dodaj więcej potoków (i więcej zagnieżdżonych warstw \cytatu z wycięciem) w razie potrzeby. (Zauważ jednak, że jeśli rurociąg / ucieczka staje się tak skomplikowana, że ​​musisz narysować schemat lub uciekać się do liczenia na palcach, aby określić, ile razy musisz podwoić liczbę ucieczek , prawdopodobnie czas przyznać się do porażki i skonfigurować odpowiednią sieć VPN !)

voretaq7
źródło
1
Jak zauważył Alex_www w swoim komentarzu, jeśli nie potrzebujesz pliku pośredniego do niczego, możesz także po prostu przesłać dane wyjściowe tar. (Również w nie potrzebującat w pośrednich etapach rurociągu - sshchętnie jedzą stdin i przekazywać je. catPo prostu sprawia, że czuję się lepiej i jest symbolem zastępczym dla innych przydatnych poleceń może chcesz używać, jak tee.)
voretaq7,
Myślę, że problem OP polega na tym, że nie ma maszyny, która zarówno ma dane, jak i może nawiązywać połączenia, ani nie ma żadnej maszyny, która może zobaczyć wszystko i wszystkich (działająca jako łącznik dla wszystkich rur).
MadHatter,
1
@MadHatter W takim przypadku zadziałałoby połączenie naszych dwóch odpowiedzi (połącz się z serwerem deweloperskim, przekierowując port z powrotem do portu SSH serwera skoku, a następnie uruchom potok SSH przez ten port). To oczywiście powoduje, że rozwiązanie staje się coraz bardziej obrzydliwe do tego stopnia, że ​​ludzie zaczną protestować poza twoim biurem z wielkimi znakami, które mówią VPN! NOW!na nich ...
voretaq7 12.12.13
Dlaczego tak Tak, zrobiliby to. Ufnie!
MadHatter,
Czy zrobienie tego oznacza, że ​​serwer pośredni (w tym przypadku user@host1) w którymś momencie będzie miał zapełnione cat ginormous-filemiejsce w dowolnym momencie? A może dane są wysyłane bezpośrednio do user@host2? Czy jest to jakoś przesyłane strumieniowo? Jak to ma tarznaczenie? Wydaje mi się, że ma to związek z drugim pytaniem, które zadałem. Żadne z tych pytań nie jest retoryczne ...
hello_there_andy
1

Jeśli dobrze rozumiem, masz dwa serwery skoku (jump-qa i jump-dev) chroniące dwa serwery aplikacji (app-qa i app-dev); serwery skoku mogą ssh do siebie; żadne inne pole niż odpowiedni serwer skoku nie może ssh do odpowiedniego serwera aplikacji. Serwery aplikacji mogą ssh do nikogo. Plik należy przenieść z app-dev do app-qa. Oba serwery skoku nie mają miejsca na tymczasową kopię danych.

Możesz to rozwiązać za pomocą tunelowania ssh. Nawiązaliśmy połączenie z jednym zdalnym serwerem aplikacji, przenosząc zdalny tunel, który łączy się z nieużywanym portem na swoim serwerze skoku. Nawiązujemy drugie połączenie z jednego serwera skoków do drugiego serwera skoków, niosąc tunel, który podnosi zwisający koniec zdalnie przekazywanego portu z tunelu pierwszego i wysyła go do portu ssh drugiego serwera aplikacji.

Skonfiguruj tunele (każde z tych poleceń będzie musiało być uruchomione w osobnym oknie jump-qa):

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

Powinieneś teraz znaleźć to na app-qa, możesz zrobić telnet localhost 2345i pobrać banner ssh app-dev. Następnie możesz skopiować plik danych:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat
Szalony Kapelusznik
źródło
Istnieją dwa pola skoku - jeden przed serwerem aplikacji QA, a drugi przed serwerem aplikacji DEV. Skocznie mogą komunikować się ze sobą
Barry Chapman,
Czy klient ma miejsce na kopię tymczasową?
MadHatter,
Nie, nie ma wystarczającej ilości miejsca
Barry Chapman,
kiedy mówisz „klient”, do którego serwera się odnosisz?
Barry Chapman,
Źle zrozumiałem. Obecnie rozumiem, że nie ma klienta; są dwa serwery skoku i dwa serwery aplikacji.
MadHatter,