常看到各種高階的網絡應用教程,比如穿透內網、跨系統網絡連接等,會提到一個單詞——SSH。尤其是在Linux類的設備或相關設置中,要修改網絡、遠程控制之類的操作,幾乎都會涉及到SSH操作。那么這個SSH究竟是什么呢?
這事兒就得說到互聯網上的設備通信了,它們既需要保密,又需要方便,還得互相兼容,所以對加密處理有一定的要求。解決方式就是使用各個平臺都支持得協議,它們既能加密又帶有快捷的內置認證技術,例如rlogin、Telnet、FTP或者rsh之類的,SSH也是這種協議,而且安全性比較突出。
由于優勢突出,所以SSH目前已經成為了Linux系統和很多設備,比如路由器操作系統的標準配置。它既可以用于計算機之間的加密登錄,也支持隧道協議、端口映射和X11連接,借助SFTP或SCP協議還可以傳輸文件,應用范圍特別廣。所以我們只要進行網絡設置,就經常會碰到SSH協議,比如很多小伙伴進行遠程控制時需要“穿透”內網的時候。
SSH的工作原理在不同的應用中有所區別,不過大致方式差不多,就是服務器啟動的時候自己產生一個密鑰(768bit公鑰),本地的SSH客戶端發送連接請求到SSH服務器,服務器檢查連接客戶端發送的數據和IP地址,確認合法后發送密鑰給客戶端,此時客戶端將本地私鑰(256bit)和服務器的公鑰結合成密鑰對key(1024bit)并發回給服務器端。
具體來說,在使用SSH登錄工具時,SSH客戶端的登錄方式是這樣的:
ssh user@remote -p port
其中“user”是你在遠程機器上的用戶名,如果不指定的話默認為當前用戶;“remote”則是遠程機器的地址,可以是IP地址(局域網)、域名(局域網、廣域網);最后的“port”是指SSH服務器端監聽端口,如果不指定的話就為默認值22(SSH協議專用端口)。這樣的登錄命令執行后,再依據提示確認公鑰、輸入私鑰就可以了。
從安全性角度上看這樣的“雙保險”可以最大限度確保SSH的安全性連接,但是它也造成了不必要的麻煩——驗證公鑰,輸入私鑰這樣繁瑣的操作。其實,這些也可以通過SSH的客戶端軟件實現免密鑰登錄的。我們就以Windows平臺下的Putty(SSH登錄工具)舉例說明。
除了打開putty的界面外,我們還可以新建一個Putty的快捷方式,然后右鍵單擊該快捷方式,然后選擇“屬性”,在“目標”欄中添加“ -ssh -l root -P 22 123.123.123.123 -pw 456”。注意添加時要在putty.exe后連接一個空格,端口號“22”,其后的IP地址或域名都可根據實際情況修改;最后在-pw后輸入目標電腦的SSH密碼就行了。
設置完畢點擊確定,并雙擊這個快捷方式,它便可以自動連接到指定好的目標主機SSH上,再確認保存一下公鑰,日后使用就完全不需要輸入用戶名密碼了,非常方便。當然,這只是SSH最基本的登錄方法,具體要實現何種操作,則是根據你輸入的命令來決定的,有興趣的小伙伴不妨多多摸索。
、SSH的基本概念
SSH(Secure Shell)是一種加密的網絡協議,用于在不安全的網絡中為網絡服務提供安全的傳輸環境。SSH通過在網絡中創建加密的“隧道”來保護數據,使得用戶可以在本地計算機上安全地訪問遠程計算機。
二、SSH的準備工作
確保遠程服務器已安裝SSH服務:大多數Linux和Unix系統都默認安裝了SSH服務,但如果是Windows系統,可能需要手動安裝OpenSSH Server。
獲取遠程服務器的IP地址、用戶名和密碼(或密鑰):這是連接遠程服務器所必需的。
三、SSH的基本使用方法
1. 口令登錄
口令登錄是最常見的SSH登錄方式。具體步驟如下:
打開終端(在Linux或Mac上)或命令提示符/PowerShell(在Windows上,如果已安裝SSH客戶端)。
輸入SSH命令并跟上遠程服務器的用戶名、IP地址和端口號(如果端口號是默認的22,則可以省略)。例如:ssh username@192.168.1.100 -p 22。
系統會提示你輸入遠程服務器的密碼。輸入后,如果密碼正確,你就可以成功登錄到遠程服務器了。
2. 密鑰登錄(免密登錄)
密鑰登錄是一種更加安全的登錄方式,因為它不需要在每次連接時都輸入密碼。具體步驟如下:
生成密鑰對:在本地計算機上,使用ssh-keygen命令生成SSH密鑰對。這個命令會生成一個私鑰(保存在~/.ssh/id_rsa)和一個公鑰(保存在~/.ssh/id_rsa.pub)。
將公鑰復制到遠程服務器:你可以使用ssh-copy-id命令將公鑰復制到遠程服務器的~/.ssh/authorized_keys文件中。如果遠程服務器上沒有這個文件,ssh-copy-id會自動創建它。
使用密鑰登錄:之后,當你再次嘗試使用SSH連接到遠程服務器時,SSH客戶端會自動使用私鑰進行身份驗證,而無需輸入密碼。
四、SSH的高級用法
1. 使用SSH配置文件
你可以通過編輯~/.ssh/config文件來簡化SSH命令的輸入。在這個文件中,你可以為不同的遠程服務器設置別名、端口號、用戶名等信息。例如:
bash
復制
Host myserver
HostName 192.168.1.100
Port 22
User username
IdentityFile ~/.ssh/id_rsa
配置完成后,你只需要輸入ssh myserver就可以連接到遠程服務器了。
2. SSH端口轉發
SSH還提供了端口轉發的功能,這可以讓你通過SSH隧道將本地計算機的端口轉發到遠程計算機上。這個功能在需要訪問遠程計算機上的服務但又不能直接訪問時非常有用。
五、SSH的安全設置
為了確保SSH連接的安全性,你應該采取以下措施:
禁用密碼登錄:在SSH服務器的配置文件中(通常是/etc/ssh/sshd_config),將PasswordAuthentication設置為no,以禁用密碼登錄。
限制可登錄的用戶:在SSH服務器的配置文件中,使用AllowUsers指令來指定哪些用戶可以通過SSH登錄到服務器。
定期更新SSH軟件:及時安裝SSH軟件的更新和補丁,以修復已知的安全漏洞。
文分享自華為云社區《ssh 遠程連接方式總結-云社區-華為云》,作者:嵌入式視覺。
SSH(安全外殼協議 Secure Shell Protocol,簡稱SSH)是一種加密的網絡傳輸協議,用于在網絡中實現客戶端和服務端的連接,典型的如我們在本地電腦通過 SSH連接遠程服務器,從而做開發,Windows、macOS、Linux都有自帶的 SSH 客戶端,但是在Windows上使用 SSH 客戶端的體驗并不是很好,所以我們一般使用 Xshell 來代替。
為了建立 SSH 遠程連接,需要兩個組件:客戶端和相應服務端組件,SSH 客戶端是我們安裝在本地電腦的軟件;而服務端,也需有一個稱為 SSH 守護程序的組件,它不斷地偵聽特定的 TCP/IP 端口以獲取可能的客戶端連接請求。 一旦客戶端發起連接,SSH 守護進程將以軟件和它支持的協議版本作為響應,兩者將交換它們的標識數據。如果提供的憑據正確,SSH 會為適當的環境創建一個新會話。
MacOS 系統自帶 SSH 客戶端,可以直接使用,Windows 系統需要安裝 Xshell 客戶端軟件,大部分 Linux 發行版系統都自帶 SSH 客戶端,可以直接使用,可通過 ssh -V 命令查看當前系統是否有 SSH 客戶端。
[root@VM-0-2-centos ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
Linux 系統檢查 ssh 服務端是否可用的命令有好幾種,比如直接看是否有 ssh 進程在運行:
ps -ef | grep ssh
運行以上后,輸出結果示例如下,有 sshd 進程在運行,說明 ssh 服務端可用。
-bash-4.3$ ps -e|grep ssh
336 ? 00:00:00 sshd
358 ? 00:00:00 sshd
1202 ? 00:00:00 sshd
1978 ? 00:00:00 sshd
1980 ? 00:00:00 sshd
2710 ? 00:00:00 sshd
2744 ? 00:00:00 sshd
2829 ? 00:00:00 sshd
2831 ? 00:00:00 sshd
9864 ? 00:00:00 sshd
9893 ? 00:00:02 sshd
對于 Ubuntu 系統,可通過以下命令檢查 OpenSSH 服務端軟件是否可用:
ssh localhost # 不同 Linux 系統輸出可能不一樣
典型用法,只需輸入以下命令即可連接遠程服務器。
# ssh連接默認端口是22,如果本地機用戶名和遠程機用戶名一致,可以省略用戶名
ssh username@host
# 也可以指定連接端口
ssh -p port user@host
上述命令是典型的 SSH 連接遠程服務器的命令,如果是第一次連接運行后會得到以下提示,正常輸入 yes,然后輸入賬號密碼即可連接成功:
The authenticity of host '81.69.58.141 (81.69.58.141)' can't be established.
ED25519 key fingerprint is SHA256:QW5nscbIadeqedp7ByOSUF+Z45rxWGYJvAs3TTmTb0M.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Last login: Tue Feb 28 15:33:06 2023 from xx.xx.xx.xx
前面的命令是通過密碼(私鑰)登錄,這樣比較麻煩,因為每次登錄我們都需要輸入密碼,因此我們可以選擇 SSH 的公鑰登錄連接方式,省去輸入密碼的步驟。
公鑰登錄的原理,是先在本地機器上生成一對公鑰和私鑰,然后手動把公鑰上傳到遠程服務器。這樣每次登錄時,遠程主機會向用戶發送一段隨機字符串,而用戶會用自己的私鑰對這段隨機字符串進行加密,然后把加密后的字符串發送給遠程主機,遠程主機會用用戶的公鑰對這段字符串進行解密,如果解密后的字符串和遠程主機發送的隨機字符串一致,那么就認為用戶是合法的,允許登錄。
只需要把私鑰傳給遠程服務器,遠程服務器就可以驗證私鑰是否是對應的公鑰,如果是就允許登錄,這樣就不需要輸入密碼了。
SSH 支持多種用于身份驗證密鑰的公鑰算法, 包括 RSA、DSA、ECDSA 和 ED25519 等,其中 RSA 算法是最常用的,因為它是 SSH 協議的默認算法,所以我們這里以 RSA 算法為例來生成密鑰,并配置免密碼遠程連接。
ssh-keygen 是為 SSH 創建新的身份驗證密鑰對的工具。此類密鑰對用于自動登錄、單點登錄和驗證主機,常用參數定義如下:
基于公鑰登錄連接的具體步驟如下:
1,本地終端運行 ssh-keygen -t rsa -b 4096 命令生成密鑰對,運行后會提示輸入密鑰保存路徑,直接回車即可,保存在默認路徑下,然后會提示輸入密鑰密碼,這里我們不設置密碼,直接回車即可,然后會提示再次輸入密碼,這里也不設置密碼,直接回車即可,最后會提示密鑰生成成功,如下圖所示,可以看出 ~/.ssh/ 目錄下,會新生成兩個文件:id_rsa.pub 和 id_rsa,分別是公鑰和私鑰文件。
2,將本地 .ssh 目錄下的 id_rsa.pub 文件內容添加到目標服務器的 ~/.ssh/authorized_keys 文件中,如果目標服務器沒有 .ssh 目錄,需要先創建 .ssh 目錄,然后再創建 authorized_keys 文件,然后再添加文件內容。
具體操作命令如下:
# 1,本地終端運行命令
cat ~/.ssh/id_rsa.pub # 查看本地公鑰文件內容,并復制
# 2,遠程終端運行命令,有 authorized_keys 文件則跳過
mkdir -p ~/.ssh # 創建 .ssh 目錄
touch ~/.ssh/authorized_keys # 創建 authorized_keys 文件
# 3,然后將本地公鑰文件內容粘貼到 `authorized_keys` 文件中,保存退出
如果覺得上述步驟太過繁瑣,可通過下面命令,一鍵完成公鑰登錄連接的配置:
$ ssh username@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
只要將公鑰文件內容寫入遠程服務器的 authorized_keys 的文件,公鑰登錄的設置就完成了,后續遠程連接就不用每次輸入密碼了!
Github 提交代碼的時候,也是通過公鑰登錄連接的方式,只要將本地的公鑰文件內容添加到 github 的 authorized_keys 文件中,就可以免密碼提交代碼了,原理是一模一樣的。
VSCode 也支持遠程連接,可以通過 Remote-SSH 插件來實現,具體操作步驟如下:
1,在 VSCode 中安裝 Remote-SSH 插件。
2,windows 系統 ctrel + shift + p 命令打開命令面板,輸入 Remote-SSH: Connect to Host...,然后選擇 SSH Configuration,或者通過左側菜單欄的 Remote Explorer -> SSH Targets -> SSH Configuration 進入。如下圖所示:
3,然后會打開 ~/.ssh/config 配置文件,可以參考如下所示模板進行配置:
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host JumpMachine
HostName jump-vscode.sensetime.com
# 你跳板機的用戶名
User username
Host T4
# 目標機的ip地址
HostName xxx.xxx.xxx.xxx
# 你目標機的用戶名
User username
# 目標機登錄端口
Port 22
# macos系統: ProxyCommand ssh -q -W %h:%p JumpMachine
ProxyCommand ssh -q -W %h:%p JumpMachine
4,本地機生產公鑰并追加到遠程服務器 authorized_keys 中的步驟,參考第三章。
5,配置完成后,保存退出,然后在 VSCode 中,點擊左側菜單欄的 Remote Explorer -> SSH Targets -> T4,即可連接到遠程服務器。
關注#華為云開發者聯盟# 點擊下方,第一時間了解華為云新鮮技術~
華為云博客_大數據博客_AI博客_云計算博客_開發者中心-華為云