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

내가 이해하는 바와 같이 방화벽 (기본 설정 가정)은 이전에 나가는 트래픽이없는 들어오는 모든 트래픽을 거부합니다.

기준 ssh 연결 반전 쉬운 SSH 터널링 , 리버스 SSH 터널링을 사용하여 성가신 방화벽 제한에 대해.

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

누군가 방화벽 (로컬 및 원격 시스템 “방화벽과 방화벽 사이의 추가 방화벽)을 우회하기 위해 역 SSH 터널링이 어떻게 작동하는지 단계별로 설명해 주시겠습니까?

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

댓글

답변

나는 시각화를 통해 이런 종류를 설명하는 것을 좋아합니다. 🙂

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

터널을 튜브라고 생각하면됩니다. 여전히 큰 SSH 연결을 가지고 있지만 -L 또는 -R 옵션을 사용하면 내부에 작은 튜브를 설정할 수 있습니다.

모든 튜브에는 시작과 끝이 있습니다. 큰 튜브, SSH 클라이언트로 시작하여 연결 한 SSH 서버에서 끝나는 SSH 연결입니다. 모든 작은 튜브에는 동일한 엔드 포인트가 있습니다. 단, “start”또는 “end”의 역할은

또는 -R (각각)을 사용하여 생성합니다.

(당신은 말하지 않았지만 저는 방화벽 뒤에있는 “원격”컴퓨터가 NAT (Network Address Translation)를 사용하여 인터넷에 액세스 할 수 있다는 사실을 확인하십시오. 이것은 일종의 중요하므로이 가정이 거짓이면 수정하십시오.)

터널을 만들 때 광고를 지정합니다. 응답 할 드레스와 항구, 그리고 배달 될 주소와 항구. -L 옵션은 터널의 로컬 측 (클라이언트를 실행하는 호스트)에서 응답하도록 터널에 지시합니다. -R 옵션은 터널이 원격 측 (SSH 서버)에서 응답하도록 지시합니다.

ssh 터널 방향

그래서 … 인터넷에서 방화벽 뒤의 시스템으로 SSH를 수행하려면 외부 세계에 대한 SSH 연결을 열고 터널의”진입 “지점은 연결의”원격 “쪽입니다.

위에 표시된 두 모델 중 오른쪽에있는 모델을 원합니다.

방화벽 호스트에서 :

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

이것은 클라이언트가 -R 이모 트 항목으로 터널을 설정하도록 지시합니다. 포인트. 터널의 맨 끝에있는 포트 22222에 연결된 모든 것은 실제로 “localhost 포트 22″에 도달합니다. 여기서 “localhost”는 터널의 출구 지점 (예 : ssh 클라이언트)의 관점에서 볼 수 있습니다.

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

  • -f는 ssh가 인증 후 백그라운드에 자체적으로 지시하므로 ssh에서 무언가를 실행할 필요가 없습니다. 터널이 살아있는 원격 서버.
  • -N는 SSH 연결을 원하지만 실제로 원격 명령을 실행하고 싶지는 않다고 말합니다. 생성하는 것이 터널뿐이라면이 옵션을 포함하면 리소스가 절약됩니다.
  • -T는 의사 tty 할당을 비활성화합니다. 대화 형 셸을 만들려고합니다.

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

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

이제 쉘에서 yourpublichost , 터널을 통해 방화벽이있는 호스트에 연결 :

ssh -p 22222 username@localhost 

사용자 호스트 키 챌린지를 받으십시오. “이전에이 호스트를 방문한 적이 없을 것입니다. 그런 다음 username 계정에 대한 암호 요청을 받게됩니다 (비밀번호없는 로그인을위한 키를 설정하지 않은 경우).

이 호스트에 정기적으로 액세스하려는 경우 ~/.ssh/config 파일에 몇 줄을 추가하여 액세스를 단순화 할 수도 있습니다.

host remotehostname User remoteusername Hostname localhost Port 22222 

remotehostnameremoteusername을 적절하게 조정합니다. remoteusername 필드는 원격 서버의 사용자 이름과 일치해야하지만 remotehostname는 사용자에게 적합한 호스트 이름이 될 수 있으며 확인할 수있는 항목과 일치 할 필요는 없습니다.

참고 항목 :

