跳到主要内容

Mihomo SSH 配置別名支援

· 阅读需 3 分钟

🔗 專案資訊

  • Fork 儲存庫: https://github.com/iuin8/mihomo
  • 分支: (請確保查看包含 ssh-config-alias 功能的分支, 例如: ssh_system_v1.19.17)
  • 核心檔案: adapter/outbound/ssh.go, adapter/outbound/ssh_system.go

📖 需求背景

在複雜的網路環境中,使用者往往已經維護了一套完善的 SSH 配置檔案 (~/.ssh/config)。這些配置可能包含:

  1. ProxyJump (跳板機):需要透過一台或多台跳板機才能存取目標內網伺服器。
  2. ProxyCommand:使用第三方認證工具(如 Cloudflare Access, AWS SSM)建立連線。
  3. IdentityFile:針對不同主機使用不同的金鑰檔案。
  4. Host 別名:使用簡短的別名代替長 IP 或網域。

原有的 Mihomo SSH 轉接器使用 Go 語言原生 SSH 函式庫,無法直接利用這些系統級配置,導致使用者必須把複雜的跳板邏輯手動轉換為 Mihomo 的代理鏈(Dialer Proxy),配置繁瑣且不支援部分高級指令(如特殊的 ProxyCommand)。

目標:讓 Mihomo 可以直接"借用"系統 SSH 用戶端的能力,只需填一個主機別名(如 my-server),剩下的認證、跳轉全交給系統 SSH 處理。

✨ 功能特性

1. 完整 SSH Config 支援

透過呼叫系統 ssh 命令建立通道,Mihomo 可以支援系統 SSH 用戶端支援的所有指令:

  • ProxyJump / JumpHost
  • ProxyCommand (支援 cloudflared, nc 等)
  • IdentityFile, User, Port 等自動讀取
  • Match, Include 等高級配置邏輯

2. 智慧用戶切換 (sudo -u)

Mihomo 通常以 root 權限執行(為了 TUN 模式等),而使用者的 SSH 配置位於普通使用者目錄下。本功能實現了:

  • 自動檢測或指定實際使用者。
  • 使用 sudo -u <user> -i 切換身份執行 SSH。
  • -i 參數確保載入用戶的完整登錄環境(PATH),保證 cloudflared 等命令可被找到。

3. 零配置密鑰

無需在 Mihomo 配置檔案中填入私鑰內容,它會自動讀取 ~/.ssh/id_rsa 或配置中指定的 IdentityFile

🚀 使用方式

參數說明

欄位說明
type必須為 ssh
server關鍵:填寫 ~/.ssh/config 中的 Host 別名
port注意:填寫目標服務內部監聽埠(通常是 22)。
⚠️ 不要填 ~/.ssh/config 中的映射埠。
use-ssh-config-alias設定為 true 開啟此功能
ssh-user指定本地執行 SSH 命令的用戶名(你的 macOS/Linux 用戶名)

配置示例

場景 1:基礎跳板機 (ProxyJump)

SSH Config (~/.ssh/config):

Host bastion
HostName 1.2.3.4
User admin

Host internal-db
HostName 10.0.0.5
User root
ProxyJump bastion # 自動經過 bastion 跳轉

Mihomo 配置:

proxies:
- name: "Internal-DB-SSH"
type: ssh
server: "internal-db" # 直接填別名
port: 22 # 目標內部 SSH 埠
use-ssh-config-alias: true
ssh-user: "your-username" # 你的本地用戶名

場景 2:Cloudflare Access (ProxyCommand)

SSH Config:

Host my-cf-server
HostName ssh.example.com
User root
# 需要 cloudflared 命令在 PATH 中
ProxyCommand cloudflared access ssh --hostname %h

Mihomo 配置:

proxies:
- name: "CF-SSH"
type: ssh
server: "my-cf-server"
port: 22
use-ssh-config-alias: true
ssh-user: "your-username"

🛠 原理簡述

Mihomo 收到連線請求後,會在底層執行類似以下的命令:

sudo -u your-username -i ssh -W localhost:22 my-host-alias

這條命令會建立一個標準輸入/輸出到目標 SSH 埠的 TCP 隧道。Mihomo 隨後在這個隧道上進行自己的 SSH 協議握手,建立代理連線。