
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_address
두 specifying 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 주소를 지정하는 등 매우 명확하게 지정하는 것이 좋습니다.