it-swarm-ko.tech

역방향 SSH 터널링은 어떻게 작동합니까?

이것을 이해하면서 방화벽 (기본 설정 가정)은 이전에 해당하는 나가는 트래픽이없는 들어오는 트래픽을 모두 거부합니다.

ssh 연결 되돌리기SSH 터널링이 쉬워 짐 에 따라 역 SSH 터널링을 사용하여 성가신 방화벽 제한을 피할 수 있습니다.

원격 컴퓨터에서 셸 명령을 실행하고 싶습니다. 원격 시스템에는 자체 방화벽이 있으며 추가 방화벽 (라우터) 뒤에 있습니다. 192.168.1.126 (또는 이와 유사한 것)과 같은 IP 주소가 있습니다. 방화벽 뒤에 있지 않고 인터넷에서 볼 수있는 원격 컴퓨터의 IP 주소 (192.168.1.126 주소 아님)를 알고 있습니다. 또한 누군가에게 먼저 원격 컴퓨터에서 루트로 ssh (something)을 실행하도록 요청할 수 있습니다.

역 SSH 터널링이 방화벽 (로컬 및 원격 시스템의 방화벽과 방화벽 사이의 추가 방화벽)을 통과하는 방법을 단계별로 설명 할 수 있습니까?

스위치의 역할은 무엇입니까 (-R, -f, -L, -N)?

376
Ali

시각화를 통해 이런 종류의 설명을 좋아합니다. :-)

SSH 연결을 튜브로 생각하십시오. 큰 튜브. 일반적으로 이러한 튜브를 통해 원격 컴퓨터에서 셸을 실행할 수 있습니다. 셸은 가상 터미널 (tty)에서 실행됩니다. 하지만이 부분은 이미 알고 있습니다.

터널을 튜브 내의 튜브로 생각하십시오. 여전히 큰 SSH 연결이 있지만 -L 또는 -R 옵션을 사용하면 더 작은 튜브를 설정할 수 있습니다.

모든 튜브에는 시작과 끝이 있습니다. 큰 튜브 인 SSH 연결은 SSH 클라이언트로 시작하여 연결된 SSH 서버에서 끝납니다. "시작"또는 "종료"의 역할이 -L 또는 -R (각각) 생성합니다.

(내가 말한 것은 아니지만 방화벽 뒤에있는 "원격"시스템은 NAT (Network Address Translation)를 사용하여 인터넷에 액세스 할 수 있다고 가정합니다. 이것은 중요합니다. 이 가정이 잘못된 경우 정정하십시오.)

터널을 만들 때 응답 할 주소와 포트 및 전달할 주소와 포트를 지정합니다. -L 옵션은 터널이 터널의 로컬 쪽 (클라이언트를 실행하는 호스트)에서 응답하도록 지시합니다. -R 옵션은 터널이 원격 측 (SSH 서버)에서 응답하도록 지시합니다.

ssh tunnel directions

그래서 ... 인터넷에서 방화벽 뒤의 머신으로 SSH를 만들려면 문제의 머신이 외부 세계와의 SSH 연결을 열고 -R "입력"지점이 연결의 "원격"측인 터널.

위에 표시된 두 모델 중 오른쪽에있는 두 모델이 필요합니다.

방화벽이있는 호스트에서 :

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

이것은 클라이언트에게 -Remote 진입 점. 터널의 맨 끝에있는 포트 22222에 연결된 것은 실제로 "localhost 포트 22"에 도달합니다. 여기서 "localhost"는 터널의 종료점 (예 : ssh 클라이언트)의 관점에서옵니다.

다른 옵션은 다음과 같습니다.

  • -f는 인증 후 ssh에게 백그라운드를 지정하도록 지시하므로 터널이 활성 상태를 유지하기 위해 원격 서버에서 무언가를 실행하지 않아도됩니다.
  • -N는 SSH 연결을 원하지만 실제로는 원격 명령을 실행하고 싶지 않다고 말합니다. 작성하는 것이 모두 터널 인 경우이 옵션을 포함하면 자원이 절약됩니다.
  • -T는 의사 -tty 할당을 비활성화합니다. 이는 대화식 셸을 만들려고하지 않기 때문에 적합합니다.

비밀번호없는 로그인을 위해 DSA 또는 RSA 키를 설정하지 않으면 비밀번호 문제가 발생합니다.

