友情提示:如果您不知道您家路由器管理頁面的密碼,請您忽略此文。
問題背景:
家中有台筆記本電腦,它是通過家中的路由器與外界聯網的,這時,我想通過ssh服務讓公司的電腦能連上我家中的筆記本。
可以畫個圖更直觀地解釋一下,如下圖
家中路由器的IP地址是外網,也就是說外部的電腦可以訪問它。路由器會給家里的每個設備各分配一個獨特的IP地址,這個IP地址是只適用於路由器控制的局部范圍,而每個設備的外部IP都是相同的,也就是路由器的IP地址:201.23.4.57。這時候,問題來了,我想在A上通過ssh連接B,按照命令,應該在A的命令行輸入
ssh guanyuzuike@ip_address
其中,guanyuzuike是我在電腦B上的用戶名,那么這個ip_address應該怎樣填呢?
如果填192.168.1.103, 那顯然是不行的,因為它只是一個局部的IP,外網並不能訪問它。如果填201.23.4.57,那么這個時候路由器就有點不爽了,他會問:你到底是要我連哪個設備??
我們的目標:
今天的博客,就是解決幫路由器解決連哪個設備的問題。 具體來說,今天的博客內容將讓你實現以下功能:
可以在A命令行輸入以下任意一條指令,都可以連上家中的電腦B
# command 1
ssh guanyuzuike@201.23.4.57 # then input password of guanyuzuike # command 2
ssh guanyuzuike@xxxxxx # then input password of guanyuzuike # command 3
ssh home # then input password of guanyuzuike # command 4
ssh home # no need to input anything
從以上四條指令來看,我們的終極目標是實現第四條指令,然后也不需要輸入用戶密碼,直接連上B。
適用環境及准備:
A安裝ssh客戶端,B安裝ssh服務端並開啟ssh服務。
安裝客戶端請自行上網查詢。對於Linux系統,安裝ssh服務端和開啟的指令為(僅供參考)
sudo apt-get install openssh-server sudo service ssh start
具體操作:
1. 實現command 1
要連接B,肯定是要通過路由器的外網IP,即201.23.4.57。但是,要引導路由器連上B,必須要借助路由器的接口轉發功能。
第一步:登錄路由器管理界面
對於大多數路由器,在瀏覽器輸入192.168.1.1即可進入界面(但有的路由器是別的網址,這個時候就需要機智的你研究一下你家路由器了),輸入密碼登錄,進入如圖所示的頁面(界面風格因路由器各種型號和版本而異,但功能差不多)
第二步:找到接口轉發設置窗口
接口轉發,也稱port forwarding,也稱虛擬服務器,比如我的就在高級設置>>高級用戶>>虛擬服務器 里面,一般長得差不多,如下
點擊添加添加虛擬服務器;
常用服務器不用填,內部端口填22(ssh御用端口),外部端口可與內部端口一樣,也可以填個大點的數以防止與現有的端口重復,比如我填2237,IP地址填B的局部IP:192.168.1.103(忽略我圖上填的);協議類型選all(有的路由是選both,反正就是支持所有協議的意思)。最后保存。此操作的意思就是讓外網通過端口2237給路由器傳輸命令,讓路由器知道我要轉發局部IP為192.168.1.103的ssh服務(為什么是ssh服務?因為內部端口22代表ssh服務)。
如果外部端口填的是22,那么此時就可以在A上調用command 1對B進行訪問。
如果外部端口填的是別的數,如2237,那么,有兩種方式對B進行訪問:
方式1, 在A上調用指令:ssh -p 2237 guanyuzuike@201.23.4.57 也就是說在command 1的基礎上加上 -p 2237,代表外部端口是2237(默認是22)
方式2, 待會講。
2. 實現command 2
command 2里面的xxxxxx其實是路由器外網IP的一個域名。為什么要搞一個域名,因為路由器的外網IP不會保證一直不變,也就是說,可能幾個月后,它從現在的201.23.4.57會變成201.23.4.44(瞎編的,反正就是一個不同的地址)。這時候,就需要調用ssh -p 2237 guanyuzuike@201.23.4.44。一個字,麻煩。而有一個域名的時候,比如:guanyuzuike.net,那么我可以從始至終,從盤古開天到天荒地老,我一直調用ssh -p 2237 guanyuzuike@guanyuzuike.net,都可以成功連上B。怎么搞?如上圖,找到路由管理頁面的DDNS,會有一個花生殼的服務,如下
注冊一個花生殼賬號,需要花點RMB(域名大概8塊一個),可以得到一個你設置的個性域名。
3. 實現command 3
上面的命令,看起來總有點麻煩。所以,如何省去 -p 2237,甚至直接調用ssh home ?
好的,請在A打開文件~/.ssh/config(它是一個文本文件,沒有的話請直接創建一個這樣的文件),輸入以下
Host home User guanyuzuike Port 2237 HostName guanyuzuike.net
# if you do not have an alias for ip
# HostName 201.23.4.57 #it is your ip address
這里順便也變上面提到的“方式2”也講了
4. 實現command 4
以上還是麻煩,因為每次ssh的時候,需要輸密碼。下面,就可以通過創建ssh key,來解決這個問題。
第一步:在A中,命令行輸入
ssh-keygen
Enter file in which to save the key (/home/xx/.ssh/id_rsa): 這里你可以取一個別的名字,比如/home/xx/.ssh/id_home_rsa,xx為你在A上的用戶名
這樣,在/home/xx/.ssh/下會生成兩個文件:id_home_rsa和id_home_rsa.pub。
第二步:在~/.ssh/config(其實也就是/home/xx/.ssh/config)里添加一項:
Host home User guanyuzuike Port 2237 HostName guanyuzuike.net IdentityFile /home/xx/.ssh/id_home_rsa
第三步,打開B中的文件/home/guanyuzuike/.ssh/authorized_keys(同樣是一個文本文件,如果沒有請創建一個),將剛剛id_home_rsa.pub里面的內容(其實也就是一行內容)復制作為authorized_keys里面的一行。
這樣,你就可以在A上簡單調用ssh home,連上B,連密碼都不用輸。
當然,上面說的所有,都是基於以下條件:
你沒有遇到其他問題
當你不滿足以上條件時,可以采取以下辦法:
機智如你,上網查詢
祝您愉快。