Shadowrocket 新手教程:节点/规则/模块配置
Shadowrocket 装完后主界面空空荡荡——没有节点列表、没有规则、没有模块。本篇从「右上角 +」开始,顺着添加订阅节点、配置分流规则、导入社区模块三条线,写清每一步的 UI 路径和最容易点错的位置。适合刚花 $2.99 下载完还没连上过的 iPhone 用户。
你花 $2.99 买了 Shadowrocket,下载完打开,看到的是空白主页。右上角一个 +,底部五个标签。没有节点,没有规则,不知道从哪开始。
这篇按顺序走三步:添加订阅拉节点 → 配两条路线规则让国内直连 → 导入社区模块拦截广告。每一步写完 UI 路径和最常见的点错位置。
打开后主界面是空的,从右上角 + 开始
Shadowrocket 刚装完,主页只有三个区域:顶部的连接开关(默认关闭)、中间的空白节点/规则列表、底部的五个标签(首页/配置/日志/设置/关于)。
最常被忽略的事实:Shadowrocket 不加节点也可以打开连接开关,开关会闪一下自动关闭。这不是 bug——没配置任何出站规则时,代理栈启动后找不到可用的下一跳。先去把节点加上,再动连接开关。
主界面的三个入口决定了三种你之后反复操作的东西:
| 在哪操作 | 管什么 | 你的操作频次 |
|---|---|---|
| 右上角 + | 添加节点/订阅 | 配置一次,后续只更新 |
| 底部「配置」标签 | 分流规则 + 模块 | 配置一次,按需调整 |
| 底部「日志」标签 | 查看每一条请求走了什么规则 | 出问题时看 |
本章写第一个入口:+ 按钮。
关闭连接后节点怎么都测不通?先看 Type 是不是选对了
右上角 + 点开,第一行是 Type,默认值 Local。Shadowrocket 的设计逻辑是:
- Local:手动填一个节点的所有参数(地址、端口、协议、加密方式),保存后生成一条静态本地节点。没有更新按钮,订阅源换了 IP 你得手改。
- Subscribe:填一个订阅 URL 和备注名,保存后生成一个订阅条目。点进去有「更新」按钮,每次更新从订阅源重新拉取全部节点。
如果你第一次使用,手里拿到的是一串 https:// 开头的订阅链接,Type 必须选 Subscribe。选 Local 会把订阅链接当成一个 node 的 address 解析,格式不匹配直接报错。
正确的添加流程:
Shadowrocket 首页 → 右上角 +
→ Type → 选 Subscribe(不是 Local)
→ URL → 粘贴完整的订阅链接
→ Alias → 填备注,建议英文
→ 右上角「完成」
完成之后主页出现一条新的订阅条目。但此时本地节点列表还是空的——你只保存了链接,没拉取节点。点进这条订阅条目 → 点顶部的「更新」→ 等详情页底部出现节点数量和更新时间 → 返回主页,本地节点列表出现了。
添加订阅时 Alias 建议用英文或拼音。Shadowrocket 对中文备注在部分 iOS 版本下显示不全,出现「…」截断。
更新后节点数量为 0?先看订阅内容返回了什么
如果更新后详情页底部显示「0 个节点」,点「订阅内容」查看原始返回:
- 以
<!DOCTYPE html>或<html>开头:订阅链接已失效。服务商的后台面板可能换了域名或重置了 token,登录面板重新获取订阅链接。 - 以
proxies:开头(Clash YAML):Shadowrocket 能解析大部分 YAML 节点,但加密 YAML(如 Clash Premium 的加密订阅)解析不出。让服务商提供未加密的 base64 订阅。 - 以长串字母数字开头(base64 编码):格式正常。少数情况下节点列表中混入了非标准字段(如
ssr类型的非标参数),Shadowrocket 会跳过无法解析的行。找服务商确认订阅格式输出为「通用 base64」。
对应的排查优先级:
| 订阅内容以什么开头 | 说明什么 | 先做什么 |
|---|---|---|
<!DOCTYPE html> 或 <html> | 链接失效,返回网页 | 登面板生成新链接 |
proxies: | Clash YAML,可能加密 | 让服务商改 base64 输出 |
| 长串字母数字 | base64 编码,格式正常 | 检查单行格式是否标准 |
节点有了但国内 App 变慢?两条规则做分流
节点有了,但这时的 Shadowrocket 默认行为是把所有流量都发到代理——包括你打开微信、刷淘宝、看 B 站。结果可能是:淘宝加载慢因为走了海外节点访问国内 CDN、微信消息延迟、银行 App 检测到异常 IP 拒绝登录。
两步解决:
第一步:GEOIP 分流国内 IP。
Shadowrocket 底部「配置」标签 → 点当前使用的配置文件右侧的 ⓘ → 滑动到「规则」(Rules)区域 → 添加规则:
类型: GEOIP
选项: CN
策略: DIRECT
第二步:兜底规则走代理。
再加一条:
类型: FINAL
策略: PROXY
两条规则在列表中的顺序必须是 GEOIP,CN,DIRECT 在上、FINAL,PROXY 在下。Shadowrocket 从上到下匹配,命中第一条就停止。如果 FINAL 排在上面,所有请求第一步就被发到代理了,GEOIP 规则永远不会生效。
验证这两条规则是否生效——开启连接后:
- 访问
http://ip.sb→ 显示代理节点的出口 IP。 - 访问
https://www.baidu.com→ 速度快,页面顶部「百度一下」正常显示。再访问http://ip.sb→ 如果百度走了代理,ip.sb 会显示代理 IP(说明 GEOIP 没命中百度的 CDN IP)——这时手动加DOMAIN-SUFFIX,baidu.com,DIRECT排在 GEOIP 规则前面做精确兜底。
模块(Module)是什么:不用手写规则就能拦截广告
Shadowrocket 的模块是一个 .sgmodule 文本文件,里面声明了一组分流规则、MITM hostname 和 URL Rewrite 规则。一个广告过滤模块通常包含:几千条广告域名 DOMAIN-SUFFIX 匹配 → REJECT、对应的 MITM hostname 声明(让 HTTPS 广告也能被拦截)、以及 reject-200 / reject-img 的 Rewrite 规则。
模块的加载路径:
Shadowrocket → 配置 → 点配置文件 ⓘ → 滑动到「模块」→ 添加模块
→ 输入 .sgmodule 的直链 URL → 完成
常用模块源(引用自 deezertidal/shadowrocket-rules 社区维护):
# 广告过滤(通用)
https://raw.githubusercontent.com/deezertidal/shadowrocket-rules/main/modules/ad.sgmodule
# 隐私追踪拦截
https://raw.githubusercontent.com/deezertidal/shadowrocket-rules/main/modules/privacy.sgmodule
# YouTube 去广告
https://raw.githubusercontent.com/deezertidal/shadowrocket-rules/main/modules/YouTube.sgmodule
导入后模块自动加载,规则以 %APPEND% 方式追加到当前配置文件,不会覆盖你手写的规则。模块的更新频率取决于 GitHub 上源文件的维护节奏——打开模块条目可以手动点更新拉最新版规则。
模块里的 MITM hostname 声明只在「HTTPS 解密」开关打开时才生效。如果你只导入了广告模块但没有安装 MITM 证书,HTTP 明文广告请求能拦截,HTTPS 广告请求因为加密读不到域名,模块规则命中不了。MITM 证书安装参考《iOS Shadowrocket MITM 证书安装与 HTTPS 解密配置(2026)》。
节点延迟正常但网页打不开?看日志里走了哪条规则
这种情况日志能直接告诉你答案。Shadowrocket 底部「日志」标签会记录每一条网络请求的:
- 发起 App(如 com.apple.WebKit.Networking)
- 请求域名
- 匹配到的规则(DIRECT / PROXY / REJECT)
- 连接结果(200、timeout、connection refused)
看到延迟正常但打不开网页时,日志里通常出现两种情况:
情况一:请求被 REJECT 了。 日志中域名后面的匹配结果显示 REJECT。确认是不是导入的广告模块误拦了——在模块编辑页暂停该模块,刷新网页看是否恢复。
情况二:走了 DIRECT 但实际不该走。 日志显示规则匹配为 DIRECT,但你的期望是走代理。回到规则列表检查:是不是忘记添加对应域名的规则,导致被 FINAL 兜底前被某条 GEOIP,CN 或其他直连规则提前命中了。
# 日志举例:百度 CDN 节点 IP 被 GEOIP 判定为非中国 → 走代理
# 手动加 DOMAIN-SUFFIX,baidu.com,DIRECT 排在 GEOIP 之前即可
[Rule] baidu.com -> GEOIP,CN (not matched) -> FINAL -> PROXY
一种快速定位手法:在日志界面顶部的搜索框输入要排查的域名关键词,只看匹配该域名的请求行。比上下翻日志快得多。
选节点只比延迟数字不够——端口和协议也影响连通
Shadowrocket 节点列表里每条节点右侧有延迟测试按钮(闪电图标)。延迟数字是 TCP 握手时间,不是实际下载速度。选节点时有三个比延迟更重要的检查点:
- 协议是否对你的网络环境友好。 Hysteria2 / TUIC 走 UDP,在部分企业 Wi-Fi 或校园网里 UDP 被 QoS 限速甚至直接丢包——延迟测试正常(TCP 测的),实际用起来速率跑不动。确认你的 Wi-Fi 环境不限制 UDP 之后再选这类协议节点。
- 端口是否被运营商屏蔽。 常见端口 443(TLS)和 8443 存活率最高。非标端口(如 12345、50000)在某些运营商的下行链路上可能被识别后丢包。同一个节点换端口试试,延迟一样但连通性可能完全不一样。
- 节点地区和你实际访问的服务是否地理匹配。 看 YouTube 选日本/新加坡/香港节点;访问 ChatGPT 选美国/日本。延迟 30ms 的香港节点访问 OpenAI API 可能还不如延迟 120ms 的美国节点快——因为 OpenAI 在香港没有边缘节点,所有流量要跨太平洋到美西。
跑代理之后如果你还需要稳定的出口 IP(固定 IP 不做轮换,适合 ChatGPT API 和白名单 IP 管理场景),多格式测试订阅源可以覆盖这个需求。
相关阅读
常见问题
- Shadowrocket 更新订阅后节点列表还是空的,但订阅链接在 Safari 能打开?
- Safari 能打开但 Shadowrocket 拉不到的情况,先查两点:(1) 点进订阅条目 → 查看「订阅内容」,如果显示的是 HTML 页面(以 <!DOCTYPE html> 开头),说明链接已失效,服务商返回了登录页或 404;(2) 如果内容正常但节点数为 0,检查链接参数——某些订阅 URL 后面有 &flag=shadowrocket 这类参数被手动删除了。订阅 URL 必须原样复制,不能只复制域名部分。
- 规则里写了 GEOIP,CN,DIRECT,为什么百度还是慢?
- GEOIP,CN,DIRECT 这条规则的含义是「IP 归属地判断为中国的请求走直连」,它处理的是 IP 层决策。百度慢的更多原因在 DNS——你的 DNS 查询可能走了代理,导致解析出了一个百度的海外 CDN 节点。在配置编辑页的 DNS 区域,确认国内域名的 DNS 走 system。另一个可能:GEOIP 数据库对个别 IP 段归类可能滞后,手动加 DOMAIN-SUFFIX,baidu.com,DIRECT 排在 GEOIP 规则前面做精确兜底。
- 导入了 .sgmodule 广告过滤模块后,微博/知乎 App 刷不出内容了?
- 社区模块的广告域名列表覆盖面很广,可能误拦了正常的 API 请求。打开 Shadowrocket → 底部「日志」标签 → 过滤 URL 里包含 app 域名关键词的请求 → 看哪些请求被 reject 标记了。如果确认是误拦,在模块编辑界面里找到对应的域名规则删掉,或者在 Rules 里排一条优先级更高的直连规则覆盖它。不想手动排查的话,先关掉模块确认 App 恢复正常,再换一个维护更活跃的广告规则模块。
- Shadowrocket 连接后微信视频通话和游戏延迟变高了?
- DNS 清洗能做分流,但实时通信(微信视频、FaceTime、手游 UDP)对延迟极度敏感——多一跳代理就多 30-100ms。在规则里把已知的国内实时通信域名设为 DIRECT:DOMAIN-SUFFIX,weixin.qq.com,DIRECT、DOMAIN-SUFFIX,qcloud.com,DIRECT。游戏类 App 如果不知道具体域名,开 Shadowrocket 日志打一局游戏,看连接日志中出现的所有域名,确认不是海外服务后全部加直连规则。
- 连接开关打开了,状态栏 VPN 图标闪现一下就消失?
- 两种情况。最常见的是 iOS VPN 权限弹窗被别的通知挡住了——去「iOS 设置 → VPN」里找到 Shadowrocket 的配置项,点右侧开关手动连一次,等同于完成授权。另一种情况是节点的第一个 TCP 握手超时——长按那个节点条目 → 点「延迟测试」,如果显示 timeout,换节点再试。延迟测试不需要走进完整代理流程,只测 TCP 握手。
来源与时间
本文最后查看时间:2026-05-29。操作路径会随客户端版本变化,遇到按钮名称不一致时,优先按同义菜单和官方文档查看。