이 터널/고객/서버에 대해 설정 한 자신의 로그인이 아닌 일회용 계정을 사용하는 것이 좋습니다.

이제 yourpublichost 의 셸에서 터널을 통해 방화벽으로 연결된 호스트에 연결하십시오.

ssh -p 22222 [email protected]

이전에는이 ​​호스트를 공격 한 적이 없으므로 호스트 키 챌린지가 발생합니다. 그런 다음 username 계정에 대해 암호를 입력해야합니다 (암호없는 로그인을위한 키를 설정하지 않은 경우).

이 호스트에 정기적으로 액세스하려는 경우 ~/.ssh/config 파일 :

Host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

remotehostnameremoteusername를 조정하십시오. remoteusername 필드는 원격 서버의 사용자 이름과 일치해야하지만 remotehostname는 사용자에게 적합한 호스트 이름 일 수 있으며, 해결 가능한 항목과 일치하지 않아도됩니다.

또한보십시오:

433
ghoti

스케치를 그렸습니다

Ssh tunnel 명령이 입력 된 머신은 "your Host"입니다.

ssh tunnel starting from local


ssh tunnel starting from remote

소개

  1. 로컬 : -L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost 의미 : ssh를 connectToHost에 연결하고 모든 연결 시도를 localsourcePort을 포트 onPort에 전달 forwardToHost 머신에서 도달 할 수있는 connectToHost 머신에서.

  2. 원격 : -R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost 의미 : ssh를 connectToHost에 연결하고 모든 연결 시도를 remotesourcePort을 포트 onPort에 전달 로컬 컴퓨터에서 도달 할 수있는 forwardToHost이라는 컴퓨터에서.

추가 옵션

  • -f는 인증 후 ssh에게 백그라운드를 지정하도록 지시하므로, 터널이 활성 상태를 유지하기 위해 원격 서버에서 무언가를 실행하지 않아도됩니다.
  • -N는 SSH 연결을 원하지만 실제로는 원격 명령을 실행하고 싶지 않다고 말합니다. 작성하는 것이 모두 터널 인 경우이 옵션을 포함하면 자원이 절약됩니다.
  • -T는 의사 -tty 할당을 비활성화합니다. 이는 대화식 셸을 만들려고하지 않기 때문에 적합합니다.

당신의 예

세 번째 이미지는이 터널을 나타냅니다. But"your Host"라는 파란색 컴퓨터는 someone 이 ssh 터널을 시작하는 컴퓨터를 나타냅니다. 방화벽 컴퓨터.

따라서 someone 에게 시스템에 대한 ssh 터널 연결을 시작하도록 요청하십시오. 명령은 기본적으로 다음과 같아야합니다

ssh -R 12345:localhost:22 YOURIP

이제 터널이 열립니다. 이제 명령을 사용하여 ssh를 통해 터널을 통해 방화벽 시스템에 연결할 수 있습니다

ssh -p 12345 localhost

포트 12345에서 자신의 localhost (컴퓨터)에 연결되지만 12345 포트는 터널을 통해 방화벽 컴퓨터의 로컬 호스트 포트 22로 전달됩니다. 방화벽 컴퓨터 자체).

389
erik

ssh 터널링은 추가 트래픽 전송을 위해 이미 설정된 ssh 연결을 사용하여 작동합니다.

원격 서버에 연결할 때 일반적으로 정상적인 사용자 상호 작용을위한 1 개의 채널 만 있습니다 (또는 STDIN/STDOUT/STDERR을 별도로 고려하면 3 개의 채널). 로컬 또는 원격 ssh 프로세스는 언제든지 기존 연결에서 추가 채널을 열 수 있습니다. 그런 다음이 채널은 터널 트래픽을 보내거나받습니다. 트래픽을 보내거나받을 때 ssh 프로세스는 단순히 "이 트래픽은 채널 foobar에 대한 것"이라고 말합니다.

