網絡-Telnet協議與SSH協議(命令、免密登陸)及其安全性

目錄shell

引言編程

Telnetubuntu

簡介windows

工做原理安全

安全性bash

SSH服務器

簡介網絡

安裝與開啓服務ssh

命令ide

高級配置

服務器別名

免密登陸

安全性

參考


引言

在進行遠程鏈接服務器時,我常用MobaXterm,在選擇Session時,常會看到這個頁面:

Session

以前不求甚解,只知道SSH能夠進行遠程鏈接,不清楚Telnet,其實學過FTP,看到SFTP,也沒去看他們到底區別在哪裏,Shell編程學了一點也不繫統,感受好多要學。今天先來學習Telnet和SSH協議。

Telnet

簡介

Telnet(telecommunication network protocol,電信網絡協議)是一個簡單的遠程終端協議,使用端口23。用戶用Telnet就可在其所在地經過TCP鏈接註冊(即登陸)到遠地的另外一臺主機上(使用主機名或IP地址)。Telnet能將用戶的擊鍵傳到遠地主機,同時也能將遠地主機的輸出經過TCP鏈接返回到用戶屏幕。這種服務是透明的,由於用戶感受到好像鍵盤和顯示器是直接連在遠地主機上。所以,Telnet又稱爲終端仿真協議

工做原理

Telnet也使用客戶/服務器方式。在本地系統運行Telnet客戶進程,而在遠地主機則運行Telnet服務器進程。和FTP的狀況類似,服務器中的主進程等待新的請求,併產生從屬進程來處理每個鏈接。
Telnet可以適應許多計算機和操做系統的差別。例如,對於文本中一行的結束,有的系統使用ASCII碼的回車(CR),有的系統使用換行(LF),還有的系統使用兩個字符,回車-換行(CR-LF)。又如,在中斷一個程序時,許多系統使用Control-C(C),但也有系統使用ESC按鍵。爲了適應這種差別,Telnet定義了數據和命令應怎樣經過互聯網。這些定義就是所謂的NVT(Network Virtual Terminal,網絡虛擬終端)

NVT格式

客戶軟件把用戶的擊鍵和命令轉換成NVT格式,並送交服務器。服務器軟件把收到的數據和命令從NVT格式轉換成遠地系統所需的格式。向用戶返回數據時,服務器把遠地系統的格式轉換爲NVT格式,本地客戶再從NVT格式轉換到本地系統所需的格式。

NVT的格式定義很簡單:全部的通訊都使用8位(一個字節)。在運轉時,NVT使用7位ASCII 碼傳送數據,而當高位置1時用做控制命令。ASCII碼共有95個可打印字符(如字母、數字、標點符號)和33個控制字符。全部可打印字符在NVT中的意義和在ASCII碼中同樣。但NVT只使用了ASCII碼的控制字符中的幾個。此外,NVT還定義了兩字符的CR-LF爲標準的行結束控制符。當用戶鍵入回車按鍵時,Telnet的客戶就把它轉換爲CR-LF再進行傳輸,而Telnet服務器要把CR-LF轉換爲遠地機器的行結束字符。
Telnet的選項協商(Option Negotiation)機制使Telnet客戶和Telnet服務器可商定使用更多的終端功能,協商的雙方是平等的,也就是說任何一方均可以主動發送選項協商請求給對方。

選項協商6種狀況
  1. WILL:發送方自己將激活(enable)選項。
  2. DO:發送方想叫接收端激活選項。
  3. WONT:發送方自己想禁止選項。
  4. DON'T:發送方想讓接收端去禁止選項。

注:因爲Telnet規則規定,對於激活選項請求(如1和2),有權贊成或者不一樣意。而對於使選項失效請求(如3和4),必須贊成。這樣,4種請求就會組合出6種狀況,如上圖所示。

安全性

不安全,由於使用明文傳輸。一旦被ARP中毒等中間人***,就會暴露用戶名、密碼等敏感信息。另外,帳號密碼簡單時也可被暴力破解。

SSH

簡介

SSH(Secure Shell),由 IETF 的網絡小組(Network Working Group)所制定,端口22。SSH 爲創建在應用層基礎上的安全協議。SSH 是較可靠的,專爲遠程登陸會話和其餘網絡服務提供安全性的協議。利用 SSH 協議能夠有效防止遠程管理過程當中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其餘操做平臺。SSH在正確使用時可彌補網絡中的漏洞。SSH客戶端適用於多種平臺,幾乎全部UNIX平臺均可使用。

經過使用SSH,你能夠把全部傳輸的數據進行加密,這樣"中間人"這種***方式就不可能實現了,並且也可以防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的數據是通過壓縮的,因此能夠加快傳輸的速度。SSH有不少功能,它既能夠代替Telnet,又能夠爲FTP、PoP、甚至爲PPP提供一個安全的"通道"

22端口由來小故事:SSH設計者Tatu Ylonen設計SSH是爲了替代telnet(端口23)和ftp(端口21),端口22在當時是空閒的,正好就在telnet和ftp的端口之間,他感受這個端口號自然就帶有可信度光環。因而就選擇了端口22做爲SSH的端口。原文可查看ssh-端口

另外,Tatu Ylonen於1995年寫的SSH,W·Richard Stevens 於1994年寫的《TCP/IP詳解卷I》,因此裏面只有Telnet,而沒有SSH。能夠閱讀RFC4250進行更詳細的瞭解。

 

