1. 程式人生 > 其它 >SSH 教程-1 客戶端 配置 [MD]

SSH 教程-1 客戶端 配置 [MD]

博文地址

我的GitHub 我的部落格 我的微信 我的郵箱
baiqiantao baiqiantao bqt20094 [email protected]

目錄

目錄

SSH 教程 -1

本文改編自 網道的 SSH 教程,主要為了精簡大量本人不感興趣的內容。

本教程約定,大寫的 SSH 表示協議,小寫的 ssh 表示客戶端軟體。

SSH 基本知識

SSH 是 Linux 系統的登入工具,現在廣泛用於伺服器登入和各種加密通訊。

SSH(Secure Shell)是一種網路協議,用於加密兩臺計算機之間的通訊,並且支援各種身份驗證機制。

它主要用於保證遠端登入和遠端通訊的安全,任何網路服務都可以用這個協議來加密。

它還能對操作者進行認證(authentication)和授權(authorization)。明文的網路協議可以套用在它裡面,從而實現加密。

SSH 發展歷史

  • 1995年,芬蘭赫爾辛基工業大學的研究員 Tatu Ylönen 設計了 SSH 協議的第一個版本 SSH 1,同時寫出了第一個實現 SSH1。
  • 1996年,又提出了 SSH 2 協議,這個協議與1.0版不相容,1998年推出了軟體實現 SSH2。但是,官方的 SSH2 軟體是一個專有軟體,不能免費使用。
  • 1999年,OpenBSD 的開發人員寫了一個 SSH 2 協議的開源實現,這就是 OpenSSH 專案。目前,Linux 的所有發行版幾乎都自帶 OpenSSH。

SSH 軟體架構

SSH 的軟體架構是伺服器-客戶端模式(Server - Client):

  • 向伺服器發出請求的部分,稱為客戶端,OpenSSH 的實現為 ssh
  • 接收客戶端發出的請求的部分,稱為伺服器,OpenSSH 的實現為 sshd

OpenSSH 還提供一些輔助工具軟體(比如 ssh-keygen 、ssh-agent)和專門的客戶端工具(比如 scp 和 sftp)。

SSH 客戶端

OpenSSH 的客戶端是二進位制程式 ssh

。Linux 系統一般都自帶 ssh,如果沒有就需要安裝。

where ssh   # 檔案位置【C:\Windows\System32\OpenSSH\ssh.exe】
ssh -V      # 檢視版本【OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2】

sudo apt install openssh-client   # Ubuntu 和 Debian 上安裝
sudo dnf install openssh-clients  # CentOS 和 Fedora 上安裝

連線流程

ssh 最常見的用途就是登入伺服器,這要求伺服器安裝並正在執行 SSH 伺服器軟體。

ssh -l user host  # 登入伺服器,host 可以是主機名、網站域名、IP 地址,等價於【ssh user@host】
ssh host          # 不指定使用者名稱時,將使用客戶端的當前使用者名稱($USER),作為遠端伺服器的登入使用者名稱
ssh -p 8821 host  # 指定伺服器埠,不指定時預設連線伺服器的22埠

首次連線確認

ssh 連線遠端伺服器後,首先有一個驗證過程,驗證遠端伺服器是否為陌生地址。

如果是第一次連線某一臺伺服器,命令列會顯示一段文字,表示不認識這臺機器,提醒使用者確認是否需要連線。

ssh -T [email protected]   # 測試連線伺服器

The authenticity of host 'github.com (20.205.243.166)' cannot be established 確定的.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

其中的 fingerprint 指的是 SSH 伺服器公鑰的雜湊值。每臺 SSH 伺服器都有唯一一對金鑰,用於跟客戶端通訊,其中公鑰的雜湊值就可以用來識別伺服器。

檢視公鑰的指紋

下面的命令可以檢視某個公鑰的指紋。

ssh-keygen -l -f ~/.ssh/id_rsa.pub  # 檢視公鑰的指紋

3072 SHA256:H28XXrWfd9GCnV8wpWI9p51SlgdaOnzS/kOJsrLIhpA [email protected] (RSA)

儲存公鑰的指紋

ssh 會將本機成功連線過的所有伺服器公鑰的指紋,都儲存在本機的~/.ssh/known_hosts檔案中。每次連線伺服器時,通過該檔案判斷是否為陌生主機(陌生公鑰)。

