시각화를 통해 이런 종류의 설명을 좋아합니다. :-)
SSH 연결을 튜브로 생각하십시오. 큰 튜브. 일반적으로이 튜브를 통해 원격 컴퓨터에서 쉘을 실행할 수 있습니다. 셸은 가상 터미널 (tty)에서 실행됩니다. 하지만이 부분은 이미 알고 있습니다.
터널을 튜브 내의 튜브로 생각하십시오. 여전히 큰 SSH 연결이 있지만 -L 또는 -R 옵션을 사용하면 더 작은 튜브를 설정할 수 있습니다.
모든 튜브에는 시작과 끝이 있습니다. 큰 튜브 인 SSH 연결은 SSH 클라이언트로 시작하여 연결된 SSH 서버에서 끝납니다. "시작"또는 "종료"의 역할이 사용자가 튜브를 사용했는지 -L
또는 -R
각각 생성 했는지에 따라 결정된다는 점을 제외하고는 모든 작은 튜브의 끝 점이 동일 합니다.
(내가 말한 것은 아니지만 방화벽 뒤에있는 "원격"시스템은 NAT (Network Address Translation)를 사용하여 인터넷에 액세스 할 수 있다고 가정합니다. 이것은 중요합니다. 이 가정이 잘못된 경우 정정하십시오.)
터널을 만들 때 응답 할 주소와 포트 및 전달할 주소와 포트를 지정합니다. 이 -L
옵션은 터널이 터널의 로컬 쪽 (클라이언트를 실행하는 호스트)에서 응답하도록 지시합니다. 이 -R
옵션은 터널이 원격 측 (SSH 서버)에서 응답하도록 지시합니다.
따라서 ... 인터넷에서 방화벽 뒤의 머신으로 SSH를 만들려면 외부 세계에 대한 SSH 연결을 열고 -R
"입력"지점이 "원격"쪽인 터널을 포함하는 문제의 머신이 필요합니다. 그의 연결.
위에 표시된 두 모델 중 오른쪽에있는 두 모델이 필요합니다.
방화벽 호스트에서 :
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
이것은 클라이언트에게 -R
감정 표현 진입 점이 있는 터널을 설정하도록 지시합니다 . 터널의 맨 끝에있는 포트 22222에 연결된 것은 실제로 "localhost 포트 22"에 도달합니다. 여기서 "localhost"는 터널의 종료점 (예 : ssh 클라이언트)의 관점에서옵니다.
다른 옵션은 다음과 같습니다.
-f
인증 후 ssh에 백그라운드를 지정하도록 지시하므로, 터널이 활성 상태를 유지하기 위해 원격 서버에서 무언가를 실행하지 않아도됩니다.
-N
SSH 연결을 원하지만 실제로 원격 명령을 실행하고 싶지는 않습니다. 작성하는 것이 모두 터널 인 경우이 옵션을 포함하면 자원이 절약됩니다.
-T
의사 -tty 할당을 비활성화합니다. 이는 대화식 셸을 만들려고하지 않기 때문에 적절합니다.
비밀번호없는 로그인을 위해 DSA 또는 RSA 키를 설정하지 않으면 비밀번호 문제가 발생합니다.
이 터널 / 고객 / 서버에 대해 설정 한 자신의 로그인이 아닌 일회용 계정을 사용하는 것이 좋습니다.
이제 publichost 의 쉘에서 터널을 통해 방화벽 호스트에 연결하십시오.
ssh -p 22222 username@localhost
이전에는이 호스트를 공격 한 적이 없기 때문에 호스트 키 문제가 발생합니다. 그런 다음 username
비밀번호없는 로그인을위한 키를 설정하지 않은 경우 계정에 대한 비밀번호 확인 요청이 표시 됩니다.
이 호스트에 정기적으로 액세스하려는 경우 ~/.ssh/config
파일에 몇 줄을 추가하여 액세스를 단순화 할 수도 있습니다.
host remotehostname
User remoteusername
Hostname localhost
Port 22222
조정 remotehostname
하고 remoteusername
적합하십시오. 이 remoteusername
필드는 원격 서버의 사용자 이름과 일치해야하지만 사용자 remotehostname
에게 적합한 호스트 이름 일 수 있으며 해결 가능한 항목과 일치 할 필요는 없습니다.
( 로컬 호스트 가 아닌 IP 에서 역방향 끝점을 노출하려면 이 게시물을 확인하십시오 )