OpenSSH是SSH協議的免費開源實現,OpenSSH提供了服務端的程序(openssh-server)和客戶端工具(openssh-client),接下來以OpenSSH爲例,介紹一下SSH命令及高級配置

安裝與開啓服務

# 安裝服務端/客戶端(Ubuntu)
$ sudo apt install openssh-server/openssh-client

# 安裝服務端/客戶端(Centos)
$ sudo yum install openssh-server/openssh-client

# 查看ssh服務是否開啓
$ netstat -tlp | grep ssh

# 啓動/中止/重啓 ssh服務
$ sudo /etc/init.d/ssh start/stop/restart

查看ssh服務是否開啓

命令

ssh命令

 

SSH命令
選項 參數 含義
--46AaCfGgKkMNnqsTtVvXxYy   查看軟件版本等信息
-b bind_address 綁定ip地址,如xxx.xxx.xxx.xxx
-c cipher_spec  
-D [bind_address:]port  
-E log_file 指定日誌文件xxx//xx//xx.log
-e escape_char  
-F configfile 指定配置文件
-i identify_file 認證文件
-J [user@host[:port]]  
-L address  
-l login_name  
-m mac-spec  
-O ctl-cmd  
-o option  
-p port 指定端口,默認22
-Q query_option  
-R address  
-S ctl-path  
-W host:port  
-w local_tun[:remote_tun]  
[user@]hostname [command] 用於客戶端鏈接服務器
版本等信息

注意

  • user是遠程服務器登陸的用戶名,默認爲當前用戶
  • hostname是遠程服務器地址,能夠是IP/域名/別名
  • exit/logout命令都可退出當前登陸

接下來,展現一下鏈接ssh服務器

Windows鏈接Ubuntu

能夠看到,使用SHA256進行了校驗,生成了一個指紋,咱們關閉鏈接,重連一次。

再次鏈接

再次鏈接,能夠發現,已經沒有了校驗顯示,輸入密碼後直接登陸,稍微簡便了一點。那麼,校驗記錄存在哪呢?

cd ~/.shh
cat known_hosts
Windows下校驗記錄

 第一條是個人GitLab的,就劃掉了,第二條是剛纔鏈接的。

Linux下校驗記錄

在~/.ssh/known_hosts文件中能夠看到。接下來,咱們就來詳細看看一些配置。

高級配置

Linux下,ssh配置信息都保存在~/.ssh

配置文件 做用
known_hosts 做爲客戶端。記錄曾鏈接服務器受權。ssh第一次鏈接一臺服務器會有一個受權提示,確認受權後會記錄在此文件中,下次鏈接記錄中的服務器時則再也不須要進行受權確認提示
authorized_keys 做爲服務端。客戶端的免密鏈接公鑰文件
config 做爲客戶端。記錄鏈接服務器配置的別名

後兩個默認是不存在的,須要手動建立。下面Windows中也是僅有known_hosts文件的,另外兩個是我給GitLab配置密鑰文件時建立的。

Windows下

Windows下內容

服務器別名

每次都寫IP地址,可是IP地址比較難記,咱們能夠去一個別名。新建一個config文件,內容以下:

Host Ubuntu
  HostName 10.28.214.174
  User llvm
  Port 22

config文件

其中,Port能夠不寫,默認就是22端口。

別名登陸

免密登陸

經過以上,咱們便可經過別名和密碼登陸了,可是每次都輸入密碼,比較麻煩,接下來咱們看看免密登陸。

客戶端生成密鑰對

ssh-keygen
參數

 我通常是不用參數的,它會給一些提示,我通常所有按Enter,選擇默認,此次因爲文件路徑名字重複,才改了一個。上面的參數,博主只感受-t參數比較有用,可是密碼學學的也很差,默認的rsa加密方式也很好,通常也是默認。

生成密鑰文件
查看密鑰文件

上傳公鑰到服務器

ssh-copy-id user@hostname

windows下沒有這個命令,只能手動了。使用這個命令實際上是將公鑰追加到了服務器的authroized_keys文件中,咱們把文件放到Ubuntu中,使用命令追加一下。

公鑰上傳成功

接下來,咱們就可使用密鑰文件登陸了

ssh -i id_rsa_ubuntu Ubuntu
密鑰文件登陸

仍是有點麻煩,須要記着服務器須要使用哪一個對應的私鑰。咱們再配置一下,添加私鑰文件:

IdentityFile C:\Users\DELL\.ssh\id_rsa_ubuntu
配置密鑰文件

 好啦,至此,咱們能夠只是用一個別名就能登陸了:

ssh Ubuntu便可登陸,無需密碼

固然,咱們只是爲了學習一下ssh,平時博主也直接使用MobaXterm、Xshell等軟件直接鏈接,有工具的話會節省不少時間。

對於GitHub、GitLab等也會使用密鑰文件的方式,將公鑰上傳到服務器便可。

GitLab上傳頁面

以GitLab爲例,能夠看到,要求上傳ssh-rsa或ssh-ed25519的公鑰。客戶端生成密鑰對時,可使用-t參數,選擇ed25519,也可以使用默認的rsa方式。

安全性

  • 有效防止遠程管理過程當中的信息泄漏
  • 傳輸 數據加密,可以防止DNS和IP欺騙
  • 傳輸 數據壓縮,加快傳輸速度

帳號密碼簡單時也可被暴力破解。

關於這兩個協議的安全實驗,將在學習暴力破解的時候再展現。

參考

《計算機網絡第7版 謝希仁》6.3

《TCP/IP詳解I》第26章

RFC854

RFC4250

www.ssh.com

相關文章
相關標籤/搜索