在上面這段文字後面,輸入yes,就可以將當前伺服器的指紋也儲存在本機~/.ssh/known_hosts檔案中,並顯示下面的提示。以後再連線的時候,就不會再出現警告了。

Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
Hi baiqiantao! You have successfully authenticated 認證, but GitHub does not provide shell access.

然後,客戶端就會跟伺服器建立連線。接著,ssh 就會要求使用者輸入所要登入賬戶的密碼。使用者輸入並驗證密碼正確以後,就能登入遠端伺服器的 Shell 了。

伺服器金鑰變更

如果伺服器的金鑰發生變更(比如重灌了 SSH 伺服器),客戶端再次連線時,就會發生公鑰指紋不吻合的情況。這時,客戶端就會中斷連線,並顯示一段警告資訊。

這時,你需要確認是什麼原因使得公鑰指紋發生變更,到底是惡意劫持,還是管理員變更了 SSH 伺服器公鑰。

如果新的公鑰確認可以信任,你可以執行下面的命令,將原來的公鑰指紋從~/.ssh/known_hosts檔案刪除。

ssh-keygen -R github.com  # 刪除 known_hosts 中指定主機公鑰的指紋,也可以手動修改此檔案

刪除了原來的公鑰指紋以後,重新執行 ssh 命令連線遠端伺服器,將新的指紋加入known_hosts檔案,就可以順利連線了。

執行遠端命令

SSH 登入成功後,使用者就進入了遠端主機的命令列環境,所看到的提示符,就是遠端主機的提示符。這時,你就可以輸入想要在遠端主機執行的命令。

另一種執行遠端命令的方法,是將命令直接寫在ssh命令的後面。

採用這種語法執行命令時,ssh 客戶端不會提供互動式的 Shell 環境,而是直接將遠端命令的執行結果輸出在命令列。但是,有些命令需要互動式的 Shell 環境,這時就要使用-t引數。

ssh user@host command     # 登入遠端主機成功後,立刻在遠端主機上執行命令
ssh -t user@host command  # 在 ssh 直接執行遠端命令時,提供一個互動式 Shell

加密引數集

SSH 連線的握手階段,客戶端必須跟服務端約定 加密引數集(cipher suite)。

加密引數集格式

加密引數集包含了若干不同的加密引數,它們之間使用下劃線連線在一起,下面是一個例子。

例如:TLS_RSA_WITH_AES_128_CBC_SHA

  • TLS:加密通訊協議
  • RSA:金鑰交換演算法
  • AES:加密演算法
  • 128:加密演算法的強度
  • CBC:加密演算法的模式
  • SHA:數字簽名的 Hash 函式

確認加密引數集

下面是一個例子,客戶端向伺服器發出的握手資訊。

Handshake protocol: ClientHello
    Version: TLS 1.2
    Random
        Client time: May 22, 2030 02:43:46 GMT
        Random bytes: b76b0e61829557eb4c611adfd2d36eb232dc1332fe29802e321ee871
    Session ID: (empty)
    Cipher Suites
        Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
        ...
    Compression methods ...
    Extensions ...

上面的握手資訊(ClientHello)之中,Cipher Suites欄位就是客戶端列出可選的加密引數集,伺服器在其中選擇一個自己支援的引數集。

伺服器選擇完畢之後,向客戶端發出迴應。

Handshake protocol: ServerHello
    Version: TLS 1.2
    Random
        Server time: Mar 10, 2059 02:35:57 GMT
        Random bytes: 8469b09b480c1978182ce1b59290487609f41132312ca22aacaf5012
    Session ID: 4cae75c91cf5adf55f93c9fb5dd36d19903b1182029af3d527b7a42ef1c32c80
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    Compression method: null
    Extensions ...

上面的迴應資訊(ServerHello)中,Cipher Suite欄位就是伺服器最終選定的加密引數。

ssh 命令列配置項

配置項解釋

-c:指定加密演算法
-C:表示壓縮資料傳輸
-D:指定本機的 Socks 監聽埠,該埠收到的請求,都將轉發到遠端的 SSH 主機,又稱動態埠轉發
-f:表示 SSH 連線在後臺執行
-F:指定配置檔案
-i:指定私鑰,預設值為~/.ssh/id_dsa~/.ssh/id_rsa,對應的公鑰必須存放到伺服器
-l:指定遠端登入的賬戶名
-L:設定本地埠轉發
-m:指定校驗資料完整性的演算法(MAC,message authentication code)
-N:表示建立的 SSH 只用於埠轉發,不能執行遠端命令,這樣可以提供安全性
-o:用來指定一個配置命令
-p:指定 SSH 客戶端連線的伺服器埠
-q:表示安靜模式(quiet),不向使用者輸出任何警告資訊
-R:指定遠端埠轉發
-t:在 ssh 直接執行遠端命令時,提供一個互動式 Shell
-v:顯示詳細資訊
-V:輸出 ssh 客戶端的版本
-X:表示開啟 X 視窗轉發

