有時候分流的依據不是「訪問哪個網域」,而是「哪個程式在訪問」。比如:只讓某個開發工具走代理,或者禁止 BT 用戶端走代理。
這就要用行程規則。
前置條件:開啟 find-process-mode
這是最常見的「規則寫了不生效」的原因。
find-process-mode: strict三種取值:
| 值 | 行為 | 開銷 |
|---|---|---|
off | 完全不查行程,行程規則全部失效 | 無 |
strict(推薦) | 只在有行程規則時才查 | 低 |
always | 每個連接都查,日誌裡能看到行程名 | 較高 |
設成 always 的好處是連接頁的「行程」列始終有資料,排查時很方便;代價是每個連接都要查一次系統行程表。
基本寫法
rules:
- PROCESS-NAME,Telegram.exe,🚀 节点选择
- PROCESS-NAME,qbittorrent.exe,DIRECT
- PROCESS-PATH,/usr/local/bin/curl,🚀 节点选择PROCESS-NAME vs PROCESS-PATH
Mihomo 還支援 PROCESS-NAME-REGEX 和 PROCESS-PATH-REGEX:
- PROCESS-NAME-REGEX,(?i)^(chrome|msedge)\.exe$,🚀 节点选择
- PROCESS-PATH-REGEX,(?i).*\\JetBrains\\.*,🚀 节点选择怎麼查行程名
方法一:連接頁直接看(最快)
把 find-process-mode 設成 always,打開 Clash Verge 的 連接 頁,讓那個程式聯一次網,「行程」列裡顯示的就是準確的行程名。
這是最可靠的方法——不用猜,直接抄。
方法二:任務管理器 / 活動監視器
Windows:任務管理器 → 詳細資訊分頁,「名稱」列就是行程名。
macOS:活動監視器 → 雙擊行程 → 看「行程名稱」。
Linux:ps -e -o comm= 列出所有行程名。
方法三:命令列
# Windows:列出所有正在聯網的行程
Get-NetTCPConnection -State Established |
Select-Object -Property OwningProcess -Unique |
ForEach-Object { (Get-Process -Id $_.OwningProcess).ProcessName }# macOS / Linux
lsof -i -P -n | awk '{print $1}' | sort -u實用場景
一、BT / PT 用戶端強制直連
很多訂閱服務的條款禁止 BT 流量,走代理可能導致封號。同時 BT 走代理也確實浪費流量。
prepend-rules:
- PROCESS-NAME,qbittorrent.exe,DIRECT
- PROCESS-NAME,Transmission.exe,DIRECT
- PROCESS-NAME,aria2c.exe,DIRECT
- PROCESS-NAME,BitComet.exe,DIRECT
- PROCESS-NAME,uTorrent.exe,DIRECT
- PROCESS-NAME,deluge.exe,DIRECT配合連接埠規則雙保險:
- DST-PORT,6881-6889,DIRECT二、開發工具走代理
prepend-rules:
- PROCESS-NAME,git.exe,🚀 节点选择
- PROCESS-NAME,node.exe,🚀 节点选择
- PROCESS-NAME,python.exe,🚀 节点选择
- PROCESS-NAME,docker.exe,🚀 节点选择
- PROCESS-NAME,go.exe,🚀 节点选择三、游戲平台走特定節點
prepend-proxy-groups:
- name: "🎮 游戏"
type: fallback
include-all: true
filter: "(?i)IPLC|专线|游戏|game"
interval: 300
prepend-rules:
- PROCESS-NAME,steam.exe,🎮 游戏
- PROCESS-NAME,Battle.net.exe,🎮 游戏
- PROCESS-NAME,EpicGamesLauncher.exe,🎮 游戏四、国內軟體強制直連
某些国產軟體走代理會出問題(地區限制、風控):
prepend-rules:
- PROCESS-NAME,WeChat.exe,DIRECT
- PROCESS-NAME,DingTalk.exe,DIRECT
- PROCESS-NAME,QQ.exe,DIRECT
- PROCESS-NAME,cloudmusic.exe,DIRECT
- PROCESS-NAME,BaiduNetdisk.exe,DIRECT五、和其他條件組合
只有某個程式訪問某個網段時才走代理:
- AND,((PROCESS-NAME,Telegram.exe),(IP-CIDR,91.108.4.0/22)),🚀 节点选择某個程式訪問境外時走代理,訪問国內直連:
- AND,((PROCESS-NAME,chrome.exe),(GEOIP,CN)),DIRECT
- PROCESS-NAME,chrome.exe,🚀 节点选择注意順序:更具體的組合規則要放在單一規則前面。
效能考量
行程規則比網域規則貴得多。每次匹配都要:
最佳化建議:
各平台的支援情況
| 平台 | 支援 | 備註 |
|---|---|---|
| Windows | ✅ 完整 | 需要 exe 名,注意大小寫 |
| macOS | ✅ 完整 | 可能需要額外權限 |
| Linux | ✅ 完整 | 需要讀 /proc 權限 |
| Android | ⚠️ 部分 | 用「分應用代理」更合適 |
| 軟路由/閘道 | ❌ | 流量來自其他設備,無本機行程 |
Android 上不要用行程規則——CMFA 和 FlClash 都提供了圖形化的「分應用代理」,按包名選擇,比寫規則準確也省事。
排查:規則不生效
最快的驗證方法:把 find-process-mode 設成 always,打開連接頁,讓程式聯網,看「行程」列。
- 列是空的 → 核心查不到行程,檢查權限
- 列有值但和你寫的規則不一致 → 照著列裡顯示的改規則
- 列有值且一致,但「規則」列顯示命中了別的規則 → 規則順序問題,用
prepend-rules提前
小結
find-process-mode: strict是前置條件,不開一切白搭- 行程名從連接頁抄,別靠猜
- 系統代理模式下命令列工具的流量到不了核心,行程規則只在 TUN 下對它們有效
- 閘道場景用 SRC-IP-CIDR,行程規則在那裡無效
- 行程規則開銷較大,放靠後位置,能用網域規則就別用它
相關文件
十幾種規則類型的語法、匹配邏輯與效能開銷對照表,講清楚 no-resolve 的作用、規則順序為什麼決定一切,以及怎麼用連接頁反查命中了哪條規則。
用外部規則集替代幾百條手寫規則。講清楚 domain/ipcidr/classical 三種 behavior 的差異、text 與 yaml 格式、更新間隔怎麼設,以及規則集不生效時怎麼查。