1. 程式人生 > >ssh反向代理實現NAT內網穿透[ssh版teamviewer]

ssh反向代理實現NAT內網穿透[ssh版teamviewer]

由於實驗室伺服器沒有公網IP,如果在校外網的話只能通過teamviewer遠端桌面連線,然而teamviewer的資料傳輸是基於影象的,反應太慢了,所以一直在尋找ssh版的teamviewer,經過谷歌,發現只需要一臺公網伺服器作為中轉站,就可以實現在任何地方登入處於內網的實驗室伺服器,前提是實驗室伺服器要能正常連線外網。

SSH反向代理

假設有兩臺伺服器A和B:A處於內網無公網IP,B是一個雲主機如阿里雲有公網IP,現在手頭上有一臺處於校外網的電腦C,想用ssh登入伺服器A完成一些騷操作,怎麼弄呢?很簡單,原理是讓B建立對A的臨時ssh反向代理通道,然後用C登入B就可以直接ssh進入A了

  1. 首先在A上操作,使用以下語句向B發起反向代理請求(最好root執行),這裡會要求輸入B對應使用者的密碼,執行成功後,會在B的7280埠映射向A的ssh請求(埠22),通過netstat -tnlpps aux | grep ssh檢查A上這條語句執行是否成功

    ssh -fCNR 7280:localhost:22 aliyun_user@aliyun_IP

    具體解釋:

    ssh -fCNR [B機器IP或省略]:[B機器埠]:[A機器的IP]:[A機器埠] [登陸B機器的使用者名稱@伺服器IP]
  2. 然後登入B,若上面語句執行成功的話,我們用netstat -tnlp能檢查到反向代理在埠7280的程序:

    root@aliyun_IP:/home/peng# netstat -tnlp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.1.1:5432          0.0.0.0:*               LISTEN      822/postgres
    tcp        0      0 127.0.0.1:5432          0
    .0.0.0:* LISTEN 822/postgres tcp 0 0 127.0.0.1:2015 0.0.0.0:* LISTEN 892/expressvpnd tcp 0 0 0.0.0.0:40101 0.0.0.0:* LISTEN 29955/sshd: peng tcp 0 0 0.0.0.0:7280 0.0.0.0:* LISTEN 30270/sshd: peng tcp 0 0 0.0.0.0:7281 0.0.0.0:* LISTEN 29955/sshd: peng tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 29233/sshd
  3. 測試登入A:先用C登上B,然後在B上執行以下程式碼即可,通過-p指定反向代理的埠7280,ideal是A上的使用者,這裡需要輸入A上此使用者的密碼,若成功,那麼到此就OK了。

    peng@aliyun_ip:~$ ssh -p 7280 ideal@127.0.0.1
    ideal@127.0.0.1's password:
    Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-127-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    95 packages can be updated.
    0 updates are security updates.
    
    *** System restart required ***
    Last login: Mon Jul 16 11:49:19 2018 from 127.0.0.1
  4. autossh設定(opt):上面成功的前提是A和B之間的ssh不斷開,一旦斷開,還是需要用teamviwer去A上繼續執行上述命令建立反向代理,那麼我們可以使用autossh工具讓那ssh斷開後自動連線,具體來說在A上安裝autossh工具,然後執行以下語句即可,-M是指定另外一個埠7281用來監測ssh的連線情況的,同樣我們需要檢查A和B上的程序情況,我們更可以把下面語句加入開機自動啟動的指令碼,當然所有前提都是A可以連線外網。

    autossh -M 7281 -fCNR 7280:localhost:22 aliyun_user@aliyun_IP

Reference