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

小北小白發表於2020-12-08

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

A的使用者名稱:nameA@192.168.109.11,

現在用家裡的電腦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 ubuntu@123.123.123.123  

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 ubuntu@123.123.123.123 

    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  nameA@123.123.123.123    ,輸入nameA在內網的密碼

step5:個人電腦C測試

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

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

ssh -p 1234 A的使用者名稱@B的公網IP地址。即
ssh -p 1234 nameA@123.123.123.123,輸入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 ubuntu@123.123.123.123:/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 ubuntu@123.123.123.123 

     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 ubuntu@123.123.123.123 

           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 nameA@123.123.123.123,,輸入nameA的密碼,成功。

 

 

            

       

             

 

        

 

 

 

 

相關文章