遠端連線伺服器在提供你由遠端透過文字或圖形介面的方式來登入系統,讓你在遠端的工作機前面登入 Linux 主機以取得可操控主機之介面 (shell),而登入後的操作感覺上就像坐在系統前面一樣。
以鳥哥個人為例,目前鳥哥管理十幾部的Unix-Like主機,這些主機都不放在同一個地方,分佈在南台灣各處! 那麼當有新的軟體的漏洞被發佈,或者是需要進行一些額外的設定的時候,是否鳥哥本人一定要到現場嗎?當然不需要, 只要透過網路連線到該主機上面,就可以進行任何工作了!真的就好像在主機前面工作一般的輕鬆愉快!這就是遠端連線伺服器啦!
你可以將你研究室最快的那一部主機開放出來,設定一下遠端連線伺服器,讓你的學生,或者是研究室的同仁啦, 可以透過這部機器幫他們進行研究的工作,這個時候,你的主機就可以讓多人進行分享 Linux 運算的功能。
(Unix Like指的是源自於Unix的OS,如Linux, Mac OS X...等)
在一般對網際網路開放服務的伺服器中,由於開放的服務可能會有較為重要的資訊,而遠端連線程式連進主機之後, 可以進行的工作又太多了(幾乎就像在主機前面工作一般),因此伺服器的遠端連線程式通常僅針對少部分系統維護者開放而已! 除非必要,否則 Server 類型的主機還真的不建議開放連線的服務!
所謂的工作站就是不提供網際網路服務的主機,因為它沒有提供常見的網路服務!不過必須要提供給使用者登入的權限,這樣大家才用的到運算功能啊!此時你就得要針對內部,或者是特定的某些來源開放他們使用你的工作站。
在文字介面登入的連線伺服器,主要有以『明碼』傳送資料的telnet伺服器,及以加密技術進行資料加密再傳送的 SSH 伺服器!雖然telnet可以支援的用戶端軟體比較多,不過由於它是使用明碼來傳送資料,你的資料很容易遭到有心人士的擷取! 所以近來我們都呼籲大家多使用 SSH 這一種連線方式。
所謂的明碼就是: 『當我們的資料封包在網路上傳輸時,該資料封包的內容為資料的原始格式』,也就是說,你使用 telnet 登入遠端主機時,不是得要輸入帳號密碼嗎?那你的帳號密碼是以原本的資料格式傳輸, 所以如果被類似 tcpdump 之類的監聽軟體擷取資料, 那你的帳密就有可能被竊取。
SSH是Secure SHell protocol的簡寫(安全的殼程式協定),它可以透過資料封包加密技術,將等待傳輸的封包加密後再傳輸到網路上, 因此,資料訊息當然就比較安全。
特別注意:這個 SSH 協定,在預設的狀態中,本身就提供兩個伺服器功能:
目前常見的網路封包加密技術通常是藉由所謂的『非對稱金鑰系統』來處理的。主要是透過兩把不一樣的公鑰與私鑰(Public and Private Key)來進行加密與解密的過程。由於這兩把鑰匙是提供加解密的功用, 所以在同一個方向的連線中,這兩把鑰匙當然是需要成對的!它的功用分別如下:
由於每部主機都應該有自己的金鑰 (公鑰與私鑰),且公鑰用來加密而私鑰用來解密, 其中私鑰不可外流。但因為網路連線是雙向的,所以,每個人應該都要有對方的『公鑰』。
如上圖所示,我們如果站在用戶端的角度來看,那麼,首先你必須要取得伺服器端的公鑰,然後將自己的公鑰發送給伺服器端,最終在用戶端上面的金鑰會是『伺服器的公鑰加上用戶端我自己的私鑰』來組成的。
目前 SSH 的協定版本有兩種,分別是version 1與version 2,其中V2由於加上了連線檢測的機制,可以避免連線期間被插入惡意的攻擊碼,因此比V1還要更加的安全。所以囉,請盡量使用V2版本即可,不要使用V1囉。
在上述的第 4 步驟中,用戶端的金鑰是隨機運算產生於本次連線當中的,所以你這次的連線與下次的連線的金鑰可能就會不一樣。
目前的 Linux Distributions當中,都是預設啟動SSH的,所以一點都不麻煩,因為不用去設定,他就已經啟動了。弱要直接啟動就是以 SSH daemon ,簡稱為 sshd 來啟動的,所以,手動可以這樣啟動:
我們可以看到,sshd 可以同時提供 shell 與 ftp 喔!而且都是架構在 port 22 上面的。
ssh :直接登入遠端主機的指令
一般使用 ssh 登入遠端主機,都會填寫『ssh帳號@主機IP』的格式,意思是說,使用該主機的某帳號登入的意思。但是很多朋友都不喜歡寫帳號,亦即使用『ssh主機IP』的格式。如同上面的範例情況。要注意喔,如果不寫帳號的話,那麼會以本地端電腦的帳號來嘗試登入遠端。也就是說,如果近端與遠端具有相同的帳號,那麼不寫帳號也沒有關係,如上表中的範例。但是,為了以後習慣著想,還是一開始就使用類似email的方式來登入遠端主機,這樣的行為習慣比較好。
上面出現的訊息中,開頭RSA的那行後面接的就是遠端伺服器的公鑰指紋碼,如果確定該指紋碼沒有問題,那麼你就得要輸入 yes 來將該指紋碼寫入伺服器公鑰記錄檔(~/.ssh/known_hosts),以方便未來比對該伺服器的正確性之用。
由於該主機的公鑰已經被記錄,因此未來重複使用 ssh 登入此主機時,就不會出現這個指紋碼提示了。
上述的範例當中,第4個範例最有用!如果你想要讓遠端主機進行關機的指令,如果不加上-f 的參數,那你會等待對方主機關機完畢再將你踢出連線,這比較不合理。因此,加上-f就很重要~因為你會指定遠端主機自己跑關機, 而不需要在空空等待。例如:『ssh -f root@some_IP shutdown -h now 』之類的指令囉。
加上這個 StrictHostKeyChecking=no,ssh會不詢問自動加入主機的公鑰到檔案中,對於一般使用者幫助不大,對於程式腳本來說, 這玩意兒可就很不錯用了。
當你登入遠端伺服器時,本機會主動的用接收到的伺服器的public key去比對~/.ssh/known_hosts有無相關的公鑰, 然後進行底下的動作:
雖然說伺服器的 ssh 通常可能會改變,問題是,如果是測試用的主機,因此常常在重新安裝,那麼伺服器的公鑰肯定經常不同, 果真如此的話,你就無法繼續登入了,以下是解決方案。
如果你只是想要從遠端伺服器下載或上傳檔案呢?那就不是使用ssh啦,而必須要使用sftp或scp。這兩個指令也都是使用 ssh 的通道 (port 22),只是模擬成 FTP 與複製的動作而已。
接下來FTP的部分老師可能不太會考,因為這章主要的重點是ssh, 如果想要準備完整點的同學,下面有連結。
http://linux.vbird.org/linux_server/0310telnetssh.php#sftp