1. 程式人生 > 其它 >藉助公有云伺服器內網穿牆ssh訪問內網伺服器

藉助公有云伺服器內網穿牆ssh訪問內網伺服器

做內網需要用的Linux伺服器(A)ubuntu系統,只分配了內網IP,可以連線外網(通過手機熱點wifi或者有線網口),沒有辦法設定路由器。

A的使用者名稱:[email protected]

現在用家裡的電腦C通過ssh連線到A上,當然有TeamViewer,向日葵等桌面連線軟體,但傳輸畫面比較卡,故想ssh連線。網路上有花生殼、net123等提供穿牆服務,可以實現ssh,但都比較貴。

自己在騰訊雲上申請了虛擬伺服器B,A、C可以通過B直接實現訪問。具體過程如下:

step1:申請騰訊雲伺服器https://cloud.tencent.com/act/seckill?from=13338

買了一個99元一年的虛擬伺服器。

使用者名稱 ubuntu,埠22,IP:123.123.123.123,密碼

在個人電腦C上可以通過ssh終端實現訪問

ssh -p 22 [email protected]

step2:配置雲伺服器B,使其埠訪問開放

1>.修改B伺服器的sshd設定 #vi /etc/ssh/sshd_config

2>把GatewayPorts開啟(去掉前面的#號註釋): GatewayPorts yes

3>存檔後退出,並重新啟動sshd ,#service sshd restart

step3: 配置內網伺服器A,建立A到B的ssh方向代理,使用autossh實現更好,在A上操作,參考https://www.cnblogs.com/kwongtai/p/6903420.html

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

1>安裝autossh, sudo apt install autossh

2>B到A的ssh代理命令,需要輸入

autossh -M 7291 -fCNR 7290:localhost:22 [email protected] 

autossh的引數與ssh的引數是一致的,但是不同的是,在隧道斷開的時候,autossh會自動重新連線而ssh不會。另外不同的是我們需要指出的-M引數,這個引數指定一個埠,這個埠是外網的B機器用來接收內網A機器的資訊,如果隧道不正常而返回給A機器讓他實現重新連線。

step4:建立從B到A的ssh正向代理,在B上操作

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

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

這裡的B機器的埠和上面的B機器的埠是一致的,埠1234的也是B機器的。

ssh -fCNL *:1234:localhost:7290 localhost

在B伺服器上嘗試以下命令:netstat -a |grep 7290,如果有返回如下介面,則證明成功

在B伺服器上,執行以下命令,則能ssh訪問A伺服器 ,1234 為B上的埠,轉發到A的7290

ssh -p 1234 [email protected]  ,輸入nameA在內網的密碼

step5:個人電腦C測試

完成之後就可以,實現在通過雲伺服器埠1234,對映到內網伺服器的埠7290。

在個人電腦C上執行以下命令,

ssh -p 1234 A的使用者名稱@B的公網IP地址。即
ssh -p 1234 [email protected],輸入nameA的密碼

step6:內網伺服器A免密登入

建立A到B的反向代理時需要輸入密碼,為此,要建立A到B的免密碼ssh訪問。

1>在A操作,在A上生成金鑰檔案,ssh-keygen -t rsa

將會生成金鑰檔案和私鑰檔案 id_rsa,id_rsa.pub(如果用dsa則生成id_dsa,id_dsa.pub)

生成位置在/home/user/.ssh/資料夾下(我用的是user使用者所以在root下,生成過程會有提示檔案位置),.ssh 是隱藏資料夾 使用 ls -a檢視

2>在A操作,將公鑰放到伺服器指定位置

將公鑰複製到雲伺服器B的root使用者下的.ssh資料夾(用哪個使用者登入就複製到哪個使用者下的.ssh資料夾下)

scp /home/user/.ssh/id_rsa.pub [email protected]:/home/ubuntu/.ssh/

3>在B操作,安裝公鑰

登入到雲伺服器B上 cd /home/ubuntu/.ssh/

cat id_rsa.pub >> authorized_keys

step7:實現內網伺服器A開機自啟反向代理。

1>要在內網伺服器A開機自啟執行如下命令:autossh -M 7291 -fCNR 7290:localhost:22 [email protected]

A的系統是ubuntu18.04,為此,要新建/etc/rc.local,參考:https://blog.csdn.net/wuspeng/article/details/108462529

第一步:sudo vi /lib/systemd/system/rc.local.service, 文字末端新增以下內容

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

第二步:ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/rc.local.service

第三步:sudo chmod 0755 /etc/rc.local

第四步:sudo vi /etc/rc.local,新增需要的開啟執行的命令/或指令碼

autossh -M 7291 -fCNR 7290:localhost:22 [email protected]

2>使內網伺服器A的root使用者能後無密碼訪問,copy user下面相關金鑰檔案到root下面

參考https://blog.csdn.net/xiao_huocai/article/details/103192258

cp /home/user/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub
cp /home/user/.ssh/id_rsa /root/.ssh/id_rsa

step8:重啟內容內網伺服器A

ps aux |grep autossh ,看是否自動反向ssh到B

在個人電腦C上,連線A

ssh -p 1234 [email protected],,輸入nameA的密碼,成功。