配置項案例

ssh -c xx,yy host   # 指定使用加密演算法 xx 或 yy,等價於【ssh -c xx -c yy host】
ssh -C host         # 壓縮資料傳輸
ssh -F ~/.ssh/xx    # 使用指定的配置檔案
ssh -i my-key host  # 指定私鑰
ssh -l user host    # 指定遠端登入的賬戶名,等同於【ssh user@host】
ssh -m xx,yy host   # 指定資料校驗演算法(MAC)為xx 或 yy
ssh -o "Key Value"  # 指定一個配置命令,等價於【ssh -o Key=Value】,等號前後不能有空格
ssh -p 2035 host    # 指定連線伺服器的2035埠
ssh –q host         # 安靜模式,不向使用者輸出任何警告資訊
ssh -t host cmd     # 在 ssh 直接執行遠端命令時,提供一個互動式 Shell
ssh -v host         # 可以重複多次,表示資訊的詳細程度,比如【-vv】和【-vvv】
ssh -V              # 輸出 ssh 客戶端的版本:OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
ssh -X host         # 開啟 X 視窗轉發
ssh -2 host         # -1 引數指定使用 SSH 1 協議,-2 引數指定使用 SSH 2 協議
ssh -4 host         # -4 指定使用 IPv4 協議(預設值),-6 指定使用 IPv6 協議

埠轉發相關

ssh -N host                     # 表示建立的 SSH 只用於埠轉發,不能執行遠端命令,這樣可以提供安全性
ssh -D 1080 host                # 動態埠轉發:將本機 1080 埠收到的請求,都轉發到伺服器 host
ssh -L 9999:server:80 user@host # 本地埠轉發
# 所有發向本地 9999 埠的請求,都會經過 host 發往 server 的 80 埠,相當於直接連上了 server 的 80 埠
ssh -R 9999:server:902 local    # 遠端埠轉發,需在跳板伺服器(即 local)執行此命令
# 指定本地計算機 local 監聽自己的 9999 埠,所有發向這個埠的請求,都會轉向 server 的 902 埠

配置檔案

  • /etc/ssh/ssh_config:全域性對 SSH 客戶端的配置檔案
  • ~/.ssh/config:使用者個人對 SSH 客戶端的配置檔案,優先順序高於全域性配置檔案
  • ~/.ssh/known_hosts:使用者信任的 SSH 伺服器的公鑰指紋
  • ~/.ssh/id_rsa~/.ssh/id_rsa.pub:用於 SSH 協議版本2 的 RSA 私鑰/公鑰
  • ~/.ssh/identity~/.ssh/identity.pub:用於 SSH 協議版本1 的 RSA 私鑰/公鑰
  • ~/.ssh/id_ecdsa~/.ssh/id_ecdsa.pub:使用者的 ECDSA 私鑰/公鑰

配置檔案語法

使用者個人的配置檔案~/.ssh/config,可以按照不同伺服器,列出各自的連線引數,從而不必每一次登入都輸入重複的引數。下面是一個例子。

# 以 # 開頭的行表示註釋,空行等同於註釋,不允許行尾註釋
# Host 的值可以使用萬用字元,【*.edu】表示下面的設定只對一級域名為 .edu 的主機有效
# Host 命令後面的所有配置,都是針對該主機的,直到下一個 Host 命令為止

Host *                 # 表示下面的配置對所有的主機都有效,值可以被單個主機的設定覆蓋
  Port 8022            # 表示所有主機的預設連線埠都是8022,這裡的縮排並不是必需的
  User = baiqiantao    # 配置命令與值之間,可以使用空格或等號(等號前後的空格是可選的)

Host github            # 表示下面的設定只對主機 github(這只是一個別名) 生效
  HostName github.com  # 具體的主機由 HostName 指定
  User git             # 像 github、gitlab、gitee 等 git 系統,使用者名稱都是 git
  Port 22              # 指定埠,會覆蓋上面的設定
  IdentityFile ~/.ssh/id_rsa_github   # 指定私鑰檔案

