SSH
部分內容由 LLM 生成,尚未經過人工驗證。
SSH(Secure Shell)是遠端連線的加密協定,預設使用 Port 22。
完整連線流程
sequenceDiagram
participant C as Client
participant S as Server
Note over C,S: 事前設定(一次性)
Note over C: ssh-keygen 產生金鑰對<br/>id_ed25519(私鑰,留本機)<br/>id_ed25519.pub(公鑰)
C->>S: ssh-copy-id / 手動複製 id_ed25519.pub
Note over S: 將公鑰附加至<br/>~/.ssh/authorized_keys
Note over C,S: TCP 連線建立
C->>S: TCP SYN (Port 22)
S->>C: TCP SYN-ACK + SSH banner(版本號)
Note over C,S: Host Key 驗證(防中間人攻擊)
S->>C: 伺服器 Host Public Key 指紋
alt 第一次連線
Note over C: 詢問使用者是否信任此指紋<br/>(yes → 存入 known_hosts)
else 已知伺服器
Note over C: 比對 ~/.ssh/known_hosts<br/>吻合則繼續,不符則警告中斷
end
Note over C,S: 金鑰交換(KEX)
C->>S: 支援的 KEX 演算法清單(ECDH / DH)
S->>C: 選定演算法 + 伺服器公鑰
Note over C,S: ECDH 交換,雙方各自計算<br/>相同的 Session Key(AES-256 等對稱加密)
Note over C,S: 之後所有通訊皆以 Session Key 加密
Note over C,S: 使用者身份驗證
C->>S: 請求以公私鑰驗證(傳送公鑰 fingerprint)
S->>C: 查詢 authorized_keys,公鑰存在則發送 Challenge(隨機 nonce)
Note over C: 以私鑰對 Challenge 簽名
C->>S: 簽名結果
Note over S: 以已存公鑰驗證簽名
S->>C: 驗證成功,開放 Shell
金鑰生成
# 生成 ed25519 金鑰對(推薦)
ssh-keygen -t ed25519 -C "your@email.com"
# 指定輸出路徑(多組金鑰時用)
ssh-keygen -t ed25519 -f ~/.ssh/my_server_key -C "my-server"
# RSA(相容舊系統)
ssh-keygen -t rsa -b 4096 -C "your@email.com"| 選項 | 說明 |
|---|---|
-t | 演算法類型(ed25519 / rsa) |
-b | 金鑰位元數(RSA 用,建議 4096) |
-C | 註解,嵌入 .pub 中,方便識別金鑰用途 |
-f | 指定輸出檔名 |
產生後的檔案:
| 檔案 | 說明 |
|---|---|
~/.ssh/id_ed25519 | 私鑰,絕不外流,chmod 600 |
~/.ssh/id_ed25519.pub | 公鑰,複製至伺服器 |
Passphrase:生成時可設定,為私鑰加上額外加密層。即使私鑰檔遭竊,無 passphrase 仍無法使用。
演算法比較
| ed25519 | RSA 4096 | |
|---|---|---|
| 安全性 | 高(橢圓曲線) | 高 |
| 金鑰長度 | 短(256 bit) | 長(4096 bit) |
| 速度 | 快 | 較慢 |
| 相容性 | 需較新 OpenSSH | 廣泛相容 |
| 建議 | 優先使用 | 相容舊系統時用 |
部署公鑰至伺服器
方法一:ssh-copy-id(推薦)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host自動將公鑰附加至伺服器 ~/.ssh/authorized_keys,並設定正確權限。
方法二:手動
# 一行指令複製
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"或手動將 .pub 內容貼入伺服器的 ~/.ssh/authorized_keys。
伺服器端權限(必須正確,否則 SSH 拒絕讀取):
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys金鑰驗證相關檔案
| 檔案 | 位置 | 說明 |
|---|---|---|
| 私鑰 | ~/.ssh/id_ed25519 | 留在本機,chmod 600,絕不外流 |
| 公鑰 | ~/.ssh/id_ed25519.pub | 複製到目標伺服器 |
authorized_keys | 伺服器 ~/.ssh/ | 存放允許登入的公鑰(一行一個) |
known_hosts | 本機 ~/.ssh/ | 記錄已信任的伺服器指紋,防中間人攻擊 |
config | 本機 ~/.ssh/config | 多組金鑰或主機別名設定 |
~/.ssh/config 範例(管理多組金鑰):
Host my-server
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/my_server_key
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519_github常用指令
# 連線
ssh user@host
# 指定私鑰
ssh -i ~/.ssh/my_key user@host
# 使用 config 別名
ssh my-server
# 複製公鑰到伺服器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
# 測試連線(verbose,除錯用)
ssh -v user@host
# Local Port Forwarding(本地 8080 → 遠端 80)
ssh -L 8080:localhost:80 user@host
# 背景執行 + 不開 shell(搭配 port forwarding)
ssh -fN -L 8080:localhost:80 user@host