在天文化
有限公司

一行指令連線 Proxmox 主機與內網 VM:SSH 金鑰+別名+ProxyJump 設定教學

管理家裡的 Proxmox VE(PVE)主機時,每次連線都要打一長串 ssh -p 2222 myuser@example.com,再輸入一次密碼;想進到主機裡面的 VM,還得先登入主機、再跳一次。這篇教你用「SSH 金鑰」加上「~/.ssh/config 別名」,把這些步驟縮成一行指令。

完成後的效果

要做的事設定前設定後
連線到 PVE 主機ssh -p 2222 myuser@example.com,再輸入密碼ssh my-pve
連線到內網 VM先登入 PVE,再 ssh myuser@192.168.1.50,再輸入一次密碼ssh my-vm
傳檔案到 VM先傳到 PVE,再從 PVE 傳到 VMscp file.txt my-vm:/tmp/

文中使用的都是範例值,請換成你自己的:

  • PVE 主機對外網址:example.com,SSH 埠:2222
  • 登入帳號:myuser
  • 內網 VM 的 IP:192.168.1.50
  • 金鑰檔名:~/.ssh/homelab_ed25519

適用環境:macOS、Linux 內建的 OpenSSH 都可以直接使用。Windows 10/11 也內建 OpenSSH,請在 PowerShell 中操作,不同的地方文中會另外說明。

步驟一:產生 SSH 金鑰

在你自己的電腦(不是伺服器)上執行:

ssh-keygen -t ed25519 -f ~/.ssh/homelab_ed25519 -C "homelab"

過程中會詢問密語(passphrase)。設定密語會更安全,就算私鑰外流,別人也無法直接使用;如果想完全免輸入,可以直接按 Enter 留空。

執行完成後會產生兩個檔案:

  • ~/.ssh/homelab_ed25519:私鑰,只能留在你的電腦上,絕對不要給任何人。
  • ~/.ssh/homelab_ed25519.pub:公鑰,要放到伺服器上的就是這個。

步驟二:把公鑰放到 PVE 主機

macOS/Linux 使用 ssh-copy-id,這是最後一次需要輸入密碼:

ssh-copy-id -i ~/.ssh/homelab_ed25519.pub -p 2222 myuser@example.com

Windows 沒有 ssh-copy-id,改在 PowerShell 執行:

type $env:USERPROFILE\.ssh\homelab_ed25519.pub | ssh -p 2222 myuser@example.com "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

接著測試能不能用金鑰登入,不再詢問密碼就代表成功:

ssh -i ~/.ssh/homelab_ed25519 -p 2222 myuser@example.com

步驟三:建立 SSH 別名

用文字編輯器打開(或新建)~/.ssh/config,Windows 的位置是 C:\Users\你的帳號\.ssh\config:

nano ~/.ssh/config

加入以下內容:

Host my-pve
  HostName example.com
  Port 2222
  User myuser
  IdentityFile ~/.ssh/homelab_ed25519
  IdentitiesOnly yes

各欄位的意思:

欄位說明
Host別名,之後就打 ssh my-pve。名稱可以自己取,建議不要跟真實網域同名,避免混淆。
HostName真正要連的網址或 IP。
PortSSH 埠號,預設是 22 時可以省略。
User登入帳號。
IdentityFile要使用的私鑰。
IdentitiesOnly yes只使用上面指定的金鑰。電腦裡有很多把金鑰時,可以避免一把一把亂試,導致被伺服器拒絕。

macOS/Linux 存檔後,記得把設定檔權限設成只有自己能讀寫:

chmod 600 ~/.ssh/config

測試別名:

ssh my-pve

步驟四:透過 PVE 主機直連內網 VM

PVE 上的 VM 通常只有內網 IP,外面連不進去。用 ProxyJump 就能讓 SSH 自動「經過」PVE 主機,一行指令直接連到 VM。在 ~/.ssh/config 再加入:

Host my-vm
  HostName 192.168.1.50
  User myuser
  ProxyJump my-pve
  IdentityFile ~/.ssh/homelab_ed25519
  IdentitiesOnly yes