以後,登入github.com時,只要執行ssh github命令,就會自動套用 config 檔案裡面指定的引數。

ssh github   # 等同於【ssh -p 22 -i ~/.ssh/id_rsa_github [email protected]

主要配置命令

下面是 ssh 客戶端的一些主要配置命令,以及它們的範例值。

  • AddressFamily inet:表示只使用 IPv4 協議。如果設為inet6,表示只使用 IPv6 協議。
  • BindAddress 192.168.10.235:指定本機的 IP 地址(如果本機有多個 IP 地址)。
  • CheckHostIP yes:檢查 SSH 伺服器的 IP 地址是否跟公鑰資料庫吻合。
  • Ciphers blowfish,3des:指定加密演算法。
  • Compression yes:是否壓縮傳輸訊號。
  • ConnectionAttempts 10:客戶端進行連線時,最大的嘗試次數。
  • ConnectTimeout 60:客戶端進行連線時,伺服器在指定秒數內沒有回覆,則中斷連線嘗試。
  • DynamicForward 1080:指定動態轉發埠。
  • GlobalKnownHostsFile /users/smith/.ssh/my_global_hosts_file:指定全域性的公鑰資料庫檔案的位置。
  • Host host:指定連線的域名或 IP 地址,也可以是別名,支援萬用字元。
  • HostKeyAlgorithms ssh-dss,ssh-rsa:指定金鑰演算法,優先順序從高到低排列。
  • HostName myhost:在Host命令使用別名的情況下,HostName指定域名或 IP 地址。
  • IdentityFile keyfile:指定私鑰檔案。
  • LocalForward 2001 localhost:143:指定本地埠轉發。
  • LogLevel QUIET:指定日誌詳細程度。如果設為QUIET,將不輸出大部分的警告和提示。
  • MACs hmac-sha1,hmac-md5:指定資料校驗演算法。
  • NumberOfPasswordPrompts 2:密碼登入時,使用者輸錯密碼的最大嘗試次數。
  • PasswordAuthentication no:指定是否支援密碼登入。這裡只是客戶端禁止,真正的禁止需要在 SSH 伺服器設定。
  • Port 2035:指定客戶端連線的 SSH 伺服器埠。
  • PreferredAuthentications publickey,hostbased,password:指定各種登入方法的優先順序。
  • Protocol 2:支援的 SSH 協議版本,多個版本之間使用逗號分隔。
  • PubKeyAuthentication yes:是否支援金鑰登入。這裡只是客戶端設定,還需要在 SSH 伺服器進行相應設定。
  • RemoteForward 2001 server:143:指定遠端埠轉發。
  • SendEnv COLOR:SSH 客戶端向伺服器傳送的環境變數名,多個環境變數之間使用空格分隔。環境變數的值從客戶端當前環境中拷貝。
  • ServerAliveCountMax 3:如果沒有收到伺服器的迴應,客戶端連續傳送多少次keepalive訊號才斷開連線。預設值為3。
  • ServerAliveInterval 300:客戶端建立連線後,如果在給定秒數內,沒有收到伺服器發來的訊息,客戶端向伺服器傳送keepalive訊息。如果不希望客戶端傳送,這一項設為0
  • StrictHostKeyChecking yesyes表示嚴格檢查,伺服器公鑰為未知或發生變化,則拒絕連線。no表示如果伺服器公鑰未知,則加入客戶端公鑰資料庫,如果公鑰發生變化,不改變客戶端公鑰資料庫,輸出一條警告,依然允許連線繼續進行。ask(預設值)表示詢問使用者是否繼續進行。
  • TCPKeepAlive yes:客戶端是否定期向伺服器傳送keepalive資訊。
  • User userName:指定遠端登入的賬戶名。
  • UserKnownHostsFile /users/smith/.ssh/my_local_hosts_file:指定當前使用者的known_hosts檔案(伺服器公鑰指紋列表)的位置。
  • VerifyHostKeyDNS yes:是否通過檢查 SSH 伺服器的 DNS 記錄,確認公鑰指紋是否與known_hosts檔案儲存的一致。

2021-12-11

本文來自部落格園,作者:白乾濤,轉載請註明原文連結:https://www.cnblogs.com/baiqiantao/p/15676656.html