댓글

  • ssh -D는 어떻습니까? 같은 방법으로 설명해주세요.
  • SOCKS 프록시는 터널과 다릅니다. 사용 방법에 대한 질문이 있으면 문의 하세요.
  • I ‘ m 서버, 클라이언트, 로컬 머신, 원격 머신, 호스트, yourpublichost, localhost, remotehostname과 같은 용어의 느슨한 사용으로 인해이 설명을 따르는 데 매우 어려움을 겪고 있습니다. 이러한 느슨하고 정의되지 않은 용어를 사용하면 누군가 이것을 설정하는 데 최대 8 대의 컴퓨터가 필요하다고 가정 할 수 있습니다. 나는 다른 모든 측면에서 매우 좋은 설명처럼 보이기 때문에 이것을 진술합니다. 용어를 줄이고 정의하십시오.
  • @ Rucent88, 저는 ‘ 어떤 축소가 가능한지 잘 모르겠습니다. 클라이언트는 서버에 대한 연결을 설정합니다. ‘ 네트워킹의 전 세계에서 사용되는 일반적인 용어입니다. 로컬 및 원격 시스템은 자명 해 보입니다. 설명서를 읽은 후 ‘ SSH 또는 일반 Unix 용어가 혼동되는 경우 ‘ ‘ 여기에있을 수있는 모든 질문에 기꺼이 대답 할 사람을 찾는 데 어려움이 없습니다.
  • @ghoti It ‘는 정말 혼란 스럽습니다. 원격 시스템은 상대적입니다. 직장에 앉으면 집에있는 컴퓨터가 리모컨이고, 집에 앉으면 직장 컴퓨터가 리모컨이됩니다. 터널링에 대해 말할 때 서버와 클라이언트도 혼란 스럽습니다. 예를 들어 ssh -R을 사용하여 직장에서 집에 연결하는 경우. localhost를 연결하여 가정용 컴퓨터에서 직장에 연결합니다. 따라서 소켓 관점에서 서버는 가정용 컴퓨터 자체입니다. 하지만 논리적으로 저는 직장 컴퓨터에 연결했습니다. ‘ 혼란 스럽습니다.

답변

일부 스케치

ssh tunnel 명령이 입력 된 머신은 »your host«라고합니다.

로컬에서 시작하는 SSH 터널


원격에서 시작하는 SSH 터널

소개

  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에 연결하고 모든 연결 시도를 로컬 sourcePortforwardToHost라는 시스템에서 onPort 포트로, 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에 연결하고 모든 연결 시도를 원격 sourcePort 포트 forwardToHost라는 시스템에서 로컬 시스템에서 접근 할 수 있습니다.

추가 옵션

  • -f는 인증 후 ssh에게 백그라운드 자체를 알려줍니다. 따라서 터널이 원격 서버에서 무언가를 실행하기 위해 앉아있을 필요가 없습니다. 살아남습니다.
  • -N는 SSH 연결을 원하지만 실제로 원격 명령을 실행하고 싶지 않다고 말합니다. 생성하는 것이 터널뿐이라면이 옵션을 포함하면 리소스가 절약됩니다.
  • -T는 의사 tty 할당을 비활성화합니다. 대화 형 셸을 만들려고합니다.

세 번째 이미지는이 터널을 나타냅니다. 그러나 »your host«라는 파란색 컴퓨터는 누군가 가 ssh 터널을 시작하는 컴퓨터를 나타냅니다. 이 경우에는 방화벽이있는 시스템입니다.

그러므로 누군가 에게 시스템에 대한 ssh 터널 연결을 시작하도록 요청하십시오. 명령은 기본적으로 다음과 같아야합니다.

ssh -R 12345:localhost:22 YOURIP 

이제 터널이 열립니다.이제 ssh를 통해 터널을 통해 방화벽이 설치된 시스템에 연결할 수 있습니다.

ssh -p 12345 localhost 

이 명령은 자신의 localhost12345의 / div> (사용자 시스템)이지만 12345 포트는 터널을 통해 방화벽이있는 로컬 호스트의 포트 22로 전달됩니다. 컴퓨터 (예 : 방화벽이있는 컴퓨터 자체).

