我試圖繞過我的 ISP 運營商級 NAT,但仍然能夠從外部存取我的 plex 伺服器。
我找到了兩個指南:
http://www.donaldsimpson.co.uk/2016/10/24/tunneling-out-of-carrier-grade-nat-cgnat-with-ssh-and-aws/
https://amoss.me/2017/05/port-forwarding-behind-a-carrier-grade-nat/
為了實現,我有一個由 digitalocean 託管的 ubuntu 16.04 VM,它有一個公共 IP。我可以從我的 plex 伺服器(也是 ubuntu 16.04)透過 ssh 連接到遠端數位海洋伺服器。
在我的 Plex 伺服器上執行以下命令:
ssh -nNTv -R 32400:localhost:32400 root@<public IP of remote host>
並讓它在螢幕上運行。
隧道成功。從遠端主機這裡是 netstat 和 nc -v 到環回介面:
root@Ubuntu1604:~/.ssh# nc -v 127.0.0.1 32400
Connection to 127.0.0.1 32400 port [tcp/*] succeeded!
root@Ubuntu1604:~/.ssh# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:32400 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:32400 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
root@Ubuntu1604:~/.ssh#
但正如您所看到的,它沒有監聽其公共 IP 除了環回之外唯一的其他活動介面是 eth0,它被分配了公共 IP 位址。因此,如果我嘗試訪問remote server public IP
:32400,我什麼都得不到。
如何讓我的遠端伺服器監聽 32400 eth0,同時仍將其轉發到我的本機伺服器:32400?
答案1
我已經有一個空的綁定位址,問題是我需要指定綁定到所有位址,如下所示:
ssh -nNTv -R 0.0.0.0:32400:localhost:32400 root@<public IP of remote host>
答案2
-R [bind_address:]port:host:hostport
[…]
預設情況下,伺服器上的偵聽套接字將僅綁定到環回介面。這可以透過指定
bind_address
.空bind_address
或位址*
表示遠端套接字應偵聽所有介面。只有在GatewayPorts
啟用了伺服器的選項(請參閱參考資料)時,指定遠端 bind_address 才會成功sshd_config(5)
。
因此,首先嘗試的最簡單的方法是指定一個空bind_address
:
-R :32400:localhost:32400
注意開頭的:
,它有差別。