여러 홉을 통해 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.