댓글

  • @erik,이 이미지를 어떻게 그렸나요?
  • I Inkscape 라는 오픈 소스 벡터 그리기 도구와 내 마우스를 사용했습니다 (실제로는 트랙볼입니다 : Logitech의 Marble FX).
  • @ghoti : 기본적으로 서버의 수신 소켓 (내 -R 이미지에서 노란색 원격 호스트)은 루프백 인터페이스 에만 바인딩됩니다. bind_address를 지정하여 재정의 할 수 있습니다. 빈 bind_address 또는 주소‘*’는 원격 소켓이 모든 인터페이스에서 수신해야 함을 나타냅니다. — 그러니 시도해보세요. 파란색 컴퓨터에서 ssh -R 1234:localhost:8000 yellowcomputer를 시작합니다. 또한 블루 머신에서 python -m SimpleHTTPServer (포트 8000의 간단한 웹 서버)를 시작합니다. 그런 다음 노란색 컴퓨터의 웹 브라우저에서 URL http://localhost:1234를 열면 작동하는 것을 볼 수 있습니다.
  • @erik, 아, 혼란스러운 부분은 내 눈이 나쁨-‘ 명령에서 remotehost 전에 공백을 보지 못했습니다. 자세히 살펴보면 다이어그램이 실제로 선택적 bind_address를 전혀 다루지 않는 것을 ‘ 보았습니다. 혼동을 드려 죄송합니다.
  • @briankip 물론입니다. 최소한 방화벽 뒤의 컴퓨터에 ssh 연결을 설정하려면 (터널을 통해 또는 방화벽이 허용하는 경우 직접). 예 : 방화벽 컴퓨터에서 작성하는 ssh 명령은 터널 만 열지 만 ssh-daemon / -server로 시작하거나 작동하지 않습니다 . 다음 질문은 루트 권한없이 sshd를 시작하는 방법 입니다 (문제인 경우). 🙂

Answer

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

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

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

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

이 프로세스는 순방향 및 역방향 터널링 모두에서 동일합니다 ( “local”및 “remote” 위의 절차) 양쪽 모두 터널을 시작할 수 있습니다. ssh를 처음 시작할 때일 필요도 없습니다. ssh가 이미 실행중인 동안 터널을 열 수 있습니다 (ESCAPE CHARACTERS, 특히 ~C 참조).

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

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

답변

이것은 SSH 설명서, 특히 -L (로컬)과 -R의 차이점에 대해 설명합니다. div> (원격).


-L

-L [bind_address:]port:host:hostport

로컬 (클라이언트) 호스트에서 지정된 포트가 지정된 호스트로 전달되도록 지정하고 원격 측의 포트 .

선택적으로 지정된 bind_address에 바인딩 된 로컬 측의 포트를 수신하는 소켓을 할당하여 작동합니다.

이 포트에 연결할 때마다 연결은 보안 채널을 통해 전달되고 host 원격 시스템에서 hostport 포트 .

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

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

참고 : -f 옵션 backgrounds ssh 및 원격 명령 sleep 10가 지정되어 터널링 될 서비스를 시작할 수있는 시간을 허용합니다.

예 :

ssh `-N` -L 22000:localhost:11000 remote.server.com 
  • -N 연결 후 잠시만 기다리십시오 (셸 프롬프트가 표시되지 않음).

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

  • -L 22000 연결은 개인의 포트 22000, L ocal machine

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

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

출처 : ssh 터널링에 대한 그림 가이드, 자습서, 방법 .


-R

-R [bind_address:]port:host:hostport

원격 (서버) 호스트에 제공된 포트가 g로 전달되도록 지정합니다. 로컬 측의 iven 호스트 및 포트 .

이는 port를 수신 할 소켓을 할당하여 작동합니다. 이 포트에 연결할 때마다 연결이 보안 채널을 통해 전달되고 연결 로컬 시스템에서 host 포트 hostport로 만들어집니다. .

예 :

ssh -N -R 22000:localhost:11000 remote.server.com 
  • -N 연결 후 잠시만 기다리십시오 (셸 프롬프트가 표시되지 않음)

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

  • -R 22000 연결이 시작됩니다. R 이모 트 컴퓨터 (이 경우 remote.server.com)

    li의 포트 22000 >

  • 개인용 로컬 컴퓨터는 터널의 다른 쪽 끝이 localhost, 포트 11000

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

출처 : ssh 터널링에 대한 그림 가이드, 자습서, 방법 .

댓글

  • 귀와 입을 통해 ‘ 누가 말하고 누가 ‘ 듣고 있습니다!
  • 당신의 삽화가 마음에 듭니다!

답변

역 SSH 터널을 설정하는 동안 네트워크 인터페이스에 바인딩하는 방법은이 게시물 에 설명되어 있습니다. 다음은 두 개의 서로 다른 네트워크에있는 4 대의 컴퓨터가있는 예입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다