내 문제는 설명된 문제와 유사합니다.여기. 호스트 A, B, C 세 개가 있습니다.
A는 내 집 컴퓨터입니다.
B는 인터넷에 연결된 대학에 있는 서버입니다.
C는 대학 사무실에 있는 컴퓨터이다. 서버와 동일한 로컬 네트워크에 연결되어 있습니다. 따라서 A -> B 및 B -> C에서는 SSH를 사용할 수 있지만 A -> C에서는 SSH를 사용할 수 없습니다. A에서 C로 직접 연결하고 싶습니다.
솔루션 설명을 잘 작성하세요.여기.
하지만 내 문제는 이 솔루션이 호스트 A에 적용되는 반면, 나는 동일한 연결이 필요한 다른 사용자가 쉽게 사용할 수 있도록 호스트 B에 배포할 수 있는 솔루션을 선호한다는 것입니다. 여기서 제가 깨달은 것은 대부분의 사용자가 컴퓨터 기술이 없는 교사라는 것입니다. 도움을 주세요.
답변1
우선, 이 새로운 솔루션은 외부 도구에 의존하지 않기 때문에 여기의 솔루션은 질문에 제공된 링크에 제공된 솔루션보다 낫습니다 netcat
. 예를 들면 다음과 같습니다.
Host C
ProxyCommand ssh -W %h:%p B
호스트 .ssh/config
A 에서 사용자는 특정 컴퓨터 기술이 필요하지 않으며 단지 정보만 있으면 됩니다. 누구나 파일에 2줄을 넣을 수 있습니다.
이것이 실제로 문제가 되는 경우 .ssh/authorized_keys
호스트 B의 파일에 특정 명령을 추가할 수 있습니다.
command="ssh C" ssh-rsa <key_of_the_user_of_host_A>
따라서 사용자가 이 작업을 수행하면 ssh B
호스트 B에서 대화형 셸을 시작하는 대신 호스트 B의 SSH 서버가 자동으로 실행됩니다 ssh C
(sshd(8) 매뉴얼 페이지 참조). 그러나 이렇게 하면 호스트 B에 직접 로그인할 수 없으며 다른 SSH 명령(예: /bin/bash -l
) ssh -t B /bin/bash -l
은 무시됩니다. 매뉴얼 페이지에 따르면 다음과 같습니다.
클라이언트가 원래 제공한 명령은 SSH_ORIGINAL_COMMAND 환경 변수에서 찾을 수 있습니다.
따라서 제공된 명령을 호스트 C에서 실행하거나 특정 조건에서 호스트 B에서 실행하는 등 개선의 여지가 있을 수 있습니다(이 환경 변수를 고려하는 경우 인용할 때도 주의하세요). 예는 다음과 같습니다:
command="ssh ${TTY:+-t} C ${SSH_ORIGINAL_COMMAND-$SHELL}" ssh-rsa <key>
그렇다면 호스트 C에서 제공된 명령을 실행합니다(그렇지 않으면 대화형 쉘이 평소대로 시작됩니다). 이것이 scp
작동할 수도 있지만 내 컴퓨터에서는 "권한 거부" 오류로 인해 실패합니다. 그러나 그것은 훌륭하게 작동하며 문제가 있을 경우 rsync
대체품으로 사용할 수 있습니다 .scp
중요한.호스트 B에서 (필수적으로 권한이 없는) 포트를 여는 솔루션을 선택하지 마십시오. 이러한 포트에 대한 연결이 대학의 방화벽에 의해 차단되어 작동하지 않거나 사용자가 포트 22의 SSH 서버를 통해 호스트 B의 인증을 우회할 수 있으므로 보안 문제가 발생합니다(추적 등 기능 사용).
답변2
호스트 B에서:
B$ ssh localhost -L 2222:C:22 -g
실행 중이면 모든 사람이 B:2222(tcp 포트 2222)를 통해 호스트 C에 연결할 수 있습니다.
영구적인 해결 방법을 위해 screen
호스트 B에서 ssh 명령을 실행하고 ssh 명령을 백그라운드에 그대로 둘 수 있습니다.
(ssh보다 더 간단한 tcp 리디렉션 소프트웨어를 사용하여 localhost로 이동할 수 있습니다: 예: redir)
답변3
B에서는 포트를 열 필요가 없지만 A에서는 포트를 여는 대화형 포워딩 솔루션은 다음과 같습니다.
A에:
ssh -fNL 2222:C:22 B
ssh -p 2222 localhost
@vinc17에서 언급한 구성 프록시 옵션(비슷한 방식으로 작동)에 추가로 이를 아는 것이 유용할 수 있습니다.