SSH 터널을 공개적으로 공개하는 방법은 무엇입니까?


174

글쎄, 질문을 다시 언급 하면 명령을 실행하고 있습니다.

ssh -R 8080:localhost:80 -N root@example.com

Mac에서. 그러나 터널로 연결되는 포트는 공개적으로 작동하지 않습니다. 원격 컴퓨터에서 로컬 포트를 열 수 있도록 명령을 실행하고 있습니다. 원격 컴퓨터의 로컬 호스트에서 포트를 열 때 작동하지만 로컬 컴퓨터에서 원격 컴퓨터의 공용 IP 주소에 액세스하려고하면 포트가 열려 있지 않은 것 같습니다. 누구나 액세스 할 수 있도록 IP에서 터널을 공개하려면 어떻게해야합니까?

편집 : 원격 측은 모든 인터페이스가 아닌 로컬 호스트에서만 바인딩되는 것처럼 보입니다.

편집 2 : 클라이언트는 Mac OS X 10.6이고 서버는 Linux Mint이지만 둘 다 OpenSSH입니다.


퍼블릭 IP 란 무엇입니까? 라우터를 통해 인터넷을 통해 로컬 컴퓨터에 연결하려는 경우 대부분의 라우터는 이러한 루프백을 허용하지 않습니다.
harrymc

답변:


351

ssh 매뉴얼 페이지를 확인하면 다음 구문을 -R읽습니다.

-R [ bind_address :] 포트 : 호스트 : hostport

bind_address생략 하면 (예에서와 같이) 포트가 루프백 인터페이스에서만 바인드됩니다. 모든 인터페이스에 바인딩하려면 다음을 사용하십시오.

ssh -R \*:8080:localhost:80 -N root@example.com

또는

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

또는

ssh -R "[::]:8080:localhost:80" -N root@example.com

첫 번째 버전은 모든 인터페이스에 개별적으로 바인딩됩니다. 두 번째 버전은 일반 IPv4 전용 바인드를 작성하므로 IPv4를 통해 모든 인터페이스에서 포트에 액세스 할 수 있습니다. 세 번째 버전은 기술적으로 첫 번째 버전과 동일하지만 단일 바인딩 만 생성합니다. ::즉, 기본적으로 IPv6을 통해 및 IPv4로 매핑 된 IPv6 주소 를 통해 IPv4를 통해 포트에 액세스 할 수 있습니다 (Windows, OpenBSD에서는 작동하지 않음) . ( [::]그렇지 않으면 따옴표 로 해석 될 수 있으므로 따옴표가 필요합니다 .)

OpenSSH sshd서버 를 사용GatewayPorts 하는 경우 서버 옵션을 활성화 ( yes또는로 설정) 해야 서버에서clientspecified 파일 /etc/ssh/sshd_config을 확인할 수 있습니다 . 그렇지 않으면 (이 옵션의 기본값은 no) 서버는 항상 포트를 루프백 인터페이스에만 바인드합니다.


12
OH MY GOD IT 효과 !!!!! 나는 그 백만 번 정확히 해냈습니다! 난 그냥 *bash에서 파일을 줄 것이라는 점 을 잊어 버렸습니다.\*
Trevor Rudolph

4
예, 그것이 제가 항상 선호하는 이유입니다 0.0.0.0-IPv4 전용이지만 대부분의 시간을 할애합니다 :)
Stefan Seidel

34
예 GatewayPorts 내 문제를 해결했습니다.
Sunry

4
GatewayPorts = 예 (원격 sshd 구성에서) 나를 위해 수정했습니다
Phil_1984_

3
"GatewayPorts yes"덕분에 @StefanSeidel
karser

37

편집하다:

-g 로컬 전달 포트에는 작동하지만 원하는 역방향 / 원격 전달 포트는 다릅니다.

당신이 원하는 것은 이것 입니다.

기본적으로에 example.com설정 GatewayPorts=clientspecified되어 /etc/ssh/sshd_config있습니다.

--- 이전 (잘못된) 답변 ---

-g 옵션을 사용하십시오. ssh 매뉴얼 페이지에서 :

-g     Allows remote hosts to connect to local forwarded ports.

작동하지 않는 것 같습니다 ... 시작하지만 원격으로 연결할 수 없습니다
Trevor Rudolph

