SSH 역터널링을 수행 중인데 터널에 연결할 수 없습니다.

SSH 역터널링을 수행 중인데 터널에 연결할 수 없습니다.

CGNAT를 통해 인터넷에 연결된 포트 80의 127.0.0.1에서 IIS를 실행하는 Windows 11 상자가 있습니다. Linode(VPS 공급업체)의 VPS도 있습니다. VPS의 IP 주소는 139.162.19.185입니다. VPS를 통해 인터넷상의 다른 곳에서 Windows 11 상자의 서버/포트에 연결하고 싶습니다.

관리자 모드에서 Windows 11 명령 프롬프트를 사용하여 아래 명령을 실행했습니다.

ssh -R 80:localhost:80 [email protected]

다음을 사용하여 VPS에서 SSH 터널에 액세스하려고 하면http://139.162.19.185:80, 연결이 거부되었지만 다음을 사용하여 로컬 호스트에 액세스하려고 하면http://127.0.0.1, IIS 시작 홈페이지가 보입니다.

/etc/ssh/sshd_config 파일을 확인했는데 GatewayPorts와 AllowTcpForwarding이 모두 활성화되어 있습니다.

업데이트:

netstat -tlnp의 결과입니다.

root@localhost:~# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      35027/sshd: root@pt
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      434/sshd: /usr/sbin
tcp6       0      0 ::1:80                  :::*                    LISTEN      35027/sshd: root@pt
tcp6       0      0 :::22                   :::*                    LISTEN      434/sshd: /usr/sbin
root@localhost:~#

컬의 결과는 다음과 같습니다.

root@localhost:~# curl http://127.0.0.1:80
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>
root@localhost:~#

편집해야 하는 구성 파일이 있습니까? Linode에 방화벽이 있는지 확인하기 위해 디버깅을 시도했습니다. apache2를 설치했는데 포트 80에서 제대로 작동하므로 포트 80이 차단되지 않습니다.

답변1

옵션 을 사용하는 방식은 -R원격 측이 루프백 인터페이스에만 바인딩되기를 원한다는 것을 의미합니다. 매뉴얼 페이지 에서 ssh:

     -R [bind_address:]port:host:hostport

     ...

             By default, TCP listening sockets on the server will be bound to the loopback interface only.  This may be overridden by
             specifying a bind_address.  An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on
             all interfaces.  Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see
             sshd_config(5)).

단순화하면 다음을 의미합니다.

  • -R port:host:hostport루프백에만 바인딩됩니다.
  • -R :port:host:hostport모든 인터페이스에 바인딩됩니다.
  • 뜻대로 -R *:port:host:hostport그리고-R 0.0.0.0:port:host:hostport

따라서 귀하의 상황에서는 다음 중 하나가 작동합니다.

ssh -R :80:localhost:80 [email protected]
ssh -R *:80:localhost:80 [email protected]
ssh -R 0.0.0.0:80:localhost:80 [email protected]

*문서 텍스트를 기반으로 이 동작을 설명하려는 원래 시도 아래에는 몇 가지 설명이 포함되어 있습니다.

바인딩 주소를 지정하지 않은 PORT:IP:PORT 구문을 사용했습니다.

specifying a bind_address위 설명의 내용은 :원격 포트(PORT:IP:PORT의 첫 번째 포트) 앞에 가 있다는 의미입니다. 귀하의 예에 있는 방식에는 no 가 없습니다. :이는 바인딩_주소를 지정하지 않았음을 의미하며 매뉴얼 페이지에 따르면 원격 측은 루프백 인터페이스(기본값)에만 바인딩됩니다. 모든 인터페이스에 바인드하려면 :실제 바인드 주소가 "빈 문자열"인 경우에도 바인드 주소를 지정해야 합니다(예: 원격 포트 앞에 a 추가). 이 경우에는 "빈 문자열" 또는 a가 작동하지만 루프백 주소에만 바인딩하는 것으로 제한되지 않도록 필수라는 *점을 명심하세요 !:

업데이트

@barlop의 의견 이후에 설명이 명확하지 않은 것 같아서 여기에서 단계별로 명확하게 설명하려고 노력하고 있습니다.

  • 옵션은 다음과 같이 정의됩니다 -R [bind_address:]port:host:hostport.
  • 전체 [bind_address:]부분은 선택 사항입니다. 존재하지 않는 경우 옵션은 형식을 가지며 -R port:host:hostport기본 동작이 적용됩니다 TCP listening sockets on the server will be bound to the loopback interface only.
  • 부분 [bind_address:]이 있으면 형식이 있다는 의미입니다 -R bind_address:port:host:hostport. 이제 첫 번째 부분 :은 더 이상 선택 사항이 아닙니다. 이 순간부터 bind_address여러 값을 사용할 수 있으며 가능한 값 중 하나는 실제로빈 문자열! 따라서 옵션에 콜론을 추가한다는 것은 bind_address이번에는 비어 있음에도 불구하고 a를 지정한다는 의미입니다(설명에 따르면 the remote socket should listen to all interfaces.

이것이 기본적으로 좀 더 명확해지기를 바라며 not specifying a bind_addressspecifying an empty string as bind_address가지 다른 것입니다! "빈 문자열"bind_address는 바인드 주소로 간주되며 :PORT:IP:PORT맨 왼쪽 콜론 앞에 주소에 대해 아무것도 쓰지 않고 구문을 사용하는 것을 나타냅니다.

다음은 테스트 결과입니다(다른 포트에서 수행했지만 효과는 동일함).

원격 시스템에서 SSHing 및 netstat -an 실행을 확인하세요.

gepa@localhost:~$ ssh -R :5555:localhost:5555 cloud1 netstat -an | grep :5555
tcp        0      0 0.0.0.0:5555            0.0.0.0:*               LISTEN     
tcp6       0      0 :::5555                 :::*                    LISTEN     

gepa@localhost:~$ ssh -R 5555:localhost:5555 cloud1 netstat -an | grep :5555
tcp        0      0 127.0.0.1:5555          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:5555                :::*                    LISTEN     

:를 생략하는 것과 비교하여 첫 번째 앞에 를 추가하면 5555원격 호스트가 모든 인터페이스를 수신하는 방법에 유의하세요 :.

그나저나, 빈 문자열 bin_address를 사용하지 않고 다음을 작성하는 것이 훨씬 더 명확합니다 $ ssh -R *:5555:localhost:5555 comp.0.0.0.0:80:localhost:80

또한 PORT:IP:PORT 구문이 127.0.0.1에 바인딩되는 이유는 보안상의 이유입니다. 따라서 로컬이 아닌 바인딩을 원하는 경우 와일드카드를 사용하거나 0.0.0.0을 지정하거나 LAN에서만 연결하는 경우 LAN 주소를 지정하는 등 매우 명확하게 지정하는 것이 좋습니다.

관련 정보