여러 홉을 통해 SSH 터널을 통해 데이터 복사


14

문제가되는 두 가지 주요 환경이 있습니다.

개발 및 QA

각 환경에는 두 개의 서버가 있습니다.

  • 점프 박스
  • 응용 프로그램 서버

응용 프로그램 서버에 연결하려면 먼저 점프 상자에 연결 한 다음 응용 프로그램 서버에 SSH를 연결해야합니다.

방화벽에 대한 몇 가지 규칙이 있습니다.

  • 점프 박스를 통해 응용 프로그램 서버에 연결해야합니다
  • 응용 프로그램 서버가 점프 상자에 연결할 수 없습니다
  • 점프 박스는 동일한 서브넷에 있으며 서로 통신 할 수 있습니다.

우리의 문제

에 많은 콘텐츠 (670GB)가 있으며이를에 가져와야 DEVELOPMENT APPLICATION SERVER합니다 QA APPLICATION SERVER.

이 데이터를 점프 박스에 복사하는 것은 필요한 공간이 없기 때문에 옵션이 아닙니다.

몇 가지 조사를 수행 한 후 이러한 서버를 통해 일련의 터널을 수행하여 터널을 통해 한 앱 서버에서 다른 앱 서버로 데이터를 바로 스트리밍 할 수 있다는 것을 알게되었습니다. 그러나 응용 프로그램 서버에서 점프 상자에 연결할 수 없다는 문제가 있습니다.

옵션이 있습니까? 이것은 절망적 인 상황이되고 있으며, 시간이 핵심입니다. 데이터를 다운로드하고 다시 업로드 할 시간이 없습니다. 서버의 네트워크를 통한 복사는 기가비트 연결이므로 빠르게 진행됩니다.


2
연결이 설정되면 $ devel_host $ tar -cf-| ssh -t jumbox 'ssh app_serv "tar -xf-"'또는 tar 주위의 다른 방법.
— Alex_www

그래서 우리는 dev jump box에서 dev 앱 서버로 연결할 수 있지만 다른 방법으로는 연결할 수 없습니다. 연결이 설정되면 어느 쪽이든 복사 할 수 있습니까? 이 컨텐츠를 먼저 점프 상자에 저장하지 않고 다른 앱 서버로 옮기는 가장 좋은 방법은 무엇입니까?
— Barry Chapman

"파이핑" "타르"는 가장 간단한 해결책입니다.
— Alex_www

답변:


15

지금까지 가장 쉬운 방법은 scp를 통해 복사하는 것입니다. 또한이 구문은 실제로 다른 제안과는 다르게 작동합니다.

이 구문을 쉽게 이길 수는 없습니다. 복잡한 파이프를 고려하지 않고도 재귀 적으로 복사, 재 동기화 또는 원하는 것을 반복 할 수 있습니다. 이 구문은 직관적으로 명확하며 Sys Admins가 더 쉽게 지원할 수 있으며 cat 을 쓸모 없게 만듭니다 .

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

에서 scp를 man 페이지 : -3두 개의 원격 호스트 사이의 사본은 로컬 호스트를 통해 전송됩니다. 이 옵션을 사용하지 않으면 데이터가 두 원격 호스트간에 직접 복사됩니다. 이 옵션은 진행률 표시기를 비활성화합니다.

아래 예에서

  • 워크 스테이션 이름은 MacBook-Pro입니다.
  • Dev Jump Box의 이름은 devjumpserver입니다.
  • Dev Application Server의 이름은 devapplicationserver입니다.
    • .local이라는 LAN DNS 영역에 있음
  • QA 점프 박스의 이름은 qajumpserver입니다
  • QA 응용 프로그램 서버의 이름은 qaapplicationserver입니다.
    • .local이라는 LAN DNZ 영역에 있음
  • 670GB / etc / hosts 파일의 테스트 사본을 수행합니다. ;-)
  • SSH 공개 키 인증이 구성되었다고 가정합니다.



다음은 적절한 점프 (일명 배스 천 서버)를 통해 워크 스테이션에서 애플리케이션 서버로의 직접 액세스를 설정하는 ~ / .ssh / config 파일입니다.

맥북 프로 : ~ barrychapman $  고양이 ~ / .ssh / config
주최자 *
  ServerAliveInterval 60
호스트 개발 애플리케이션
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@devjumpserver.example.com -W % h : % p
  사용자 barrychapman
호스트 qaapplicationserver
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@qajumpserver.example.com -W % h : % p
  사용자 barrychapman

맥북 프로 : ~ barrychapman $



대상 서버에 파일이 있는지 테스트 중입니다.

MacBook-Pro : ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls : / tmp / hosts에 액세스 할 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
신호 1에 의해 사망.
맥북 프로 : ~ barrychapman $



이제 워크 스테이션을 통해 Dev Application 서버에서 QA Application으로 파일을 복사 해 봅시다.

MacBook-Pro : ~ barrychapman $ scp -3 devapplicationserver : / etc / hosts qaapplicationserver : / tmp /
신호 1에 의해 사망.
신호 1에 의해 사망.
맥북 프로 : ~ barrychapman $



이제 QA 애플리케이션 서버에 복사 된 파일이 있는지 확인하십시오. 이번에는 거기에있을 것입니다.

MacBook-Pro : ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
신호 1에 의해 사망.
맥북 프로 : ~ barrychapman $ 

