有段时间没写代理/网络工具相关的文章了。新年将近,正好把我一直在用的 Surge(iOS) 配置体系整理成一篇:能照抄、也能看懂原理的自用教程。
最近这一年多我基本只在 Mac + iPhone 上折腾网络环境,Windows / Android 用得不多了。后续大概也是以 Surge 上的折腾为主。
说明:本文以 Surge iOS 的配置文件结构为主,按我的理解拆成四块来讲: [General] / [Proxy Group] / [Rule] / [Proxy]。 你也可以按自己习惯调整顺序,但核心逻辑不变。
1.General #
General 我更倾向于按「场景」来讲:你关心的不是“Surge 有哪些开关”,而是“我该不该开、什么时候会踩坑”。
1.1 观测 & 排错相关 #
loglevel = notify
show-error-page-for-reject = trueloglevel(日志输出等级) 我一般用 notify。日常够用。show-error-page-for-reject(REJECT 时显示 Surge 错误页) 这个只影响**纯 HTTP(非 HTTPS)**请求:当命中REJECT策略时,Surge 会给浏览器返回一张“错误网页”,让你更直观地知道是被规则拒绝了。跟我一致开启就行
1.2 网络体验相关(Wi-Fi / 蜂窝切换) #
wifi-assist = true
all-hybrid = falsewifi-assist(“Wi-Fi 助手”) 打开后,Wi-Fi 质量很差时 Surge 会更积极地帮你把连接切到蜂窝,适合家里 Wi-Fi 覆盖不完整、走动容易掉速的场景。all-hybrid(Wi-Fi + 蜂窝双通道并发) 这个更“激进”:不是等 Wi-Fi 差了再切,而是始终同时用 Wi-Fi 和蜂窝去建立连接(包括 TCP 连接和 DNS)。 体验会更稳,但代价也更大——流量消耗会明显增加,所以除非你流量基本不限,否则不建议开。
1.3 共享代理相关(让别的设备也能用你的 Surge) #
allow-wifi-access = true
allow-hotspot-access = trueallow-wifi-access(局域网共享) 允许同一局域网里的其他设备访问 Surge 的代理服务(本质就是“把 iPhone 当一个局域网代理服务器”)。allow-hotspot-access(热点共享) 当你开启个人热点时,允许连你热点的设备访问 Surge 的代理服务。
这里容易误会的一点: 开了共享 ≠ 别人自动Proxy上网。 对方设备仍然需要在 Wi-Fi/系统代理里,把代理地址指向你的 iPhone(以及对应端口),否则它只是“连上热点上网”,并不会自动走 Surge。
1.4 IPv6 相关(两个开关的区别) #
ipv6 = false
ipv6-vif = disabled这两个名字很像,但控制的东西不一样:
ipv6(DNS 解析是否查询 AAAA) 开启后,Surge 的 DNS 会在解析域名时同时查 A + AAAA;关闭则只查 A(IPv4)。 我没 V6 需求,所以设为false。ipv6-vif(Surge VIF 是否承载 IPv6) 这是“更底层”的开关:它决定 Surge 的虚拟网卡(VIF)要不要配置 IPv6,让 Surge 能接管/处理连接到 IPv6 地址的原始 TCP 连接。 我目前同样设为disabled。
一句话总结:ipv6 更像“DNS 层面要不要解析 IPv6”;ipv6-vif 更像“隧道/接管层面要不要让 VIF 具备 IPv6 能力”。
1.5 连通性 & 代理测速(URL / UDP) #
test-timeout = 2
internet-test-url = http://connectivitycheck.platform.hicloud.com/generate_204
proxy-test-url = http://latency-test.skk.moe/endpoint
proxy-test-udp = [email protected]这一组参数我一般归类为「健康检查 + 节点测速」:Surge 会用它们来判断“当前网络有没有网”、以及“某个代理/策略组延迟怎么样”。
test-timeout(测试超时,单位:秒) 这是连通性/测速等待的最长时间:超过这个时间还没结果,就会被判定为失败。internet-test-url(Internet 连通性测试 URL)使用 skk 的 https://lab.skk.moe/test-204 选择一条测出来最快的 url 即可。
proxy-test-url(代理延迟/可用性测试 URL) 用于节点/策略组测速(url-test 这类)。没特殊需求跟我一致即可。proxy-test-udp(UDP 测试参数) 建议直接使用www.apple.com
1.6 DNS #
exclude-simple-hostnames = true
dns-server = system
encrypted-dns-server = quic://223.5.5.5, quic://223.6.6.6, https://1.12.12.12/dns-query, https://120.53.53.53/dns-query
hijack-dns = 8.8.8.8:53, 8.8.4.4:53exclude-simple-hostnames(排除简单主机名) 像nas、printer这种不带点的主机名,不走公网 DNS 解析。dns-server(DNS 服务器)这边我写
system,是因为我使用加密 DNS。如果配置了加密 DNS,传统 DNS 将仅用作解析 DOH 域名和测试网络连通性。如果你网络环境文明,那么不需要加密 DNS ,那么直接使用 system 即可。encrypted-dns-server(加密 DNS 上游) 主要就是让 DNS 走 DoH/DoQ,减少明文污染/劫持风险。按你所在网络稳定性挑上游即可。hijack-dns(DNS 劫持) 这边是为了解决 Google 部分产品强制使用 8.8.8.8 和 8.8.4.4,未能使用 Surge DNS 的问题。
1.7 跳过代理(哪些目标不走代理) #
skip-proxy = 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 162.14.0.0/16, 211.99.96.0/19, 162.159.192.0/24, 162.159.193.0/24, 162.159.195.0/24, fc00::/7, fe80::/10, localhost, *.local, captive.apple.com, passenger.t3go.cn, *.ccb.com, wxh.wo.cn, *.abcchina.com, *.abcchina.com.cnskip-proxy(跳过代理 / 强制直连) 在 Surge iOS 里,写进skip-proxy的 IP 段和域名会不走任何 Proxy / Proxy Group,而是直接由 Surge 的 VIF 虚拟网卡按“直连”方式处理(也就是绕过代理链路)。
1.8 Always Real IP #
这部分请直接安装 skk 的模块 当surge 命中列表内的域名,在 DNS 解析时强制返回 Real IP,而不是 Fake IP。
1.9 UDP 不支持时的处理策略 #
udp-policy-not-supported-behaviour = REJECTudp-policy-not-supported-behaviour(UDP 不支持时怎么处理) 当当前选用的策略/节点不支持 UDP 转发时,直接REJECT:避免 UDP 流量回落到直连,导致“漏流量 / 暴露真实 IP”。
1.10 远程控制(HTTP API / Web 面板) #
http-api = [email protected]:6171
http-api-web-dashboard = true我会使用到小麦的Dashboard,如果没有这方面需求,可以注释。
2. Proxy Group #
我划分代理组时会先问自己三个问题:
国家分组肯定是需要的,那你实际会用到哪些国家?
哪些分流值得单独拎出来(比如 Telegram、AIGC)?
有没有“特殊节点”(Emby/低倍/家宽)需要保留一个入口?
理顺这三个问题,Proxy Group 很快就成型了。
开始之前,先说明几个常用参数:
update-interval:订阅更新间隔,单位秒 多久从订阅链接拉取一次最新节点。我建议直接-1就是用不更新。当前提是你的订阅足够稳定;不稳定就自己改成合适的周期。policy-regex-filter:正则匹配 这是为了后面划分一些特定分组来使用,比如划分国家分组include-all-proxies:包含 [Proxy] 部分定义的所有代理策略 把[Proxy]里的节点聚合起来了,如果你都是单节点的话,这个非常好用include-other-group:包含[Proxy Group]里的分组 有时候可能需要聚合多个你自己写的[Proxy Group]里的分组,可以使用这个参数policy-path:订阅链接
2.1 订阅入口 / 聚合组 #
# 订阅链接
🚀 我的节点 = select,policy-path=https://sub.store/download/my,update-interval=-1
# 聚合[Proxy]
🚀 ALL-Proxy = select,include-all-proxies=1
# 只要[Proxy]里的部分节点
🚀 Select-Proxy = select,Proxy A,Proxy B...一般对于绝大多数人,以上的三种写法应该就够用了。
有订阅就用 policy-path
有手写节点就用 include-all-proxies
只想挑几个固定节点就写 select, A, B, C
2.2 国家分组(推荐用 smart) #
节点里国家这么多,分流的时候肯定是需要有特定的国家需求,我的做法是:国家分组只负责“筛选”,策略组再负责“选择”。
这边无非通过正则筛选分组policy-regex-filter,以及一个小小的include-other-group指向上面的外部订阅组即可
一般我涉及到的场景会用到的国家其实就3个🇭🇰、🇯🇵、🇺🇸 其他我基本都不会使用到,不过为了让大家有一些感觉,我把3个扩展成5个,具体如下:
🇭🇰 香港 = smart,include-other-group=🚀 我的节点,policy-regex-filter=(🇭🇰|香港|[Hh][Kk])
🇨🇳 台湾 = smart,include-other-group=🚀 我的节点,policy-regex-filter=(🇨🇳|台湾|[Tt][Ww])
🇺🇸 美国 = smart,include-other-group=🚀 我的节点,policy-regex-filter=(🇺🇸|美国|[Uu][Ss])
🇯🇵 日本 = smart,include-other-group=🚀 我的节点,policy-regex-filter=(🇯🇵|日本|[Jj][Pp])
🇸🇬 新加坡 = smart,include-other-group=🚀 我的节点,policy-regex-filter=(🇸🇬|新加坡|[Ss][Gg])我这里国家分组用的是 smart(Surge 的智能策略组): 日常不用纠结选哪条,Surge 会自动挑一个相对稳定且延迟舒服的。
备注:正则尽量“够用就好”。只要能覆盖你订阅里的命名习惯即可,不需要写到很复杂。
2.3 分流策略组(推荐用 select) #
分流策略组我更建议 select:明确、可控、需要时随时手动切换。
🎯 节点选择 = select,🇭🇰 香港,🇺🇸 美国,🇯🇵 日本,🇨🇳 台湾,🇸🇬 新加坡,DIRECT
✈️ 电报信息 = select,🎯 节点选择,🇭🇰 香港,🇯🇵 日本,🇸🇬 新加坡,🇺🇸 美国
🤖 AIGC = select,🇺🇸 美国,🇯🇵 日本
Ⓜ️ 微软服务 = select,DIRECT,🎯 节点选择,🇭🇰 香港,🇺🇸 美国,🇯🇵 日本,🇨🇳 台湾,🇸🇬 新加坡
🍎 苹果服务 = select,DIRECT,🎯 节点选择,🇭🇰 香港,🇯🇵 日本,🇺🇸 美国,🇨🇳 台湾,🇸🇬 新加坡
🚀 Speedtest = select,DIRECT,"🚀 我的节点"🎯 节点选择可以理解成“兜底出口”:凡是规则没明确指定的海外流量,最终会落到这里。
其他策略组(Telegram / AIGC / Apple / Microsoft)则是“明确单独管理”,偶尔需要切换国家时就很舒服 —— 不用改配置文件,直接在 Surge 面板里点一下就行。
2.4 特需节点(留一个口子) #
我一般会额外留一个“ALL/全集合”的入口: 用于极少数情况下需要用到“没在国家分组里覆盖”的节点(比如某个很冷门地区、某条特殊落地等)。 这个口子也方便后续做测速/诊断。
3. Rule #
我以前很爱折腾去广告规则,但各种 App 的兼容问题实在太多,后来就转向:去广告交给模块,规则集专注分流。 比如微博就装微博去广告模块,不要拿“大而全”的规则集硬刚。
一个老生常谈但很关键的点: 非 IP 类规则一定放在 IP 类规则之前。 尤其在 Surge iOS 的 Enhanced Mode(Fake-IP)下,这样能尽量避免为了匹配 IP 规则而在本机做额外 DNS 解析。
我这里的规则集直接采用 skk 整理的,大体我用到的就这些:
- 非 IP 类
具体非 IP 类配置规则如下:
### 非 IP 类规则
# 测速网站及其测速点域名
DOMAIN-SET,https://ruleset.skk.moe/List/domainset/speedtest.conf, 🚀 Speedtest,extended-matching
# > 静态 CDN 域名
DOMAIN-SET,https://ruleset.skk.moe/List/domainset/cdn.conf, 🎯 节点选择,extended-matching
RULE-SET,https://ruleset.skk.moe/List/non_ip/cdn.conf, 🎯 节点选择,extended-matching
# > 流媒体域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/stream.conf, 🇺🇸 美国,extended-matching
# > Telegram 域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/telegram.conf, ✈️ 电报信息,extended-matching
# > Apple & Microsoft 国内 CDN 域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/apple_cdn.conf, DIRECT
RULE-SET,https://ruleset.skk.moe/List/non_ip/microsoft_cdn.conf, DIRECT
# > Apple CN 域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/apple_cn.conf, DIRECT
# > 苹果和微软服务域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/apple_services.conf, 🍎 苹果服务,extended-matching
RULE-SET,https://ruleset.skk.moe/List/non_ip/microsoft.conf, Ⓜ️ 微软服务,extended-matching
# > AIGC 类服务域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/ai.conf, 🤖 AIGC,extended-matching
# > 常见海外域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/global.conf, 🎯 节点选择,extended-matching
# > 国内常见域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/domestic.conf, DIRECT,extended-matching
# > 内网域名
RULE-SET,https://ruleset.skk.moe/List/non_ip/lan.conf, DIRECT这里的 extended-matching 作用是: 除了匹配 Fake-IP ↔ 域名映射外,还会参考 TLS SNI / HTTP Host 来校正少数 App 的“域名错绑”场景,分流会更稳。
- IP 类
具体IP 类配置规则如下:
### IP 类规则
# > Telegram IP 规则
RULE-SET,https://ruleset.skk.moe/List/ip/telegram.conf, ✈️ 电报信息
# > 流媒体 IP
RULE-SET,https://ruleset.skk.moe/List/ip/stream.conf, 🇺🇸 美国
# > 局域网 IP
RULE-SET,https://ruleset.skk.moe/List/ip/lan.conf, DIRECT
# > 国内 IP 段
RULE-SET,https://ruleset.skk.moe/List/ip/domestic.conf, DIRECT
RULE-SET,https://ruleset.skk.moe/List/ip/china_ip.conf, DIRECT- 兜底
FINAL,🎯 节点选择,dns-failed当所有规则都没命中时,走 🎯 节点选择。 dns-failed 的意义是:遇到 DNS 失败等异常时也能按策略做兜底处理。
以上就是我所用到的常用类型规则,当然还有一些自己所配置的其他规则,不方便一并说明。大伙参考以上方式逐步添加即可。
4. Proxy #
[Proxy] 用来一行一个代理。当你只有少量自建节点、没有订阅可拉取,或者临时想加一条测试节点时,就适合放这里。
如果你平时主要用 Sub-Store / 订阅管理,那
[Proxy]可能用得不多;但它依然是“最基础、最直给”的写法:写一行就能用。
一个简单的例子:
🇭🇰 HK=ss,[url],[port],encrypt-method=2022-blake3-aes-128-gcm,password="[password]",udp-relay=true代理类型/参数非常多,建议直接看官方文档: https://manual.nssurge.com/policy/proxy.html
如果你是“家宽 + 落地”这类代理链场景,还可以用 underlying-proxy(建议指向一个稳定的 smart 分组):
🇭🇰 HK=ss,[url],[port],encrypt-method=2022-blake3-aes-128-gcm,password="[password]",udp-relay=true,underlying-proxy=[最好指向 smart 的分组]5. 模块 #
模块(sgmodule)这块我准备单独写一篇文章展开:包括我常用的模块、以及哪些模块容易踩坑。这里先留个坑,后续补齐并把链接挂回本文。
至此,Surge For iOS 自用配置就完整了。后续如果我对规则、策略组、模块有新的取舍,也会继续在这篇文章里同步更新。