AutoSSH 是一種用以對 SSH 登錄進行安全地自動化的軟體。! 比如我們在 host2 機器上面部署了很多服務,但是由於某種原因導致我們無法直接 ssh 訪問該伺服器已經其上服務的對應埠,但是 host3 伺服器,既能夠訪問 host2 伺服器,又可以訪問我們的 host1 伺服器。這是,我 ...
AutoSSH 是一種用以對 SSH 登錄進行安全地自動化的軟體。!
比如我們在 host2 機器上面部署了很多服務,但是由於某種原因導致我們無法直接 ssh 訪問該伺服器已經其上服務的對應埠,但是 host3 伺服器,既能夠訪問 host2 伺服器,又可以訪問我們的 host1 伺服器。這是,我們可以通過設置 ssh 來進行服務的訪問。但是還有兩個問題:你需要保持終端開啟防止 SSH 進程被關閉;由於網路故障/波動導致 SSH 終斷時無法自動重連。
前者可以使用 tmux 等第三方工具來解決,後者需要 supervisor 等第三方監控工具,不過我們還有一個更常用的選擇方案,那就是使用 autossh 工具。
autossh 工具是一個用來啟動 ssh 服務併進行監控的命令行應用程式,可以在程式問題或者是網路問題的時候,重啟 ssh 服務。
- 在 autossh 1.2 的時候,其方法已經改變了:autossh 使用 ssh 來構造一個 ssh 重定向迴圈(本地到遠程和遠程到本地),然後發送測試數據並獲得返回結果。
- 在 autossh 1.3 增加了一個新的方法:可指定遠程 echo 服務的埠用於返回測試數據發送結果。這個避免握手階段以及所有遠程機器埠的衝突問題,而老的 loop-of-forwardings 方法依然可用。
內網主機主動連接到外網主機,又被稱作反向連接(Reverse Connection),這樣 NAT 路由/防火牆就會在內網主機和外網主機之間建立映射即可相互通信了。但這種映射是路由網關自動維持的,不會持續下去,如果連接斷開或者網路不穩定都會導致通信失敗,這時內網主機需要自動重連機制了。
## 安裝方式
$ yum install autossh $ apt install autossh
使用方式
autossh 使用了系統原生的 SSH 埠映射功能,性能開銷非常小。
命令使用方式
# autossh usage
autossh [-V] [-M port[:echo_port]] [-f] [SSH_OPTIONS]
命令使用參數
- -M #用於有問題時就會自動重連;伺服器 echo 機制使用的埠
- -D #本地機器動態的應用程式埠轉發
- -R #將遠程主機(伺服器)的某個埠轉發到本地端指定機器的指定埠
- -L #將本地機(客戶機)的某個埠轉發到遠端指定機器的指定埠
- -f #後臺運行
- -T #不占用 shell
- -n #配合 -f 參數使用
- -N #不執行遠程命令
- -q #安靜模式運行;忽略提示和錯誤
命令使用演示
# 本地埠綁定(在host1伺服器上面運行) # 將所有發送到本機的8527埠的所有數據轉發到遠程主機的8000埠 $ ssh -vv -N -D localhost:8527 root@host2 -p 8000 # 主要是為了更新安全的運行ssh服務 $ autossh -M 5678 -vv -N -D localhost:8527 root@host2 -p 8000
示例演示
SSH 僅支持 TCP 埠映射!
如果需要映射的埠不多,只有幾個的話,autossh 確實是最佳選擇。但是如果需要映射大量埠,建議還是使用類似 Ngrok 的埠映射工具,畢竟這類工具擁有比較完善的管理功能。
本地埠綁定和轉發 (-L) => 在 host1 上面設置
# 將在host1主機上開啟一個本地偵聽的5900埠 # 這樣之後,訪問本地5900埠的流量將轉發至host2的8000埠 # 其中-M參數負責通過5678埠監視連接狀態,連接有問題時就會自動重連 $ autossh -M 5678 -fCN -L 5900:localhost:8000 root@host3 $ autossh -M 5678 -fCN -L 5900:root@host2:8000 root@host3
遠程埠轉發功能 (-R) => 在 host3 上面設置
# 將在host1主機上開啟一個本地偵聽的5900埠 # 這樣之後,訪問本地5900埠的流量將轉發至host2的8080埠 # 其中-M參數負責通過5678埠監視連接狀態,連接有問題時就會自動重連 $ autossh -M 5678 -fCN -R 5900:localhost:8000 root@host1 $ autossh -M 5678 -fCN -R 5900:root@host2:8000 root@host1
動態埠轉發功能 (-D) => 在 host1 上面設置
# 動態埠轉發功能 $ autossh -M 5678 -vv -D 1080 root@host2
開機自啟動
系統開機,服務自啟動!
在 Ubuntu 或 CentOS 系統中,我們使用 systemd 來管理 autossh 的開機啟動問題。配置很簡單,只需要創建一個如下服務啟動配置文件,即可。舊版本中可以使用 init.d 來管理方式,只需要添加對應命令到 rc.local 文件,即可。
# Ubuntu # 配置文件地址 # /etc/systemd/system/remote-autossh.service [Unit] Description=AutoSSH service for remote tunnel After=network-online.target [Service] User=root ExecStart=/usr/bin/autossh -M 5678 -fCNR 18081:host2:8080 root@host1 [Install] WantedBy=multi-user.target
# CentOS # 配置文件地址 # /etc/rc.d/rc.local $ /usr/bin/autossh -M 5678 -fCNR 18081:host2:8080 root@host1
編寫啟停腳本
可以隨時隨地的啟動、停止我們到服務埠映射!
PASS="escapelife" doexit(){ expect -c " set timeout -1 spawn $1 -t ps aux |grep escape |grep sshd |awk '{print $2}' |xargs kill -9 expect { \"*?assword:*\" { send \"$PASS\r\" } } expect eof " } dossh(){ nohup expect -c " set timeout -1 spawn $1 expect { \"*?assword:*\" { send \"$PASS\r\"; exp_continue } } " & } # 先關掉每台伺服器的sshd連接 doexit "ssh -o -p 6622 escape@aliyun" # 啟動ssh埠映射 dossh "autossh -o -M 5678 -N -L 5900:127.0.0.1:8000 escape@aliyun -p 6622"