본질적으로 다음과 같이 작동합니다.

  1. Ssh에게 포트 XXXX에서 청취를 시작하도록하고 수신 된 모든 트래픽을 터널링 한 다음 포트 ZZZZ에서 Y.Y.Y.Y로 설정해야합니다.
  2. 로컬 ssh가 포트 XXXX에서 청취를 시작합니다 (일반적으로 127.0.0.1에서 변경 가능).
  3. 일부 응용 프로그램은 로컬 컴퓨터의 포트 XXXX에 대한 연결을 엽니 다.
  4. 로컬 ssh가 원격 ssh에 대한 채널을 열고 "이 채널의 모든 트래픽은 Y.Y.Y.Y : ZZZZ로 이동합니다."
  5. 원격 ssh가 Y.Y.Y.Y : ZZZZ에 연결하고 "OK, 채널이 열려 있습니다"를 다시 보냅니다.
  6. 이제 로컬 시스템의 포트 XXXX로 연결을 통해 전송 된 모든 트래픽은 ssh에 의해 Y.Y.Y.Y : ZZZZ로 프록시됩니다.

이 과정은 정방향 및 역방향 터널링에서 모두 동일합니다 (위 절차에서 'local'및 'remote'라는 단어 만 바꾸십시오). 어느 쪽이든 터널을 시작할 수 있습니다. ssh를 처음 시작할 때조차 필요하지 않습니다. ssh가 이미 실행중인 동안 터널을 열 수 있습니다 (ESCAPE CHARACTERS, 특히 ~C 참조).

-R, -f, -L-N의 역할에 대해서는 맨 페이지를 참조해야합니다. 가능한 최상의 설명을 제공합니다. 그러나 -R-L에 대해서는 언급하겠습니다.
-R는 원격 ssh에게 연결을 수신하고 로컬 ssh가 실제 대상에 연결하도록 지시합니다. -L는 로컬 ssh에게 연결을 수신하도록 지시하고 원격 ssh는 실제 대상에 연결해야합니다.

이것은 매우 조잡한 설명이지만 무슨 일이 일어나고 있는지 알 수있는 충분한 정보를 제공해야합니다

24
Patrick

이것은 SSH 매뉴얼, 특히 -L (로컬)과 -R (원격)의 차이점에 설명되어 있습니다.


-L

-L [bind_address:]port:Host:hostport

로컬 (클라이언트) 호스트의 지정된 포트가 원격 측의 지정된 호스트 및 포트로 전달됨을 지정합니다.

이것은 로컬 측의 포트를 청취하도록 소켓을 할당하고, 선택적으로 지정된 bind_address에 바인드함으로써 작동합니다.

이 포트에 연결될 때마다 보안 채널을 통해 연결이 전달됨되고 원격 시스템에서 to Host port hostport.

다음 예제는 포트 1234를 사용하여 클라이언트 시스템 127.0.0.1 (localhost)에서 원격 서버 server.example.com으로 IRC 세션을 터널링합니다.

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

참고 : -f 옵션 배경 ssh 및 원격 명령 sleep 10은 터널링 될 서비스를 시작할 시간을 허용하도록 지정됩니다.

예:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N 연결 후 끊기 만하면 셸 프롬프트가 표시되지 않습니다.

    원격 명령을 실행하지 마십시오.

  • -L 22000 연결은 개인의 포트 22000에서 시작됩니다. L ocal machine

  • localhost:11000-remote.server.com은 터널의 다른 쪽 끝이 localhost, 포트 11000인지 확인합니다.

ssh -N -L 22000:192.168.1.2:11000 remote.server.com

출처 : ssh tunneling에 대한 설명 된 가이드, 자습서, 방법 .


-R

-R [bind_address:]port:Host:hostport

원격 (서버) 호스트의 지정된 포트가 로컬 측의 지정된 호스트 및 포트로 전달됨을 지정합니다.

이것은 소켓을 할당하여 원격에서 port을 (를) 청취하고이 포트에 연결될 때마다 보안 채널을 통해 연결이 전달됨되고 연결됩니다. 로컬 컴퓨터에서 Host 포트 hostport까지.

예:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N 연결 후 끊기 만하면 셸 프롬프트가 표시되지 않습니다.

    원격 명령을 실행하지 마십시오.

  • -R 22000 연결은 R emote 컴퓨터 (이 경우 remote.server.com)의 포트 22000에서 시작됩니다.

  • localhost:11000 개인 로컬 컴퓨터는 터널의 다른 쪽 끝이 localhost, 포트 11000인지 확인합니다.

ssh -N -R 22000:localhost:11000 remote.server.com

출처 : ssh tunneling에 대한 설명 된 가이드, 자습서, 방법 .

18
kenorb