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)。這些配置可能包含:
- ProxyJump (跳板機):需要透過一台或多台跳板機才能存取目標內網伺服器。
- ProxyCommand:使用第三方認證工具(如 Cloudflare Access, AWS SSM)建立連線。
- IdentityFile:針對不同主機使用不同的金鑰檔案。
- 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 協議握手,建立代理連線。