2
netstat -elnpt별도의 tty에서 실행 하여 어떤 포트가 어떤 주소에 바인딩되어 있는지 알아보십시오. 이 없으면 -g포트가 바인딩되어야합니다 127.0.0.1:PORT. 를 사용하면 -g에 바인딩되어 0.0.0.0:PORT원격으로 액세스 할 수 있습니다.
snapshoe


2
GatewayPorts=clientspecified또는GatewayPorts clientspecified
Trevor Rudolph

클라이언트 나 원격에 추가합니까?
Trevor Rudolph

14

다음은 완성 된 답변입니다.

내가 사용하는 결국 ssh -R ...터널링 및 사용하여 socat네트워크 트래픽을 리디렉션에 대한 그 위에 127.0.0.1:

터널이 127.0.0.1에 바인딩되었습니다. ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat : mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

다른 옵션은 그 위에 로컬 전용 터널을 만드는 것입니다. 그러나 나는 이것이 훨씬 느립니다.

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


나는 sshd 구성을 처리 할 필요가 없으며 sudo없이 모든 것을 할 수 있다는 사실을 좋아합니다. 또한 나는 socat이 존재한다는 것을 배웁니다. 감사!
BrutusCat

+ 좋아요 나는 ssh에게 성공하지 않고 0.0.0.0에 바인딩하도록 지시했다. 다음 * 구문을 보았고, 주사위는 없었다. sshd 구성의 보안 기능 또는 허용되지 않는 보안 기능 일 수 있습니다. 마침내이 게시물을보고 socat훌륭하게 일했습니다. 내 뒷주머니에 넣는 것이 매우 유용합니다.]
Jaime

10

/ etc / ssh / sshd_config를 변경하지 않거나 변경할 수없는 경우 이중 전달을 사용할 수도 있습니다.

먼저 원격 시스템의 루프백 장치에서 임시 포트 (예 : 10080)로 전달한 다음 로컬 전달을 사용하여 모든 인터페이스에서 포트 10080을 80으로 리디렉션하십시오.

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
이것은 실제로 전달 규칙을 우회하는 데 효과적입니다!
Michael Schubert

이 솔루션을 좋아하십시오. 머신의 설정을 변경하고 싶지 않은 경우 훌륭한 해결 방법
Grezzo

8

"게이트웨이 포트"옵션을 사용하십시오.

ssh -g -R REMOTE_PORT:HOST:PORT ...

이를 사용하려면 GatewayPorts yes서버에 " "를 추가해야합니다 /etc/ssh/sshd_config.


실제로 이것은 효과가있었습니다. 내가하는 일은 EC2 인스턴스를 REST 서버의 전달자로 사용한다는 것입니다. 이 방법으로 서버를 DMZ에 고정시킬 필요가 없으며 공용 IP가 필요하지 않습니다. 재미있게도, 내가 만든 첫 번째 EC2 인스턴스로 ssh -R remote_port : localhost : port xxx @ ec2xxx는 정상적으로 작동했지만 나중에 어떤 이유로 나중에 다른 인스턴스를 만들어야했고 그 시점부터 항상 얻었습니다. 거절했다. tcpdump를 사용하여 내가 얻은 것을 보았고 많은 정보가 없었습니다. -g plus GatewayPorts가 트릭을 수행했습니다.
동부 표준시

1

점프 호스트 는 OpenSSH에 상당히 최근에 추가 된 것입니다. 이를 위해서는 중간에 대한 SSH 액세스가 필요하지만 추가 구성없이 작동해야합니다.

ssh -J root@example.com remoteuser@localhost -p 8080

이 명령은 SSH가 먼저 사용자 이름으로에 연결 root@example.com한 다음 해당 시스템에서 포트 8080 localhost(즉, 점프 호스트에서 원격 호스트로 터널링 된 포트)에 연결을 시작하도록 지시합니다 remoteuser.


0

~/.ssh/config명령 행 매개 변수를 사용하는 대신 구성을 넣으려면 다음과 같이 시도하십시오.

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

원격 호스트의 방화벽에서 8080으로의 연결을 허용하고 구성 GatewayPorts옵션 /etc/ssh/sshd이로 설정되어 있지 않은지 확인 하십시오.no

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.