跳到主要內容

首頁 / 部落格 / 規則分流

用 PROCESS-NAME 規則讓指定程式單獨走代理

規則分流2026-06-221765 字約 4 分鐘
用 PROCESS-NAME 規則讓指定程式單獨走代理

有時候分流的依據不是「訪問哪個網域」,而是「哪個程式在訪問」。比如:只讓某個開發工具走代理,或者禁止 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

兩者的區別PROCESS-NAME只匹配可執行檔名Telegram.exe同名程式都會命中寫起來簡單PROCESS-PATH匹配完整路徑C:\\Apps\\Telegram\\Telegram.exe精確到某個安裝位置防止同名程式誤命中
日常用 NAME,有同名衝突時用 PATH

Mihomo 還支援 PROCESS-NAME-REGEXPROCESS-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,🚀 节点选择

注意順序:更具體的組合規則要放在單一規則前面。

效能考量

行程規則比網域規則貴得多。每次匹配都要:

一次行程規則匹配的開銷拿到連接的本地連接埠來自封包查系統連接表找出哪個 PID 持有這個連接埠查行程資訊PID → 可執行檔案路徑比對規則字串匹配
前兩步是系統調用,在連接數很多時會明顯拖慢

最佳化建議:

降低開銷的做法用 strict 而不是 always —— 只在需要時查把行程規則放在規則列表靠後的位置 —— 讓大部分流量在前面就命中能用網域規則表達的就別用行程規則避免 PROCESS-NAME-REGEX,正則比字串比對慢連接數極多的場景(BT、P2P)儘量用連接埠規則代替

各平台的支援情況

平台支援備註
Windows✅ 完整需要 exe 名,注意大小寫
macOS✅ 完整可能需要額外權限
Linux✅ 完整需要讀 /proc 權限
Android⚠️ 部分用「分應用代理」更合適
軟路由/閘道流量來自其他設備,無本機行程

Android 上不要用行程規則——CMFA 和 FlClash 都提供了圖形化的「分應用代理」,按包名選擇,比寫規則準確也省事。

排查:規則不生效

按順序檢查find-process-mode 是不是 off —— 最常見原因行程名拼寫對不對(含 .exe、大小寫)連接頁的「行程」列有沒有值 —— 沒有說明根本沒查到行程流量是不是真的到了核心 —— 系統代理模式下命令列工具不走核心這條規則前面有沒有更寬泛的規則截胡了是不是在軟路由

最快的驗證方法:把 find-process-mode 設成 always,打開連接頁,讓程式聯網,看「行程」列。

  • 列是空的 → 核心查不到行程,檢查權限
  • 列有值但和你寫的規則不一致 → 照著列裡顯示的改規則
  • 列有值且一致,但「規則」列顯示命中了別的規則 → 規則順序問題,用 prepend-rules 提前

小結

  • find-process-mode: strict 是前置條件,不開一切白搭
  • 行程名從連接頁抄,別靠猜
  • 系統代理模式下命令列工具的流量到不了核心,行程規則只在 TUN 下對它們有效
  • 閘道場景用 SRC-IP-CIDR,行程規則在那裡無效
  • 行程規則開銷較大,放靠後位置,能用網域規則就別用它

相關:規則類型速查開發工具代理速查


相關文件