使用反向ssh從外網(wǎng)訪問內(nèi)網(wǎng)主機的方法詳解
前言
最近遇到一個問題,就是過幾天我需要離開學校,而且到時候仍然想登陸校園網(wǎng)里的一臺服務器進行工作;但是我又沒有校園網(wǎng)網(wǎng)關的操作權限,不能做端口映射,也不能搞到校園網(wǎng)內(nèi)部主機的外網(wǎng)ip,而且學校自己提供的vpn又根本沒法用。研究了半天,總算找到了一個比較不錯的利用反向ssh(reverse ssh tunnel)進行內(nèi)網(wǎng)登陸的解決方案。
工作原理
之所以很多轉發(fā)的方法無法應用在這里,就是因為內(nèi)網(wǎng)主機對外網(wǎng)其實是不可見的,也就是說外部主機不能用一般的方法訪問到內(nèi)部主機。那么我們就想了,能不能用內(nèi)網(wǎng)主機找外網(wǎng)主機,找到之后再把這條內(nèi)網(wǎng)主機登陸外網(wǎng)的信道轉換成外網(wǎng)主機登陸內(nèi)網(wǎng)的信道呢?辛運的是,這個方法的確是可行的,這也就是所謂反向ssh最通俗的理解,這就像寄信一樣,”雖然我不知道你的地址,但是你知道我的地址,那么你就先給我寫封信,告訴我你的地址,然后我不就可以回信給你了么?“。
操作步驟
由于我們自己使用的電腦未必有外網(wǎng)ip,因此我們需要一個有固定外網(wǎng)ip的服務器(隨便搞個騰訊云阿里云的小機子就行),然后用這臺服務器與內(nèi)網(wǎng)的機子進行通信,我們到時候要先登陸自己的服務器,然后再利用這個服務器去訪問內(nèi)網(wǎng)的主機。
1、準備好有固定ip的服務器A,以及待訪問的內(nèi)網(wǎng)機器B。兩者都開著sshd服務,端口號默認都是22。順便做好ssh免密碼登陸。
2、內(nèi)網(wǎng)主機B主動連接服務器A,執(zhí)行以下命令:
$ ssh -NfR 1111:localhost:22 username@servername -p 22
這條命令的意思是在后臺執(zhí)行(-f),不實際連接而是做port forwarding(-N),做反向ssh(-R),將遠程服務器的1111端口映射成連接本機(B)與該服務器的反向ssh的端口。
附:這里有必要加強一下記憶,這個端口號一不小心就容易搞混。。man文檔中的參數(shù)命令是這樣的:
-R [bind_address:]port:host:hostport
bind_address以及其后面的port是指遠程主機的ip以及端口,host以及其后的hostport是指本機的ip和端口。由于ssh命令本身需要遠程主機的ip(上上條命令中的servername),因此這個bind_address原則上是可以省略的。
執(zhí)行完這條命令,我們可以在服務器A上看到他的1111端口已經(jīng)開始監(jiān)聽:
$ ss -ant |grep 1111 LISTEN 0 128 127.0.0.1:1111 *:*
3、在上面的操作中,這個1111端口就已經(jīng)映射成了內(nèi)網(wǎng)主機B的22端口了,現(xiàn)在我們只要ssh到自己的這個端口就行了。在服務器A中執(zhí)行:
$ ssh username@localhost -p1111
這樣就成功的登陸了內(nèi)網(wǎng)的主機了。
功能優(yōu)化
上面的做法其實有一個問題,就是反向ssh可能會不穩(wěn)定,主機B對服務器A的端口映射可能會斷掉,那么這時候就需要主機B重新鏈接,而顯然遠在外地的我無法登陸B(tài)。。。這其實有一個非常簡單的解決方案,就是用autossh替代步驟2中的ssh:
$ autossh -M 2222 -NfR 1111:localhost:22 username@servername -p 22
后面的參數(shù)跟ssh都一樣,只是多了一個-M參數(shù),這個參數(shù)的意思就是用本機的2222端口來監(jiān)聽ssh,每當他斷了就重新把他連起來。。。不過man文檔中也說了,這個端口又叫echo port,他其實是有一對端口的形式出現(xiàn),第二個端口就是這個端口號加一。因此我們要保證這個端口號和這個端口號加一的端口號不被占用。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
CentOS 7.x下的LEMP環(huán)境搭建詳細教程
我們常說的LNMP環(huán)境是指Linux/nginx/MySQL/PHP組合,LEMP包是由Linux、nginx、MariaDB/MySQL和PHP組成的,那么看來LEMP和LNMP是一樣的,而現(xiàn)在業(yè)內(nèi)習慣性的稱作LEMP。這篇文章主要介紹了CentOS 7.x下的LEMP環(huán)境搭建詳細教程,需要的朋友可以參考下2016-10-10ubuntu中python調(diào)用C/C++方法之動態(tài)鏈接庫詳解
這篇文章主要給大家介紹了關于如何在ubuntu中python調(diào)用C/C++方法之動態(tài)鏈接庫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-11-11Apache mod_rewrite中的REQUEST_URI使用實例
這篇文章主要介紹了Apache mod_rewrite中的REQUEST_URI使用實例,本文使用一個實例講解如何使用REQUEST_URI,需要的朋友可以參考下2015-01-01linux下SVN配置實現(xiàn)項目目錄自動更新以及源碼安裝的操作方法
下面小編就為大家分享一篇linux下SVN配置實現(xiàn)項目目錄自動更新以及源碼安裝的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12