SSH反向連接及Autossh


參考文章

http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html

接觸Linux恐怕對SSH再熟悉不過了,還有scp,sftp各種方便的功能,一般的使用都需要ip:port(如果不是默認22的話),但有些情況比較特殊,就是想連接一台內網主機(比如公司內網,當然你肯定做不了Port Forwarding,除非你想在公司防火牆上拆個洞)。

稍懂一點網絡的童鞋會明白,Internet上去主動連接一台內網是不可能的,一般的解決方案分兩種,一種是端口映射(Port Forwarding),將內網主機的某個端口Open出防火牆,相當於兩個外網主機通信;另一種是內網主機主動連接到外網主機,又被稱作反向連接(Reverse Connection),這樣NAT路由/防火牆就會在內網主機和外網主機之間建立映射,自然可以相互通信了。但是,這種映射是NAT路由自動維持的,不會持續下去,如果連接斷開或者網絡不穩定都會導致通信失敗,這時內網主機需要再次主動連接到外網主機,建立連接。

實例:

 

 

公司要建立反向連接,之前沒有接觸過,所以安裝autossh的時候有點小心,但在公司實驗的時候總是出現問題,總結下問題

 autossh反向隧道本質上還是ssh連接,現在目標是A服務器通過ssh秘鑰登錄B服務器,免密碼連接。建立測試A----ssh連------>B,成功

A遠程設備服務器地址:192.168.1.111

B本地服務器地址:192.168.1.112

 現建立反向隧道,先安裝autossh,寫腳本

#!/bin/bash
/usr/local/bin/autossh -M15678 -NfR 1234:localhost:22 root@www.xxxxx.com -p4321

  將B服務器的4321端口映射到22接入端口,默認為22端口。

  1234為A服務器的映射端口,在公司連接遠程內網A的方式為192.168.1.112:1234

  若重啟后,不能遠程連接A,可以在B服務器上netstat -lnpt | grep 1234,確定B服務器端沒有被進程占用,若占用kill掉進程,然后就能遠程連接A了

主要原因還是因為autossh連接不穩定造成的

總結概括就是A、B都要kill掉ssh相關進程,A遠程設備服務器ps -ef | grep ssh

B服務器 

 

 

autossh -M 5678 -CqTfnN -D 192.168.0.2:7070  freeoa@remote-host

參數解釋:
-M為autossh參數, -CqTfnN -D 為ssh參數

-M 5678 : 負責通過5678端口監視連接狀態,連接有問題時就會自動重連
-C  :啟動數據壓縮傳輸
-q  :安靜模式運行,忽略提示和錯誤
-T  :不占用shell
-f  :后台運行
-n  :配合 -f 參數使用
-N  :不執行遠程命令,專為端口轉發度身打造
-D 192.168.0.2:7070  :指定一個本地機器 “動態的“ 應用程序端口轉發,如果不加IP地址,默認只監聽127.0.0.1

 

1、實際操作

A要控制B

A主機:外網,ip:123.123.123.123,sshd端口:2221

B主機:內網,sshd端口:2223

無論是外網主機A,還是內網主機B都需要跑ssh daemon

1.1.首先在B上執行

ssh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221

這句話的意思是將A主機的1234端口和B主機的2223端口綁定,相當於遠程端口映射(Remote Port Forwarding)。

這里每次需要輸入A主機user1的登陸密碼,后面會講到解決辦法

1.2.這時在A主機上sshd會listen本地1234端口

$ ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:1234 *:*

1.3.像平時一樣連接到A主機的1234端口就可以控制內網B主機了

$ ssh localhost -p1234

 

2.一開始提到,這種反向連接(Reverse Connection)不穩定,可能隨時斷開,需要內網主機B再次向外網A發起連接,這時需要個“朋友”幫你在內網B主機執行這條命令。它就是Autossh。

在此之前還要解決之前的一個問題,那就是每次內網主機B連接外網主機A時都需要輸入密碼,這個問題ssh本身是提供另外一種驗證方式——通過密鑰驗證用戶身份,實現自動登錄。

 

2.1.在內網B主機上生產公鑰和私鑰

$ ssh-keygen
...(一直按Enter,最后在~/.ssh/下生成密鑰)
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts

 

2.2.復制B主機上生成的id_rsa.pub公鑰到外網A主機上,並將內容加入到~/.ssh/authorized_keys中

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

試下,內網B主機連接外網A主機,就不再輸入密碼驗證了

補充:今天了解到ssh-copy-id這個命令,上面這個操作就變的簡單了

$ ssh-copy-id user1@123.123.123.123

 

2.3.再來看看Autossh的用法

$ autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221

  /usr/local/bin/autossh -M15678 -NfR 20191:localhost:22 root@www.xxxxx.com.cn -p8022

比之前的命令添加的一個-M 5678參數,負責通過5678端口監視連接狀態,連接有問題時就會自動重連,去掉了一個-f參數,因為autossh本身就會在background運行。

 

3.終極方案:當重啟內網B主機,誰來自動Autossh呢,加入daemon吧

以daemon方式執行,相當於root去執行autossh, ssh,這時剛才普通用戶目錄下的.ssh/authorized_keys文件會不起效。有兩種辦法解決,一種是用autossh的參數指定.ssh路徑;另外一種是以普通用戶身份執行daemon,下面是第二種方式。

/bin/su -c '/usr/bin/autossh -M 5678 -NR 1234:localhost:2223 user1@123.123.123.123 -p2221' - user1

autossh還有很多參數,用來設置重連間隔等等。

將上面命令放入下面各啟動方式中,根據自己系統自己配置:

SysV:/etc/inid.d/autossh

Upstart: /etc/init/autossh.conf

systemd: /usr/lib/systemd/system/autossh.service


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM