원격 명령(-N) 없이 로컬 SSH 터널링(-L)은 어떻게 작동합니까?

원격 명령(-N) 없이 로컬 SSH 터널링(-L)은 어떻게 작동합니까?

-L저는 SSH 터널링 을 처음 접했고 -N.

먼저 로컬 SSH 터널 자체에 대한 이해를 확인하겠습니다.

ssh -L 10000:theprotectedserver.com:9042 [email protected]

thebastionhost.com그러면 로컬 컴퓨터에서 원격으로 명령을 실행할 수 있는 셸이 열립니다 . 이러한 명령이 나가는 포트 10000에서 (어떤 서버로?) 네트워크 요청을 하면 요청이 로 전달됩니다 theprotectedserver.com:9042.

이제 이것이 맞다고 가정하고 -N문서에 따라 추가하는 방법에 대해 논의해 보겠습니다.

-N' 원격 명령을 실행하지 않습니다. 이는 포트만 전달하는 데 유용합니다(프로토콜 버전 2만 해당).

그래서 이번 SSH 세션은

ssh -N -L 10000:theprotectedserver.com:9042 [email protected]

이제 원격이 아닌 실제 컴퓨터에서 로컬로 명령이 실행됩니까 thebastionhost.com? 그러나 포트 10000으로 전송된 모든 네트워크 요청은 thebastionhost.com여전히 theprotectedserver.com:9042​​?

명령이 내 컴퓨터에서 실행되지만 네트워크 부분이 분리되어 요새 호스트로 라우팅되기 때문에 이것이 나를 혼란스럽게 하는 것 같습니다. 누군가 여기서 무슨 일이 일어나고 있는지 더 자세히 설명해 줄 수 있습니까?

답변1

ssh -L 10000:theprotectedserver.com:9042 [email protected]
그러면 내 로컬 컴퓨터에서 thebastionhost.com에 대한 명령을 원격으로 실행할 수 있는 셸이 열립니다. 이러한 명령이 나가는 포트 10000(모든 서버에 대해)에서 네트워크 요청을 하는 경우 해당 요청은 theprotectedserver.com:9042로 전달됩니다.

이것은 혼란스럽기는 하지만 대부분 잘못된 것입니다.

실제로 이는 보안(암호화 및 인증) 연결을 생성합니다.thebastionhost 그리고sshd쉘 실행 요청 (서버 측 연결)존재하다 thebastionhost그런 다음 터미널에 입력한 모든 내용을 해당 셸(또는 그 아래의 프로그램)로 전달하고, 해당 셸(또는 그 아래의 프로그램)에서 출력한 모든 내용을 다시 터미널로 전달합니다. (보다 정확하게는 해당 PTY에 PTY 또는 의사 터미널을 생성 thebastionhost하고 해당 PTY에서 셸을 실행한 다음 PTY와의 입력 및 출력을 중계합니다. 셸 및 기타 프로그램은 PTY의 I/O를 제어할 수 없습니다. .O 조정이 처리됩니다.통과로컬 터미널과 동일한 방식으로 PTY를 수행합니다 thebastionhost. ; exit​​거의ssh 사용되지 않음) 또는 로컬 프로세스나 시스템이 종료되거나 종료됩니다.

그것반품듣다현지의포트 10000에서 로컬/클라이언트 시스템(P라고 함)의 프로세스가 포트를 열면 열기를 ssh요청합니다 .sshdtheprotectedserver:9042 ~에서 thebastionhosttheprotectedserver:9042그리고 (성공할 경우) P가 해당 열린 곳으로 보내는 모든 항목과 해당 열린 곳의 모든 항목을 터널을 통해 다시 P로 "터널링"합니다. 이를 통해 P는 마치 P가 있는 것처럼 그 위에 있는 모든 프로그램(어떤 프로그램이든 가능)과 대화할 수 있습니다 thebastionhost. P를 명시적으로 실행하려면 다음과 같이 다른 터미널(또는 의사 터미널)로 이동해야 합니다. tmux 창). OTOH 다른 사람이 귀하의 클라이언트 시스템에 로그인하는 경우,그들을P는 귀하의 개입이나 지식 없이도 실행될 수 있습니다.

이 두 가지(원격 셸과의 상호 작용 및 P와 다른 것과의 상호 작용)는 단일 보안 연결을 통해 다중화되더라도 동시에 개별적으로 발생합니다. 실제로 theprotectedhost:9042TCP/IP 수준에서 이러한 다중 연결을 허용하는 한, 각각 자체 연결이 있는 여러 P가 있을 수 있습니다. 대부분의(전부는 아님) TCP/IP 서버 또는 서비스 애플리케이션이 이러한 방식으로 허용됩니다.

ssh -N -L 10000:theprotectedserver.com:9042 [email protected]

이렇게 하면 보안 연결이 생성되지만 첫 번째 단락의 나머지 부분은 모두 건너뜁니다. 즉, 원격 셸을 실행하거나 원격 셸에서 데이터를 전달하지 않습니다. 실제로 제공하려는 입력은 모두 무시됩니다. 그러나 &끝에 추가하거나 (POSIX 작업 제어를 가정하여) control+Z를 입력한 다음 명령을 입력하면 bg명령이 ssh백그라운드에서 실행되고 계속해서 컴퓨터에 명령을 실행할 수 있습니다.현지의껍데기. 그러나 두 번째 단락하다이는 로컬 쉘을 사용하여 P를 실행하여 로컬 포트 ​​10000에 액세스하고 theprotectedhost:9042위와 같이 정확하게 릴레이할 수 있도록 하기 위한 것입니다. 이번에는 다른(로컬) 터미널(또는 사용자)이 필요하지 않습니다.

관련 정보