使用 AutoSSH 實現自動化跨網路訪問

来源:https://www.cnblogs.com/dancesir/archive/2023/10/19/17774352.html
-Advertisement-
Play Games

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"

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於網路通信中的服務端來說,顯然不可能是一對一的,我們所希望的是服務端啟用一份則可以選擇性的與特定一個客戶端通信,而當不需要與客戶端通信時,則只需要將該套接字掛到鏈表中存儲並等待後續操作,套接字服務端通過多線程實現存儲套接字和選擇通信,可以提高服務端的併發性能,使其能夠同時處理多個客戶端的請求。在實... ...
  • MD5的全稱是message-digest algorithm 5,MD5演算法屬於hash演算法的一類,對消息進行運算,產生一個128位的消息摘要(32位數字字母),並且加密不可逆,相同數據的加密結果一定相同。 C# 實現MD5加密。MD5加密16位和32位 ...
  • C# 中的 Queue 是一種基於鏈表的先進先出 (FIFO) 數據結構。以下是一個簡單的 Queue 實例: /// <summary> /// 普通隊列 /// </summary> public void QueueShow() { // 創建一個Queue Queue<string> que ...
  • 引言 面試中,常會問道,在大數據量的字元串拼接情況,為什麼 StringBuilder 性能比直接字元串拼接更好? 主要原因就是 string 是不可變類型,每次操作都會創建新的字元串對象,頻繁操作會導致記憶體頻繁的分配和回收,就會降低性能, 而 StringBuilder 是可變類型,它允許對字元串 ...
  • 此博客是C#學習筆記中的進階部分,設計C#語言中的高級知識,介紹了List與ArrayList、Stack和Queue以及Hashtable等數據結構, 泛型,泛型類型數據結構,以及糾纏不清的委托與事件。還涉及到不常見但常用的一些知識小點,如匿名函數,Lambda表達式,協變和逆變,多線程, 反射和... ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 前言 該方案實現的效果就是通過指定用戶名可以直接ssh連接到某個linux機器中的chroot開發環境,在 ubuntu 22.04 環境測試通過 流程 首先我們需要有個現成的 chroot 環境,我這裡是 debian10-aarch64 文件夾,如果你沒有可以參考我先前的文章製作一個: http ...
  • 前言 我的主力環境是 Windows 系統,但是同樣需要維護一些 linux 工程代碼。一般情況下,只需要開個 vmware 虛擬機,裝個 linux 系統就可以進行修改,編譯和調試操作,但是有時候我卻需要對 linux 真機環境進行遠程調試,這時候如果能直接在 windows 系統載入 linux ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...