目錄shell
引言編程
Telnetubuntu
簡介windows
工做原理安全
安全性bash
SSH服務器
簡介網絡
安裝與開啓服務ssh
命令ide
在進行遠程鏈接服務器時,我常用MobaXterm,在選擇Session時,常會看到這個頁面:
以前不求甚解,只知道SSH能夠進行遠程鏈接,不清楚Telnet,其實學過FTP,看到SFTP,也沒去看他們到底區別在哪裏,Shell編程學了一點也不繫統,感受好多要學。今天先來學習Telnet和SSH協議。
TelnetTelnet(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的格式定義很簡單:全部的通訊都使用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服務器可商定使用更多的終端功能,協商的雙方是平等的,也就是說任何一方均可以主動發送選項協商請求給對方。
注:因爲Telnet規則規定,對於激活選項請求(如1和2),有權贊成或者不一樣意。而對於使選項失效請求(如3和4),必須贊成。這樣,4種請求就會組合出6種狀況,如上圖所示。
不安全,由於使用明文傳輸。一旦被ARP中毒等中間人***,就會暴露用戶名、密碼等敏感信息。另外,帳號密碼簡單時也可被暴力破解。
SSHSSH(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
選項 | 參數 | 含義 |
---|---|---|
--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服務器
能夠看到,使用SHA256進行了校驗,生成了一個指紋,咱們關閉鏈接,重連一次。
再次鏈接,能夠發現,已經沒有了校驗顯示,輸入密碼後直接登陸,稍微簡便了一點。那麼,校驗記錄存在哪呢?
cd ~/.shh cat known_hosts
第一條是個人GitLab的,就劃掉了,第二條是剛纔鏈接的。
在~/.ssh/known_hosts文件中能夠看到。接下來,咱們就來詳細看看一些配置。
Linux下,ssh配置信息都保存在~/.ssh
中
配置文件 | 做用 |
---|---|
known_hosts | 做爲客戶端。記錄曾鏈接服務器受權。ssh第一次鏈接一臺服務器會有一個受權提示,確認受權後會記錄在此文件中,下次鏈接記錄中的服務器時則再也不須要進行受權確認提示 |
authorized_keys | 做爲服務端。客戶端的免密鏈接公鑰文件 |
config | 做爲客戶端。記錄鏈接服務器配置的別名 |
後兩個默認是不存在的,須要手動建立。下面Windows中也是僅有known_hosts文件的,另外兩個是我給GitLab配置密鑰文件時建立的。
Windows下
每次都寫IP地址,可是IP地址比較難記,咱們能夠去一個別名。新建一個config文件,內容以下:
Host Ubuntu
HostName 10.28.214.174
User llvm
Port 22
其中,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,平時博主也直接使用MobaXterm、Xshell等軟件直接鏈接,有工具的話會節省不少時間。
對於GitHub、GitLab等也會使用密鑰文件的方式,將公鑰上傳到服務器便可。
以GitLab爲例,能夠看到,要求上傳ssh-rsa或ssh-ed25519的公鑰。客戶端生成密鑰對時,可使用-t參數,選擇ed25519,也可以使用默認的rsa方式。
帳號密碼簡單時也可被暴力破解。
關於這兩個協議的安全實驗,將在學習暴力破解的時候再展現。
參考《計算機網絡第7版 謝希仁》6.3
《TCP/IP詳解I》第26章