需求通常很具體。某個網站被訂閱裡的規則送去了代理,登入老是要驗證碼;或者某個工具站直連打不開,你想單獨把它拉出來走節點。這兩件事都不用換訂閱、不用改策略群組,一行就夠。
規則從上往下讀,第一條命中就停
核心收到一個請求,會按 rules 清單的順序逐條比對,命中哪條就把連線交給那條指定的目標,然後立刻停下,後面的一律不看。所以規則表不是一堆條件的集合,是一條有先後的流水線。想明白這點,你面對一條新規則時關心的東西會從「寫得對不對」變成「它頭上壓著誰」。
rules:
- DOMAIN-SUFFIX,github.com,PROXY
- DOMAIN-KEYWORD,steamcommunity,PROXY
- DOMAIN,ocsp.apple.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- PROCESS-NAME,Telegram.exe,PROXY
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
合作推薦訂閱連結從哪來?本站合作機場註冊即送 1GB 香港高速體驗流量,可直接一鍵匯入。取得高速節點
真正會用到的幾種規則類型
DOMAIN:完全比對。DOMAIN,example.com只管 example.com 這一個名字,www.example.com是另一個名字,不會命中。DOMAIN-SUFFIX:這個網域連同它所有子網域。最常用的一種,一行就把 api、cdn、img 這些前綴全收進來。DOMAIN-KEYWORD:網域裡含有某段字串就算命中。方便,也最容易誤傷——寫google會順手把一堆和你無關的主機也拖進來。IP-CIDR與IP-CIDR6:按位址段比對。用來處理內網位址,以及那些根本不帶網域的連線。GEOIP:按 IP 歸屬的國家比對,判斷依據是本機那份 GeoIP 資料庫。PROCESS-NAME:按發起連線的程式比對,和對面是誰完全無關。DST-PORT:按目標連接埠比對,適合把 SMTP 或者某個遊戲用的連接埠單獨安排。
每行最後那一段是目標:可以是策略群組的名字,必須和 proxy-groups 裡寫的一模一樣,多一個空格、少一個 emoji 都會讓設定載入失敗;也可以直接寫 DIRECT 或 REJECT。IP 類規則後面還能再掛一個 no-resolve。不加它的話,一個帶網域的請求得先解析出 IP 才有東西可比,代價是雙份的:多等一次查詢,而且你本想避開的那次解析照樣發了出去。
位置錯了,等於沒寫
最常見的失敗長這樣:規則加在清單末尾、MATCH 上面,看著整齊,實際永遠輪不到。訂閱產生的規則表裡,前面通常已經排著幾十上百條 geosite 規則和一條 GEOIP,CN,DIRECT,你要處理的那個網域早被其中某條領走了。自訂規則的位置應該在所有可能搶先命中它的規則之前,落到實處基本就是整個 rules 的最前面。想知道是誰搶的,去連線頁點開那條連線,用戶端會顯示它命中了哪條規則。
一個網站到底要加哪些網域
- 打開用戶端的連線頁,把既有連線清空,讓清單安靜下來。
- 在瀏覽器裡開目標網站,正常操作一遍:登入、翻頁、點開圖片、讓影片跑兩秒。
- 回到連線頁,看這幾秒裡冒出來的主機名稱。一個頁面通常牽扯三類網域——主網域、放靜態資源的 CDN 網域、後端 API 網域,後兩者經常是完全不相干的名字。
- 只加主網域是最常見的半成品:頁面能開,圖片一直轉圈,或者登入介面逾時。三類都覆蓋到,這條規則才算寫完。
按程式名稱分流
PROCESS-NAME 比對的是發起連線的執行檔,適合「這個軟體不管連哪都走代理」這種需求。兩個平台寫法不同:Windows 上帶副檔名,例如 Telegram.exe;macOS 和 Linux 上寫執行檔本身的名字,不帶後綴。另外核心得先看得見處理程序資訊才談得上比對,某些平台上這要求用戶端跑在足夠的權限下,或者需要在設定裡打開對應的開關。拿不到處理程序名稱時這條規則不會報錯,只是安靜地永遠不命中。
改完之後
存檔後讓核心重新載入設定——用戶端一般在設定頁上有重新載入的按鈕,把這份設定切走再切回來也一樣。接著是很多人栽的一步:已經建立的連線不會改道。TCP 連線走哪條路在交握那一刻就定死了,之後你改規則它收不到。瀏覽器還在重用之前的 keep-alive 連線,你重新整理十次看到的都是舊路徑。測試前先去連線頁把相關連線斷掉,頑固的就把分頁關掉重開。