SSH 端口轉發與自動維護

1 ssh 端口轉發

ssh(Secure Shell)是一種網絡傳輸協議,它能夠在客戶端和服務器之間創建安全的隧道連接。最常見的功能就是遠程登錄,這不是本文的重點,不過也會涉及到密鑰登錄(避免輸入密碼)。本文將使用ssh做端口轉發,ssh端口轉發有三種模式:

  • 本地端口轉發(Local Port Forwarding)
  • 遠程端口轉發(Remote Port Forwarding)
  • 動態端口轉發(Dynamic Port Forwarding)

1.1 本地端口轉發

本地主機登錄服務器后,將本地主機指定的端口映射到服務器指定的端口,從而實現用戶在訪問本地主機時,就等于訪問服務器的效果。例如:服務器上有一個web站點訪問地址是http://192.168.0.3:5000 ,服務器防火墻上并沒有開啟5000端口,如果直接輸入網址,是訪問不到該web站點的。這時可以利用本地端口轉發功能,將請求本地主機的4000端口的數據轉發到服務器上的5000端口上,具體做法如下:

ssh -fNL 4000:192.168.0.3:5000 root@192.168.0.3

上面命令的中

  • -f 選項表示本地主機的ssh客戶端在后臺運行

  • -N 選項表示不執行遠程命令,只用于轉發端口,及本地主機在登錄了192.168.0.3后,不會分配一個tty窗口。

  • -L 選項表示這是一個本地轉發模式,它的參數是 port:host:hostport,對應到這里是4000:192.168.0.3:5000

    • port 參數表示本地主機的端口,及要通過該端口轉發數據到目標主機

    • host:hostport 參數表示經過遠程服務器(及使用ssh登錄的服務器ssh root@192.168.0.3)轉發的目標主機和端口。在這個例子中,目標主機和遠程服務器都是192.168.0.3。既然他們是一臺主機,那么也可以用下面的命令來代替:

    • ssh -fNL 4000:localhost:5000 root@192.168.0.3
      # 或者
      ssh -fNL 4000:127.0.0.1:5000 root@192.168.0.3
      

      上面的localhost和127.0.0.1是相對于通過ssh登錄的遠程服務器的。

  • root@192.168.0.3 是ssh的登錄命令,只有登錄了遠程服務器后,才能執行端口轉發

執行完上面的命令后,可以在本地主機的瀏覽器上輸入http://localhost:4000 訪問遠程服務器192.168.0.3:5000上的web站點。

