1. 程式人生 > >內網穿透 - SSH反向代理

內網穿透 - SSH反向代理

SSH反向代理有著很廣泛的實際應用,

例項描述:
本人在家庭區域網放置有一個樹莓派主機(無公網ip),正常情況下只能在家庭區域網內通過
ssh連線這臺樹莓派主機,但如果本人想在其他地方(非本地區域網)對它進行遠端登陸,則需要進行SSH反向代理。

如下圖示例,我的樹莓派主機A可以ping通我的公網主機B(有公網IP),遠端操控的主機C也可以ping通我的公網主機B,主機A和C之間是無法直接連通,它們分屬兩個區域網。
在這裡插入圖片描述

SSH有個強大的功能就是埠轉發,那麼,我們可以利用ssh的埠轉發功能實現SSH反向代理登陸。如下操作:

建立A機器到B機器的反向代理,
具體指令為:

ssh -fCNR [B機器IP或省略]:[B機器埠]:[A機器的IP]:[A機器埠] [登陸B機器的使用者名稱@伺服器IP] 

在這裡我使用了B機器的7280埠,以及A機器的22埠,按照上面的指令就是這樣子的操作

ssh -fCNR 7280:localhost:22 [email protected]

檢驗是否已經啟動了可以使用ps aux | grep ssh指令來檢視:

建立B機器的正向代理,用來做轉發,具體指令為

ssh -fCNL [A機器IP或省略]:[A機器埠]:[B機器的IP]:[B機器埠] [登陸B機器的使用者名稱@B機器的IP]
按照第3那裡輸入的指令,這裡的B機器的埠和上面的B機器的埠是一致的,埠1234的也是B機器的。

ssh -fCNL *:1234:localhost:7280 localhost

檢驗是否已經啟動了可以使用ps aux | grep ssh指令來檢視:

至此我們都配置好了AB機器,那麼我們就可以從一部外網的電腦登陸到內網裡面去啦。鑑於我目前的電腦在內網,而伺服器都是外網的(也就是配置的B機器),所以可以通過B機器連線到我內網的A中,具體指令為:

ssh -p 1234 [email protected] 

在此-p引數為指定登陸的IP,我們在上面指定了1234埠為轉發埠,故用1234埠登陸,然後hostname是內網A機器的使用者名稱,123.123.123.123為外網B機器的IP地址。

用autossh建立穩定隧道
以上步驟建立的SSH反向代理隧道是不穩定的,一旦斷掉就會非常麻煩,需要在A/B機器上重新建立連結,如果說你在只能操作另外的C機器的環境而無法控制A/B機器,那麼你將無法重建隧道。

centos7上沒有預設安裝autossh的,所以使用以下命令安裝:

yum install autossh

來看看具體的autossh的指令為

autossh -M 7281 -fCNR 7280:localhost:22 [email protected] 

=================================================
Tips: SSH反向代理也可以應用到從公網訪問區域網的web服務,實現內網穿透,只要將埠轉發對映到80埠即可。