題 如何讓ssh隧道向公眾開放?


好吧,回過頭來看 這個 問題,我正在運行命令

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

在Mac上。然而,正在進行隧道傳輸的港口並未公開發揮作用。我正在運行這樣的命令,以便可以在遠程計算機上打開本地端口。它在遠程計算機上的localhost上打開端口時確實有效,但是當我嘗試從本地計算機訪問遠程計算機的公共IP地址時,端口似乎沒有打開。我如何在IP上公開隧道以供任何人訪問?

編輯:好像遠程端只綁定在localhost而不是所有接口。

編輯2:客戶端是Mac OS X 10.6,服務器是Linux Mint,但它們都是OpenSSH。


140
2018-04-27 22:14


起源


公共知識產權是什麼意思?如果您嘗試通過路由器和Internet連接到本地計算機,大多數路由器將不允許這樣的環回。 - harrymc


答案:


如果你檢查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訪問 IPv4映射的IPv6地址 (不適用於Windows,OpenBSD)。 (你需要引號,因為 [::] 否則可以解釋為glob。)

注意 如果你使用OpenSSH sshd 服務器,服務器的 GatewayPorts 選項需要啟用 (調成 yes 要么 clientspecified為此工作(檢查文件 /etc/ssh/sshd_config 在服務器上)。否則(此選項的默認值為 no),服務器將始終強制端口僅綁定在回送接口上。


290
2018-05-06 06:11



哦,我的上帝工作了!!!!!我完成了100萬次!我忘記了 * 在bash中將提供文件,我需要 \* - Trevor Rudolph
是的,這正是我一直喜歡的原因 0.0.0.0  - 它只是IPv4,但它大部分時間都會這樣做:) - Stefan Seidel
GatewayPorts是解決了我的問題。 - Sunry
GatewayPorts = yes(在遠程sshd配置上)也為我修復了它 - Phil_1984_
“GatewayPorts yes”結束了我的一天,感謝@StefanSeidel - karser


編輯:

-g 適用於本地轉發端口,但您想要的是反向/遠程轉發端口,這是不同的。

你想要的是什麼 這個

基本上,在 example.com,設定 GatewayPorts=clientspecified 在 /etc/ssh/sshd_config

---以前(不正確)答案---

使用-g選項。從ssh的手冊頁:

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

34
2018-04-28 03:34



似乎沒有工作......它啟動但我無法遠程連接 - Trevor Rudolph
試試跑步 netstat -elnpt 從一個單獨的tty中找出哪些端口綁定到哪個地址。沒有 -g,一個端口應該綁定 127.0.0.1:PORT。同 -g,應該受到約束 0.0.0.0:PORT,這使它可以遠程訪問。 - snapshoe
pastebin.com/q6f4kJyd - Trevor Rudolph
GatewayPorts=clientspecified 要么 GatewayPorts clientspecified - Trevor Rudolph
我將它添加到客戶端或遠程? - Trevor Rudolph


這是我完成的答案:

我最終使用了 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


10
2017-10-29 12:09



我喜歡這樣一個事實,即我不需要處理sshd配置,而且我可以在沒有sudo的情況下完成所有這些操作。另外,我了解到socat的存在。謝謝! - BrutusCat


使用“網關端口”選項。

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

為了使用它,你可能需要添加“GatewayPorts yes“到你的服務器 /etc/ssh/sshd_config


8
2018-04-28 13:58



實際上這很有效。我所做的是我使用EC2實例作為我的REST服務器的轉發器。這樣,我不需要將我的服務器粘在DMZ中,而且我不需要公共IP。有趣的是,對於我創建的第一個EC2實例,ssh -R remote_port:localhost:port xxx @ ec2xxx工作得很好,但後來由於某種原因我不得不創建另一個實例,從那時起,我總是得到:連接拒絕了。使用tcpdump查看我得到的內容並沒有太多信息。 -g加上GatewayPorts是的訣竅。 - E.T


如果您不想或也可以更改/ 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"

8
2017-08-01 22:37



這實際上可以繞過轉發規則! - Michael Schubert
喜歡這個解決方案當您不希望更改計算機上的配置時,可以使用很好的解決方法 - Grezzo


如果你想把配置放在你身上 ~/.ssh/config 而不是使用命令行參數,你可以嘗試類似的東西

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

記得讓你遠程主機的防火牆允許連接8080並確保 GatewayPorts 你的選擇 /etc/ssh/sshd config未設置為 no


0
2017-08-26 15:50