노트

ProxyCommand 연결을 닫으면 "Killed by signal 1"이라는 경고 메시지가 나타납니다. 이것은 ProxyCommand 연결을 해제하는 SSH이며 걱정할 것이 없습니다. LogLevel Quiet요새 호스트 구성 스탠자 에 추가 하여 제거 할 수 있습니다 .


건배, 이것은 우리의 문제를 해결했다. 메리 크리스마스!
— Barry Chapman

"bastion host config stanza"는 무엇을 의미합니까? @BraveNewCurrency?
— Andrew Wolfe

각 "Host"줄과 그 아래의 구성은 스탠자 (시와 같이)로 간주합니다. 요새 "Host"줄 아래에 "LogLevel Quiet"을 추가하면 해당 호스트에만 적용됩니다.
— BraveNewCurrency

8

파이프!

인터넷이 일련의 튜브 인 경우 Unix는 다음과 같은 일련의 파이프입니다.

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

작동해야합니다.

더 많은 호스트를 통과해야하는 경우 필요에 따라 더 많은 파이프 (및 \이스케이프 된 인용 의 중첩 된 계층)를 추가하십시오 . (그러나 파이프 라인 / 이스케이프가 너무 복잡해 이스케이프 를 두 배로 늘려야 하는 횟수를 결정하기 위해 손가락 을 세어 다이어그램이나 그림을 그려야하는 경우 패배를 인정하고 적절한 VPN을 설정해야 할 때입니다. !)


1
Alex_www가 자신의 의견에서 지적한 것처럼 중간 파일이 필요 하지 않은 경우 출력을 파이프 할 수도 있습니다 tar. (또한 당신은하지 않습니다 필요cat - 파이프 라인의 중간 단계에있는이 ssh표준 입력을 먹고 그것을 릴레이 행복입니다이. cat날 더 기분이 당신이처럼 사용할 수있는 다른 유용한 명령에 대한 자리 표시 자입니다 tee.)
— voretaq7

나는 영업 이익의 문제가 아무 기계가없는 생각 이 모두 데이터를 가지고 와 연결을 할 수는 없으며, 모든 것을 모든 사람 (모든 파이프 용 커넥터 역할을하는) 볼 수있는 하나 개의 시스템이 있습니다.
— MadHatter

1
@MadHatter이 경우 두 가지 대답의 조합이 작동합니다 (dev 서버에 연결하여 점프 서버의 SSH 포트로 포트를 전달한 다음 해당 포트를 통해 SSH 파이프 라인을 실행하십시오). 이것은 물론 사람들이 사무실 밖에서 사람들에게 큰 표시로 항의하기 시작하는 지점까지 해결책이 점점 역겨워지게 VPN! NOW!합니다.
— voretaq7

왜 그래? 그렇습니다. 잘만되면!
— MadHatter

이 작업을 수행하면 중간 서버 (이 경우 user@host1)가 cat ginormous-file어느 시점에서든 전체 저장 영역을 갖게 됩니다. 또는 데이터가 방금 직접 전송 user@host2됩니까? 아니면 어떻게 든 스트리밍됩니까? 이것과 어떤 tar관련이 있습니까? 나는 그것이 마지막으로 물었던 질문과 관련이 있다고 생각합니다. 이 질문들 중 어느 것도 수사적
— 이지 않습니다

1

올바르게 이해하면 두 개의 응용 프로그램 서버 (app-qa 및 app-dev)를 보호하는 두 개의 점프 서버 (jump-qa 및 jump-dev)가 있습니다. 점프 서버는 서로 ssh 할 수 있습니다. 관련 점프 서버 이외의 상자는 해당 앱 서버로 ssh 할 수 없습니다. 앱 서버는 누구에게나 ssh 할 수 있습니다. 파일은 app-dev에서 app-qa로 전송됩니다. 두 점프 서버 모두 데이터의 중간 사본을위한 공간이 부족합니다.

ssh 터널링으로이 문제를 해결할 수 있습니다. 우리는 하나의 원격 앱 서버에 대한 연결을 설정하여 원격 서버를 점프 서버의 사용되지 않는 포트에 다시 연결합니다. 하나의 점프 서버에서 다른 점프 서버로의 두 번째 연결을 설정하여 터널 1을 터널 1에서 원격 전달 포트의 매달려있는 끝을 가져와 다른 앱 서버의 ssh 포트로 보냅니다.

터널을 설정하십시오 (이러한 각 명령은의 별도 창에서 실행해야합니다 jump-qa).

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

이제 app-qa에서 telnet localhost 2345app-dev의 ssh 배너를 얻을 수 있습니다. 그런 다음 데이터 파일을 복사 할 수 있습니다.

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat

QA 앱 서버 앞과 DEV 앱 서버 앞의 두 개의 점프 상자가 있습니다. 점프 박스는 서로 통신 할 수 있습니다
— Barry Chapman

고객에게 임시 사본을위한 공간이 있습니까?
— MadHatter

아니오, 공간이 충분하지 않습니다
— Barry Chapman

당신이 클라이언트를 말할 때, 당신은 어떤 서버를 언급하고 있습니까?
— Barry Chapman '12

나는 오해했다. 나의 현재 이해는 내담자가 없다는 것입니다. 두 개의 점프 서버와 두 개의 앱 서버가 있습니다.
— MadHatter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.