SSH遠端登入和埠轉發詳解

NO IMAGE

介紹

SSH 是建立在應用層和傳輸層基礎上的安全協議,為計算機上的 Shell(殼層)提供安全的傳輸和使用環境。

SSH 只是協議,有多種實現方式,本文基於其開源實現 OpenSSH

遠端登入

SSH主要用於遠端登入:


$ ssh [email protected]

當本地使用者名稱和遠端使用者名稱一致時,可省略使用者名稱:


$ ssh host

SSH 協議預設埠是22,指定埠可使用 -p 引數


$ ssh -p 2222 [email protected]

MITM

SSH 採用公鑰加密的方式來保證傳輸安全。過程如下:

客戶端發起登入請求,遠端主機將自己的公鑰發個使用者;
客戶端使用該公鑰將登入密碼加密後傳送給遠端主機;
遠端主機使用私鑰解密登入密碼,如密碼正確則允許客戶端登入。

However!

由於 SSH 協議的公鑰是自己簽發的,並不像HTTPS 的SSL證書是有CA機構頒發的。如果有人插在使用者與遠端主機之間,截獲登入請求,然後冒充遠端主機,將偽造的公鑰發給客戶端,那麼使用者則很難辨別真偽。
這樣就可以獲取使用者登入密碼,用來登入遠端主機。這就是MITM,(Man-in-the-middle attack,中間人攻擊)

密碼登入

第一次登入遠端主機,會有如下提示:


$ ssh 10.0.0.12
The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.
RSA key fingerprint is 3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d.
Are you sure you want to continue connecting (yes/no)?

意思是:無法確認遠端主機真實性,指知道它的公鑰指紋,是否繼續連線?

公鑰指紋(fingerprint):公鑰採用RSA演算法,長度較長難以比對,所以對其進行MD5計算,得到128位的指紋,即上例中的3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d

其實並沒有什麼有效便捷的方式確認公鑰指紋的真實性,確認接受遠端主機公鑰:


Are you sure you want to continue connecting (yes/no)? yes

系統提示遠端主機已加入到受信主機列表:


Warning: Permanently added '10.0.0.12' (RSA) to the list of known hosts.

然後提示輸入密碼:


[email protected]'s password:

輸入密碼正確,就可以正常登陸了。

當遠端主機的公鑰被接受以後,它就會被儲存在檔案$HOME/.ssh/known_hosts之中。下次再連線這臺主機,系統會發現它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。

公鑰登陸

除了密碼登入,SSH 還支援公鑰登入。

“公鑰登入”原理是:使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入shell,不再要求輸入密碼。

公鑰登入需要使用者提供自己的公鑰,一般儲存在 $HOME/.ssh/ 目錄下,id_rsa是私鑰,id_rsa.pub是公鑰。如果沒有可以通過ssh-keygen生成。


$ ls -1 ~/.ssh
id_rsa
id_rsa.pub
known_hosts

需要把公鑰傳送到遠端主機:


# ssh-copy-id [-i [identity_file]] [[email protected]]machine
$ ssh-copy-id [email protected]

此後再登入就不需要輸入密碼了。

如果還是無法使用公鑰登入,可以檢查一下遠端主機SSH配置/etc/ssh/sshd_config,開啟如下注釋並重啟SSH服務[我發現CentOS release 6.8 (Final)預設SSH配置中註釋掉以下內容也是可以使用公鑰登入的]:


> #RSAAuthentication yes
> #PubkeyAuthentication yes
> #AuthorizedKeysFile  .ssh/authorized_keys
>

authorized_keys檔案

遠端主機將使用者的公鑰,儲存在 $HOME/.ssh/authorized_keys 中。公鑰是一段字串,也可以手動追加到遠端主機authorized_keys檔案中,每行一個。

也可以通過如下命令代替ssh-copy-id,解釋公鑰的儲存過程:


$ ssh [email protected] 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

遠端操作

SSH可以用於直接在遠端主機上操作


# 檢視遠端主機Nginx程序
ssh 10.0.0.12 'ps -ef | grep nginx'

埠轉發

本地轉發

本地轉發是指:把本地主機埠通過待登入主機埠轉發到遠端主機埠上去。

本地轉發通過引數 -L 指定,格式: -L [本地主機:]本地主機埠:遠端主機:遠端主機埠


ssh -L 5000:www.google.com:80 [email protected]

通過上面的命令,訪問本地5000埠,相當於訪問遠端主機www.google.com的80埠,並且這是通過通過登入主機來安全地轉發資料的。當不能直接訪問遠端主機某埠,而登入主機可以訪問時,可以使用這種方式將遠端主機埠繫結到本地。

遠端轉發

遠端轉發是指:把登入主機埠通過本地主機埠轉發到遠端主機.

遠端轉發通過引數 -R 指定,格式: -R 登入主機埠:遠端主機:遠端主機埠。


ssh -R 8080:localhost:80 [email protected]

通過上面的命令,訪問登入主機的 8080 埠就相當於訪問 localhost:80!

例如下面這種場景:我在本機起了一個web服務,希望別人從外網訪問或測試,但是外網是不能直接訪問我的內網機器。所以我可以在本機上執行上面的命令,這樣就就可以通過訪問登入主機的80埠,來訪問本機的80埠了,從而實現外網訪問內網的應用了。簡直太方便~

動態轉發

動態轉發不需要指定特定的目標主機和埠號,可以實現不加密的網路連線,全部走SSH連線,從而提高安全性。

例如把本地5000埠的資料,都通過SSH傳向登入主機:


ssh -D 5000 [email protected]

例如可以用於科學上網的場景,在瀏覽器中設定代理型別為 SOCKS(5),主機及埠為127.0.0.1:5000 就可以通過登入主機科學上網了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對指令碼之家的支援。

您可能感興趣的文章:

centos 6.5下修改SSH埠及禁用root遠端登入的方法linux遠端登入ssh免密碼配置方法菜鳥學Linux命令:ssh命令(遠端登入)