ProxyJump my-pve 的意思是「先連到 my-pve,再從那裡連到 192.168.1.50」。這裡直接使用上一步建立的別名,所以 PVE 的網址、埠號、金鑰都不用再寫一次。

接著把公鑰也放進 VM。因為別名已經設定好跳板,ssh-copy-id 會自動經過 PVE 主機,只需要輸入一次 VM 的密碼:

ssh-copy-id -i ~/.ssh/homelab_ed25519.pub my-vm

完成後測試:

ssh my-vm

為什麼用 ProxyJump?VM 不需要對外開放任何埠,私鑰也只留在你自己的電腦上,不必複製到 PVE 主機。整段連線從頭到尾都是加密的,比把私鑰放在跳板主機上,或使用 agent forwarding 更安全。

別名不只用在 ssh

只要是走 SSH 的工具,都能直接使用這些別名:

# 直接在遠端執行一個指令
ssh my-pve 'uptime'

# 傳檔案到內網 VM(自動經過 PVE)
scp backup.tar.gz my-vm:/tmp/

# 同步資料夾
rsync -av ./website/ my-vm:/var/www/html/

VS Code 的 Remote-SSH 擴充套件也會讀取 ~/.ssh/config,連線選單裡會直接出現 my-pve、my-vm,點一下就能遠端編輯 VM 裡的檔案。

疑難排解

錯誤訊息或狀況可能原因解決方法
Permission denied (publickey)公鑰沒有放進去,或伺服器上的權限不對在伺服器執行 chmod 700 ~/.ssh 和 chmod 600 ~/.ssh/authorized_keys;再用 ssh -v my-pve 查看實際用了哪把金鑰
Too many authentication failures電腦裡金鑰太多,SSH 一把一把試,超過伺服器允許的次數在別名中加上 IdentitiesOnly yes
Bad owner or permissions on ~/.ssh/config設定檔權限太寬鬆chmod 600 ~/.ssh/config
別名沒生效,或連到錯的埠號~/.ssh/config 是由上往下讀,同一個項目以第一個符合的設定為準。前面如果有 Host * 或同名網域的區塊設定了 Port,就會蓋過你的設定用 ssh -G my-pve 查看最終套用的設定;別名取一個不會和網域重複的名字
ssh my-vm 連不上跳板主機本身就連不上,或 VM 的 IP 錯誤先確認 ssh my-pve 能用;再登入 PVE 確認 VM 的 IP。ProxyJump 需要 OpenSSH 7.3 以上版本

安全建議

  • 私鑰不要外流。建議幫私鑰設定密語;macOS 可以在 ~/.ssh/config 的別名中加上 UseKeychain yes 和 AddKeysToAgent yes,讓系統鑰匙圈記住密語,不用每次輸入。
  • 確認金鑰可以登入後,可以考慮關閉密碼登入。在伺服器的 /etc/ssh/sshd_config 設定 PasswordAuthentication no,就能擋掉暴力破解密碼的攻擊。修改前請先另外開一個已經登入的視窗,再重新啟動 sshd,萬一設定錯誤還能救回來;PVE 主機也請確認有螢幕、鍵盤或其他方式可以直接操作,以免把自己鎖在外面。
  • 把 SSH 改成非 22 的埠號只能減少被自動掃描的雜訊,不能取代金鑰認證。

結語

設定一次 SSH 金鑰和別名,之後管理 PVE 主機和裡面的每一台 VM,都只要一行短指令,不用再記埠號、IP,也不用一直輸入密碼。家裡的 VM 越多,這個設定就越省時間。

贊(0) 抖內一下
未經允許請勿轉載在天文化有限公司 » 一行指令連線 Proxmox 主機與內網 VM:SSH 金鑰+別名+ProxyJump 設定教學

評論 搶沙發

  • 暱稱 (必填)
  • 信箱 (必填)
  • 網址

台灣PAY掃一掃斗內我

WordPress Appliance - Powered by TurnKey Linux