내가 이해하는 바와 같이 방화벽 (기본 설정 가정)은 이전에 나가는 트래픽이없는 들어오는 모든 트래픽을 거부합니다.
기준 ssh 연결 반전 및 쉬운 SSH 터널링 , 리버스 SSH 터널링을 사용하여 성가신 방화벽 제한에 대해.
원격 컴퓨터에서 쉘 명령을 실행하고 싶습니다. 원격 시스템에는 자체 방화벽이 있으며 추가 방화벽 (라우터) 뒤에 있습니다. 192.168.1.126 (또는 이와 유사한 것)과 같은 IP 주소가 있습니다. 방화벽 뒤에 있지 않고 인터넷에서 볼 수있는 원격 시스템의 IP 주소 (192.168.1.126 주소 아님)를 알고 있습니다. 또한 다른 사람에게 ssh (something)
를 실행하도록 요청할 수 있습니다. 먼저 원격 시스템의 루트로 로그인하십시오.
누군가 방화벽 (로컬 및 원격 시스템 “방화벽과 방화벽 사이의 추가 방화벽)을 우회하기 위해 역 SSH 터널링이 어떻게 작동하는지 단계별로 설명해 주시겠습니까?
스위치의 역할은 무엇입니까 (-R
, -f
, -L
, -N
)?
댓글
- 관련 (방법) : 연결 컴퓨터에 대한 역방향 SSH 연결을 어떻게 구성 할 수 있나요?
답변
나는 시각화를 통해 이런 종류를 설명하는 것을 좋아합니다. 🙂
SSH 연결을 튜브로 생각하십시오. 큰 튜브. 일반적으로이 튜브를 통해 원격 컴퓨터에서 셸을 실행합니다. 셸은 가상 터미널 (tty)에서 실행됩니다.하지만이 부분은 이미 알고 있습니다.
터널을 튜브라고 생각하면됩니다. 여전히 큰 SSH 연결을 가지고 있지만 -L 또는 -R 옵션을 사용하면 내부에 작은 튜브를 설정할 수 있습니다.
모든 튜브에는 시작과 끝이 있습니다. 큰 튜브, SSH 클라이언트로 시작하여 연결 한 SSH 서버에서 끝나는 SSH 연결입니다. 모든 작은 튜브에는 동일한 엔드 포인트가 있습니다. 단, “start”또는 “end”의 역할은
또는 -R
(각각)을 사용하여 생성합니다.
(당신은 말하지 않았지만 저는 방화벽 뒤에있는 “원격”컴퓨터가 NAT (Network Address Translation)를 사용하여 인터넷에 액세스 할 수 있다는 사실을 확인하십시오. 이것은 일종의 중요하므로이 가정이 거짓이면 수정하십시오.)
터널을 만들 때 광고를 지정합니다. 응답 할 드레스와 항구, 그리고 배달 될 주소와 항구. -L
옵션은 터널의 로컬 측 (클라이언트를 실행하는 호스트)에서 응답하도록 터널에 지시합니다. -R
옵션은 터널이 원격 측 (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
remotehostname
및 remoteusername
을 적절하게 조정합니다. remoteusername
필드는 원격 서버의 사용자 이름과 일치해야하지만 remotehostname
는 사용자에게 적합한 호스트 이름이 될 수 있으며 확인할 수있는 항목과 일치 할 필요는 없습니다.
참고 항목 :
댓글
- ssh -D는 어떻습니까? 같은 방법으로 설명해주세요.
- SOCKS 프록시는 터널과 다릅니다. 사용 방법에 대한 질문이 있으면 문의 하세요.
- I ‘ m 서버, 클라이언트, 로컬 머신, 원격 머신, 호스트, yourpublichost, localhost, remotehostname과 같은 용어의 느슨한 사용으로 인해이 설명을 따르는 데 매우 어려움을 겪고 있습니다. 이러한 느슨하고 정의되지 않은 용어를 사용하면 누군가 이것을 설정하는 데 최대 8 대의 컴퓨터가 필요하다고 가정 할 수 있습니다. 나는 다른 모든 측면에서 매우 좋은 설명처럼 보이기 때문에 이것을 진술합니다. 용어를 줄이고 정의하십시오.
- @ Rucent88, 저는 ‘ 어떤 축소가 가능한지 잘 모르겠습니다. 클라이언트는 서버에 대한 연결을 설정합니다. ‘ 네트워킹의 전 세계에서 사용되는 일반적인 용어입니다. 로컬 및 원격 시스템은 자명 해 보입니다. 설명서를 읽은 후 ‘ SSH 또는 일반 Unix 용어가 혼동되는 경우 ‘ ‘ 여기에있을 수있는 모든 질문에 기꺼이 대답 할 사람을 찾는 데 어려움이 없습니다.
- @ghoti It ‘는 정말 혼란 스럽습니다. 원격 시스템은 상대적입니다. 직장에 앉으면 집에있는 컴퓨터가 리모컨이고, 집에 앉으면 직장 컴퓨터가 리모컨이됩니다. 터널링에 대해 말할 때 서버와 클라이언트도 혼란 스럽습니다. 예를 들어 ssh -R을 사용하여 직장에서 집에 연결하는 경우. localhost를 연결하여 가정용 컴퓨터에서 직장에 연결합니다. 따라서 소켓 관점에서 서버는 가정용 컴퓨터 자체입니다. 하지만 논리적으로 저는 직장 컴퓨터에 연결했습니다. ‘ 혼란 스럽습니다.
답변
일부 스케치
ssh tunnel 명령이 입력 된 머신은 »your host«라고합니다.
소개
-
로컬 :
-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
에 연결하고 모든 연결 시도를 로컬sourcePort
를forwardToHost
라는 시스템에서onPort
포트로,connectToHost
컴퓨터에서 연결할 수 있습니다. -
원격 :
-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
이 명령은 자신의 localhost
12345의 / 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의 간단한 웹 서버)를 시작합니다. 그런 다음 노란색 컴퓨터의 웹 브라우저에서 URLhttp://localhost:1234
를 열면 작동하는 것을 볼 수 있습니다. - @erik, 아, 혼란스러운 부분은 내 눈이 나쁨-‘ 명령에서
remotehost
전에 공백을 보지 못했습니다. 자세히 살펴보면 다이어그램이 실제로 선택적 bind_address를 전혀 다루지 않는 것을 ‘ 보았습니다. 혼동을 드려 죄송합니다. - @briankip 물론입니다. 최소한 방화벽 뒤의 컴퓨터에 ssh 연결을 설정하려면 (터널을 통해 또는 방화벽이 허용하는 경우 직접). 예 : 방화벽 컴퓨터에서 작성하는 ssh 명령은 터널 만 열지 만 ssh-daemon / -server로 시작하거나 작동하지 않습니다 . 다음 질문은 루트 권한없이 sshd를 시작하는 방법 입니다 (문제인 경우). 🙂
Answer
ssh 터널링은 추가 트래픽을 보내기 위해 이미 설정된 ssh 연결을 사용하여 작동합니다.
원격 서버에 연결할 때 일반적으로 일반적인 사용자 상호 작용을위한 1 개의 채널 만 있습니다 (또는 STDIN / STDOUT / STDERR을 별도로 고려하는 경우 3 개의 채널). 언제든지 로컬 또는 원격 ssh 프로세스는 기존 연결에서 추가 채널을 열 수 있습니다. 그런 다음이 채널은 터널 트래픽을 송수신합니다. 트래픽을 보내거나받을 때 ssh 프로세스는 단순히 “이 트래픽은 채널 foobar 용입니다”라고 말합니다.
기본적으로 다음과 같이 작동합니다.
- ssh에 수신을 시작하도록 지시합니다. 포트 XXXX에서 수신 된 모든 트래픽을 터널링 한 다음 포트 ZZZZ에서 YYYY로 설정합니다.
- 로컬 ssh는 포트 XXXX (일반적으로
127.0.0.1
, 변경 가능). - 일부 응용 프로그램은 로컬 시스템의 XXXX 포트에 대한 연결을 엽니 다.
- 로컬 ssh는 원격 ssh에 대한 채널을 열고 “모든 트래픽 이 채널에서 YYYY : ZZZZ로 이동
- 원격 ssh는 YYYY : ZZZZ에 연결하고 “OK, 채널이 열려 있습니다”를 다시 보냅니다.
- 이제 연결을 통해 포트로 전송되는 모든 트래픽 로컬 시스템의 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:11000
–remote.server.com
는 터널의 다른 쪽 끝이localhost
, 포트11000
p인지 확인합니다. >
출처 : 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 터널링에 대한 그림 가이드, 자습서, 방법 .
댓글
- 귀와 입을 통해 ‘ 누가 말하고 누가 ‘ 듣고 있습니다!
- 당신의 삽화가 마음에 듭니다!
답변
역 SSH 터널을 설정하는 동안 네트워크 인터페이스에 바인딩하는 방법은이 게시물 에 설명되어 있습니다. 다음은 두 개의 서로 다른 네트워크에있는 4 대의 컴퓨터가있는 예입니다.