現在,假如有另外一臺服務器10.1.1.10,上面部署了一個web應用(地址為http://10.1.1.10 ,端口為80),本地主機不能直接訪問該站點的web服務器,而192.168.0.3上能夠訪問得到這臺服務器。根據上面的知識,我們知道,10.1.1.10:80是我們的目標主機和端口,192.168.0.3作為遠程服務器,與我們本地主機和目標主機的網絡都是連通的,我們就可以通過以下命令將本地主機的4000端口的數據轉發到目標主機(10.1.1.10)的80端口上。

ssh -fNL 4000:10.1.1.10:80 root@192.168.0.3

此時,我們輸入http://localhost:4000,就能訪問到http://10.1.1.10站點的內容

1.2 遠程端口轉發

遠程端口轉發是將遠程服務器端口映射到本地端口,方便其他不能直接訪問本地網絡的主機訪問。比如,家里的電腦要訪問公司內部服務器(192.168.0.5)上的web站點(部署在80端口上),因為它們是不能直接通信的,所以需要有一臺遠程服務器(比如:123.123.123.123)作端口轉發。

此時,我們需要在遠程服務器上開一個端口,這里假設為8000端口,將8000端口與內部服務器上的80端口做綁定,然后我們在家里只需要訪問遠程服務器的8000端口,即可與訪問到內部服務器的web站點。具體做法是,在內部服務器192.168.0.5上執行如下指令:

ssh -fNR 8000:localhost:80 root@123.123.123.123

在上面的命令中:

  • -R 選項代表的是遠程端口轉發模式,它的參數是port:host:hostport,對應這里的是8000:localhost:80
    • port-L 參數中的port不同,-L參數中port代表的是本地的端口,而這里的port代表的是遠程服務器123.123.123.123的端口。
    • host:hostport 參數表示要綁定的本地端口,這里的localhost代表的我們操作的內部服務器,即192.168.0.5,也可以變為127.0.0.1或192.168.0.5。可以是這臺內部服務器能訪問的任何其他服務器資源,這里就不在贅述。

執行完上面的命令后,我們在家里通過輸入http://123.123.123.123:8000,即可訪問內部服務器上http://192.168.0.5 的站點。

1.3 動態端口轉發

當目標主機不定時,我們就需要使用動態端口轉發。比如,公司內部只有一臺服務器192.168.0.3能夠訪問外網,現在我們需要到網上去查詢一些資料,這些資料的來至不同的服務器,也就是我們的目標地址是不固定的,那么我們就需要這臺服務器192.168.0.3為我們做動態端口轉發。具體指令如下:

ssh -fND 8000 root@192.168.0.3
  • -D 參數表示使用動態端口轉發模式,8000表示本地主機要綁定的端口。當本地主機登錄遠程服務器后,8000端口所收到的數據將會轉發到服務器192.168.0.3上,再由這臺服務器為我們動態的轉發到目標地址。

比如,我們要訪問百度,我們需要將瀏覽器發出的請求先轉發到localhost:8000端口上,由8000端口將數據傳輸到服務器192.168.0.3上,再由服務器動態的將請求轉發至百度服務器上,及實現了本地主機上網查找資料的目的。這里后面的兩步都已經完成,只需要將第一步在本地主機上把瀏覽器的請求轉發到本地的8000端口上。我們可以使用瀏覽器的socks代理,將其請求發送到本地端口即可。

2 使用autossh自動維護連接

不論使用哪種模式,SSH做端口轉發時,都需要在本地主機和遠程服務器之間建立連接(隧道)。這種連接是不穩定的,當網絡情況不好時,連接可能會中斷。autossh可以解決這種問題,它會在本地主機和遠程服務器上做連接檢查(發送測試數據到指定端口),如果發現連接中斷后,會自動重連。

上面的描述中,有兩個問題需要解決

  1. 在什么端口做連通性檢測
  2. 如何重連

2.1 使用密鑰登錄服務器

使用ssh連接服務器時,使用用戶名密碼登錄,每次都要輸入密碼。如果是自動重連,我們就需要免密登錄服務器。這里我們要解決的是ssh連接遠程服務器時需要輸入用戶名密碼的問題。ssh除了用戶名密碼登錄外,還有一種登錄方式是使用密鑰登錄,大致過程如下:

我們在本地主機上生成一個密鑰對,將公鑰放在遠程服務器中,私鑰保存在本地主機上,當使用密鑰登錄遠程服務器時,流程如下:

  1. 客戶端發起連接請求,并將公鑰發送至服務器
  2. 服務器比對客戶端發送的公鑰是否與本地的公鑰相同,如相同則用公鑰加密一個隨機字符,發送給客戶端,這個認證機制叫challenge/response(質疑-應答認證)
  3. 客戶端在收到challenge后,使用私鑰解密,并將結果回傳給服務器
  4. 服務器驗證客戶端回傳的數據后,建立ssh連接

生成密鑰

使用ssh-keygen生成密鑰對,ssh-keygen有很多參數選項,下面列出我用到的:

  • -t 表示生成密鑰的類型,有dsa,rsa等,一般用rsa加密算法
  • -C 后面跟附加信息,一般我是跟的個人的名字
ssh-keygen -t rsa -C zebra

這里在輸入私鑰密碼時,選擇為空,為后續autossh自動重連提供方便。生成完后,默認會在用戶家目錄的.ssh目錄下生成id_rsa和id_rsa.pub兩個文件。id_rsa為私鑰文件,id_rsa.pub為公鑰文件,可以看到id_rsa.pub公鑰文件的最后有我們-C選項的附加信息zebra,這樣我們將公鑰上傳至服務器后,能夠很方便的找到自己的公鑰。

上傳公鑰

使用ssh-copy-id上傳公鑰文件

ssh-copy-id -i root@123.123.123.123

在ssh-copy-id命令中,-i選項后面跟公鑰文件的路徑,如果不加參數,默認是找~/.ssh/id_rsa.pub公鑰文件,我們使用的默認公鑰文件,root@123.123.123.123是指要將公鑰數據存放在遠程服務器的root用戶下,注意:端口轉發必須是連接root用戶。執行完上面的命令后,會在root家目錄下的.ssh目錄中,生成authorized_keys文件,里面保存做上傳的公鑰內容。

2.2 使用autossh維護連接

在客戶端使用命令yum install autossh安裝autossh,autossh在ssh的基礎上新增加一個參數-M來檢查隧道的連通性,原理是這樣的,autossh會在-M指定的端口上發送測試數據,并在這個端口+1的端口上接收回響數據。比如:我們設置-M 20000,autossh 會在20000端口上發送測試數據,并在20001端口上接收回傳數據。

舉例說明,我要執行遠程端口轉發的功能,將本地80端口映射到遠程服務器的8000端口,使用ssh命令如下:

ssh -fNR 8000:localhost:80 root@123.123.123.123

如果使用autossh可執行這個命令

autossh -M 20000 -fNR 8000:localhost:80 root@123.123.123.123

autossh會在20000和20001端口上檢查本地客戶端和遠程服務器的連通性,如果發現隧道斷開了,會在執行自動連接,因為我們使用了密鑰登錄,且沒有設置密鑰的密碼,所以就會達到自動重連的效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • http://blog.csdn.net/pipisorry/article/details/52269785 什...
    950545c4cd64閱讀 83,385評論 0 13
  • 加密算法 對稱加密算法 加密和解密使用同一個密鑰 DES、3DES、AES、Blowfish、Twofish、ID...
    毛利卷卷發閱讀 1,612評論 0 4
  • CA和證書安全協議(SSL/TLS)OpenSSH 一、CA和證書 (一) PKI(Public Key Infr...
    哈嘍別樣閱讀 1,406評論 0 0
  • 名詞延伸 通俗的說,域名就相當于一個家庭的門牌號碼,別人通過這個號碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,619評論 2 56
  • ??本文將介紹兩種應用場景的SSH端口轉發,分別是SSH本地轉發以及SSH遠程轉發。 簡介 ??SSH(Secur...
    KingFighting閱讀 1,493評論 0 5