리버스 포트 터널링


59

내일 내 로컬 컴퓨터에서 실행중인 웹 사이트를 누군가에게 보여줘야합니다. 일반적으로 로컬 라우터에서 포트 포워딩을 통해이 작업을 수행하지만 하드웨어 고장 및 교체가 끔찍하기 때문에 현재 라우터에서 포트 포워딩을 수행 할 수 없습니다.

이 지연으로 인해 모든 것을 적절한 서버에 푸시하고 싶지는 않지만 SSH를 통해 포트를 외부 서버로 전달할 수 있습니까?

이전에 포트 터널링을 해봤지만 일반적으로 올바른 방법으로 수행합니다.

  • 원격 상자에 연결하고 포트 12345의 로컬 컴퓨터에 포트 12345가 표시되도록 요청합니다.
  • 원격 컴퓨터의 P12345에서 무언가를 시작합니다.
  • localhost를 통해 액세스 할 수 있습니다 :

내가 하고 싶은 것 :

  • 원격 PC에 연결 하고 로컬 P12345가 터널을 통해 로컬 P12345에서 항목을 가져 오도록 요청 하십시오.
  • P12345의 로컬 컴퓨터에서 무언가를 시작합니다.
  • 다른 사람이 remote : 12345에 액세스하여 내 로컬 호스트 : 12345를 볼 수 있습니다.

답변:


96

로컬 시스템 ( localhost)에서 포트 8000의 원격 호스트로 포트 80을 전달하는 명령 은 다음과 같습니다.

ssh -R 8000:localhost:80 oli@remote-machine

SSH 서버에 대한 추가 조정이 필요합니다 /etc/ssh/sshd_config.

Match User oli
   GatewayPorts yes

그런 다음 서버를 실행하여 구성을 다시로드하십시오 sudo reload ssh.

이 설정 GatewayPorts yes은 SSH가 와일드 카드 주소에서 포트 8000을 바인드하므로 공용 주소 remote-machine( remote-machine:8000) 에서 사용할 수있게됩니다 .

와일드 카드 주소의 모든 내용을 바인딩하지 않는 옵션이 필요한 경우로 변경 GatewayPorts yes하십시오 GatewayPorts clientspecified. 때문에 ssh기본적으로 루프백 주소에 바인딩, 당신은 빈을 지정할 필요가 bind_address와일드 카드 주소를 바인딩 :

ssh -R :8000:localhost:80 oli@remote-machine

:이전 8000경우 필수 GatewayPorts로 설정 clientspecified하고 공용 액세스를 허용 할 remote-machine:8000.

관련 수동 발췌문 :

ssh (1)

-R [bind_address :] port : host : hostport
원격 (서버) 호스트의 지정된 포트가 로컬 호스트의 지정된 호스트 및 포트로 전달되도록 지정합니다. 이것은 소켓이 원격 측의 포트를 청취하도록 할당하여 작동하며이 포트에 연결될 때마다 보안 채널을 통해 연결이 전달되고 로컬 시스템에서 호스트 포트 호스트 포트에 연결됩니다. 기본적으로 서버의 청취 소켓은 루프백 인터페이스에만 바인딩됩니다. bind_address를 지정하여이를 대체 할 수 있습니다. 빈 bind_address 또는 주소 '*'는 원격 소켓이 모든 인터페이스에서 수신해야 함을 나타냅니다. 원격 bind_address를 지정하면 서버의 GatewayPorts 옵션이 활성화 된 경우에만 성공합니다 (sshd_config (5) 참조).

sshd_config (5)

GatewayPorts
원격 호스트가 클라이언트에 전달 된 포트에 연결할 수 있는지 여부를 지정합니다. GatewayPorts를 사용하여 sshd가 원격 포트 전달이 비 루프백 주소에 바인드되도록 허용하여 다른 호스트가 연결할 수 있도록 지정할 수 있습니다. 인수는 원격 포트 전달을 로컬 호스트에서만 사용 가능하게하려면 '아니오', 원격 포트 전달을 와일드 카드 주소에 바인드하려면 'yes'또는 클라이언트가 주소를 선택할 수 있도록 'clientspecified'일 수 있습니다. 전달이 바인딩됩니다. 기본값은 '아니오'입니다.

또한보십시오:


7
GatewayPorts여기에 총알이있었습니다. 이 강력한 기술을 특정 사용자로 제한 할 수있는 버전을 찾았습니다.
Oli

1
혼란 스러웠던 것은 실제 ssh 명령을 실행하는 머신에 GatewayPorts가 설정되어 역방향 터널 (로컬)을 시작해야한다는 것입니다. 내 마음에 다른 쪽 끝 (원격)이 ​​연결을 수락 할 위치를 처리하는 것이 다소 논리적이 었습니다. 그 문제를 해결하기 위해 나이가 들었습니다.
Ars Magika

2
@ArsMagika 나는 당신을 이해하는지 잘 모르겠습니다. GatewayPorts는 ssh명령 을 실행하는 로컬 시스템이 아닌 SSH 서버에서 설정해야합니다 . 다른 클라이언트가 서버의 전달 된 포트와 통신 할 수 있는지 여부를 구성합니다.
Lekensteyn

이 솔루션의 단점 : 웹 서버의 액세스 로그에서 클라이언트의 IP 주소를 확인할 수 없습니다. 그 성가신을 해결할 수있는 방법이 있습니까?
Twonky

@Twonky 클라이언트의 정확한 IP 주소를 알 필요가없고 ( "localhost"가 아닌 원격 IP 주소 일 경우) 로컬 서버가 와일드 카드 주소를 수신하고있는 경우 (예 : 모든 주소에서 연결 수락), 그런 다음 -R :8000:127.0.1.1:80(또는 다른 127.x.x.x주소)로 전달을 시도 할 수 있습니다. 그렇지 않으면 아니요, 원격 IP 주소를 배울 수 없습니다.
Lekensteyn

14

서버에가 있으면 클라이언트에서 명령을 실행 한 후에 서버에서 GatewayPorts no실행하여 동일한 결과를 얻을 수 있습니다 . 그러면 포트 8001의 모든 인터페이스에서 서버의 루프백 포트 8000에 액세스 할 수 있습니다.ssh -g -L 8001:localhost:8000 oli@remote-machinessh -R

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