답변:
로컬 머신에서 중간 호스트를 통해 최종 호스트까지 SSH 터널을 만들 수 있습니다.
ssh user@intermediate -L 2000:final:22 -N
그러면 중간 호스트를 통해 터널링하여 포트 22의 최종 서버에 직접 연결되는 로컬 호스트에서 포트 2000이 열립니다. 이제 다른 프롬프트에서 포트 2000의 sftp와 연결하여 최종 서버로 터널링합니다. 여기에 지정된 사용자는 최종 호스트에 대한 것입니다.
sftp -P 2000 user@localhost
이것은 superuser.com 또는 serverfault.com 에 속하는 것 같습니다 .
SFTP의 ProxyCommand 옵션을 사용하면 SSH 연결을 통해 SFTP 연결을 투명하게 터널링 할 수 있습니다 (WhiteFang34의 답변과 비슷하지만 전달 된 로컬 TCP 포트가 아닌 SSH 연결의 stdin & stdout을 통해).
sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
(중간 호스트에 netcat이 / usr / bin / nc로 설치되어 있다고 가정합니다. 그렇지 않은 경우 TCP 세션에서 stdin & stdout을 게이트웨이로 사용하는 동일한 방법을 찾아 설치해야 할 수도 있습니다.)
이 옵션의 가장 멋진 점은 ~ / .ssh / config 파일에 추가하여 투명하게 만들 수 있다는 것입니다.
Host finalhost
ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
이 항목을 사용하면 sftp, scp 및 ssh를 사용하여 finalhost를 만들 수 있으며 터널을 자동으로 호출합니다. 불투명하지 않은 유일한 부분은 두 개의 암호 (중간 호스트 다음에 finalhost)를 묻는 메시지가 표시되지만 SSH 키 쌍을 사용하여 암호를 제거 할 수 있습니다 ...
exec
필요? (여기서는 그 부분 없이도 잘 작동합니다.)
최종 호스트가 방화벽으로 설정되어 있다고 가정하고 있습니다.
예를 들어, 로컬 컴퓨터에서 ssh를 노출 한 다음 첫 번째 호스트로 ssh를, 두 번째 호스트로 ssh를, 마지막 호스트에서 컴퓨터로 sftp를 노출하십시오.
A와 B가 첫 번째와 두 번째 호스트라고 가정하겠습니다. 그리고 복사 될 파일은 foo입니다
sftp 대신 다음을 사용할 수 있습니다
고양이 foo | ssh "고양이-> foo"
이제이 중 2 개를 데이지 체인으로 연결할 수 있습니다
고양이 foo | ssh A "cat-| ssh B \"cat-> foo \ ""