SSH遠程登錄和端口轉發的方法介紹

發布時間:2018-12-25 15:49 來源:互聯網 當前欄目:遠程桌面

  介紹
  SSH是創建在應用層和傳輸層基礎上的安全協議,為計算機上的Shell(殼層)提供安全的傳輸和使用環境。
  SSH只是協議,有多種實現方式,本文基于其開源實現OpenSSH
  遠程登錄
  SSH主要用于遠程登錄:
  [email protected]
  當本地用戶名和遠程用戶名一致時,可省略用戶名:
  $sshhost
  SSH協議默認端口是22,指定端口可使用-p參數
  [email protected]
  MITM
  SSH采用公鑰加密的方式來保證傳輸安全。過程如下:
  •客戶端發起登錄請求,遠程主機將自己的公鑰發個用戶;
  •客戶端使用該公鑰將登錄密碼加密后發送給遠程主機;
  •遠程主機使用私鑰解密登錄密碼,如密碼正確則允許客戶端登錄。
  However!
  •由于SSH協議的公鑰是自己簽發的,并不像HTTPS的SSL證書是有CA機構頒發的。如果有人插在用戶與遠程主機之間,截獲登錄請求,然后冒充遠程主機,將偽造的公鑰發給客戶端,那么用戶則很難辨別真偽。
  •這樣就可以獲取用戶登錄密碼,用來登錄遠程主機。這就是MITM,(Man-in-the-middleattack,中間人攻擊)
  密碼登錄
  第一次登錄遠程主機,會有如下提示:
  $ssh10.0.0.12
  Theauthenticityofhost'10.0.0.12(10.0.0.12)'can'tbeestablished.
  RSAkeyfingerprintis3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d.
  Areyousureyouwanttocontinueconnecting(yes/no)?
  意思是:無法確認遠程主機真實性,指知道它的公鑰指紋,是否繼續連接?
  公鑰指紋(fingerprint):公鑰采用RSA算法,長度較長難以比對,所以對其進行MD5計算,得到128位的指紋,即上例中的3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d
  其實并沒有什么有效便捷的方式確認公鑰指紋的真實性,確認接受遠程主機公鑰:
  Areyousureyouwanttocontinueconnecting(yes/no)?yes
  系統提示遠程主機已加入到受信主機列表:
  Warning:Permanentlyadded'10.0.0.12'(RSA)tothelistofknownhosts.
  然后提示輸入密碼:
  [email protected]'spassword:
  輸入密碼正確,就可以正常登陸了。
  當遠程主機的公鑰被接受以后,它就會被保存在文件$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
  [email protected]
  此后再登錄就不需要輸入密碼了。
  如果還是無法使用公鑰登錄,可以檢查一下遠程主機SSH配置/etc/ssh/sshd_config,打開如下注釋并重啟SSH服務[我發現CentOSrelease6.8(Final)默認SSH配置中注釋掉以下內容也是可以使用公鑰登錄的]:
  >#RSAAuthenticationyes
  >#PubkeyAuthenticationyes
  >#AuthorizedKeysFile.ssh/authorized_keys
  >
  authorized_keys文件
  遠程主機將用戶的公鑰,保存在$HOME/.ssh/authorized_keys中。公鑰是一段字符串,也可以手動追加到遠程主機authorized_keys文件中,每行一個。
  也可以通過如下命令代替ssh-copy-id,解釋公鑰的保存過程:
  [email protected]'mkdir-p.ssh&&cat>>.ssh/authorized_keys'<~/.ssh/id_rsa.pub
  遠程操作
  SSH可以用于直接在遠程主機上操作
  #查看遠程主機Nginx進程
  ssh10.0.0.12'ps-ef|grepnginx'
  端口轉發
  本地轉發
  本地轉發是指:把本地主機端口通過待登錄主機端口轉發到遠程主機端口上去。
  本地轉發通過參數-L指定,格式:-L[本地主機:]本地主機端口:遠程主機:遠程主機端口
  ssh-L5000:www.google.com:[email protected]
  通過上面的命令,訪問本地5000端口,相當于訪問遠程主機www.google.com的80端口,并且這是通過通過登錄主機來安全地轉發數據的。當不能直接訪問遠程主機某端口,而登錄主機可以訪問時,可以使用這種方式將遠程主機端口綁定到本地。
  遠程轉發
  遠程轉發是指:把登錄主機端口通過本地主機端口轉發到遠程主機.
  遠程轉發通過參數-R指定,格式:-R登錄主機端口:遠程主機:遠程主機端口。
  ssh-R8080:localhost:[email protected]
  通過上面的命令,訪問登錄主機的8080端口就相當于訪問localhost:80!
  例如下面這種場景:我在本機起了一個web服務,希望別人從外網訪問或測試,但是外網是不能直接訪問我的內網機器。所以我可以在本機上執行上面的命令,這樣就就可以通過訪問登錄主機的80端口,來訪問本機的80端口了,從而實現外網訪問內網的應用了。簡直太方便~
  動態轉發
  動態轉發不需要指定特定的目標主機和端口號,可以實現不加密的網絡連接,全部走SSH連接,從而提高安全性。
  例如把本地5000端口的數據,都通過SSH傳向登錄主機:
  [email protected]
  例如可以用于科學上網的場景,在瀏覽器中設置代理類型為SOCKS(5),主機及端口為127.0.0.1:5000就可以通過登錄主機科學上網了。
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、