Surge - 配置文件指引

配置文件 [Section] 逻辑梳理

Posted by MAICOO on May 6, 2021

Surge 核心的功能由配置文件(Profile)所控制,当遇到一些特殊需求时,需要通过手动编辑配置文件方可实现,本文总结了 Surge 配置文件系统的一些梳理。

配置文件的内容

配置文件的格式部分沿用了 INI 文件的格式,以 [Section] 进行分段,用于划分不同的段落,对设置内容进行区隔。

每个段落的配置行分别有其特定的语法,如 [General]、[Replica]、[MITM] 段是简单的 key = value 的形式

1
2
[General]
key = value

在这几个段里,配置行的先后顺序并无影响。但是在如 [Rule] 等段中,配置行的上下顺序非常重要。

配置文件的分类

配置文件分为三类:

  1. 普通配置:即手动创建或默认使用的一般配置文件(详见 GitHub 仓库)。
  2. 托管配置:通常由企业管理员或服务商提供。托管配置由于可以被远程更新,所以不可以在本地进行修改。如需要进行修改应先创建副本变为普通配置。
  3. 企业配置:仅限企业版本,不可修改和查看,也不可建立副本。

    配置段分离

    为了满足各种使用场景的复杂性,Surge Mac 4.1.0 Beta / Surge iOS Beta 1903 开始支持将配置的一个段分离至另一个文件中。

如:

1
2
[Proxy]
#!include Proxy.dconf

其中所引用的另一个文件,必须包含对应段的 [] 声明。因此,该文件既可以是一个只包含部分段的文件(一个或多个),也可以是一个完整的配置。

Proxy.dconf

1
2
[Proxy]
ProxyA = http, 1.2.3.4, 80

使用该功能,你可以:

  1. 引用托管配置的 [Proxy]、[Proxy Group]、[Rule] 段,自行编写其他段。这样既可以享受托管配置的代理相关的内容更新,也不影响通过 UI 调整其他的功能。
  2. 在多个配置间共享某几个段的内容。比如同时在 iOS 和 macOS 上使用 Surge 时,[Proxy]、[Proxy Group]、[Rule] 等段的内容往往是一样的,但是 [General] 的内容却可能大不相同。可建立 iOS.conf 和 macOS.conf 两个配置,将重复的部分放置于另一个文件中。
1
2
3
4
5
6
7
8
[Proxy]
#!include Proxy.dconf

[Proxy Group]
#!include Policy.dconf

[Rule]
#!include Rule.dconf

这样,当调整 iOS 上 [General] 段相关内容时,并不会影响 macOS 端,也避免了维护两套代理配置的麻烦。同时完全不妨碍使用 UI 进行配置。

一些补充说明:

  • 在通过 UI 修改配置后,会按照 include 的声明将配置写入对应的分离配置段文件。如果该文件包含其他未用到的段落,写入时只会修改涉及的段落。
  • 如果引用的是一个托管配置,则和该段相关的配置不可被编辑,但是不影响其他段的调整。
  • 为了配合该功能的使用,Surge Mac 新版中将对所有已安装的托管配置定期检查更新,旧版本中仅对当前使用中的配置检查更新。
  • 文件名的后缀并没有要求,如果是一个完整配置可继续使用 conf 后缀,如果并非一个完整配置建议使用其他后缀,以避免被显示在配置列表中。

模块

配置段分离功能用于将单个配置文件拆分为多个文件,而模块则是对配置文件的补丁,每个模块文件用于对配置文件的各个部分进行微调,以实现某个特定的任务。

模块可以:

  • 灵活的开启与关闭。
  • 在同一个文件内对多个段进行调整。
  • 可通过 URL 进行安装并保持更新。

但是

  • 模块不可以调整 [Proxy]、[Proxy Group]、[Rule] 段内容。
  • 模块不可以调整 MITM 的 CA 证书。
  • 模块的设置覆盖于主配置之上,因此不可以通过 UI 进行调整。

模块基本概念

模块相当于给当前配置进行 Patch,其优先级高于配置本身的设置。有三种模块:

  • 内置模块:Surge 会预置一些模块,随着 Surge 自身更新。
  • 本地模块:放置在配置文件目录的 .sgmodule 文件
  • 安装的模块:从某个 URL 安装的模块
    • 点击「模块卡片」下方的「模块」按钮,点击「安装新模块…」按钮,粘贴以你需要的模块「sgmodule 文件的 GitHub raw 链接」,确认安装后确保刚刚安装的模块左侧有对勾代表模块已经启用,点击右上角「完成」确认即可。

你可以同时开启多个模块,模块的开启状态保存于当前设备,不会进行同步。切换配置也不影响模块的开启状态。

模块编写

模块的内容和标准配置基本一致,目前支持调整以下段:

  • General,Replica有三种写法
    • key = value:直接覆盖原始值
    • key = %APPEND% value:在原始值的末尾进行追加(仅适用于适用逗号分隔的字段)
    • key = %INSERT% value:在原始值的开始进行插入(仅适用于适用逗号分隔的字段)
  • MITM仅支持操作 hostname 字段,同样支持上述三种写法。
  • Script,URL Rewrite,Header Rewrite,Host新加入的定义将会追加在原始内容的顶部。
  • Rule
    • 新配置的规则将被插入在最顶部
    • 规则只可以使用 DIRECTREJECTREJECT-TINYGIF 三个策略

同时,模块支持配置 name,desc 和 system 描述,请参照最后的样例。(system 描述的可取值为 ios 和 mac,用于限制模块的使用范围)

模块样例

1
2
3
4
5
#!name=MitM All Hostnames
#!desc=Perform MitM on all hostnames with port 443, except those to Apple and other common sites which can't be inspected. You still need configure CA certificate and enable the main switch of MitM.

[MITM]
hostname = -*.apple.com, -*.icloud.com, -*.mzstatic.com, -*.crashlytics.com, -*.facebook.com, -*.instagram.com, *
1
2
3
4
5
6
#!name=Game Console SNAT
#!desc=Let Surge handle SNAT conversation properly for PlayStation, Xbox, and Nintendo Switch. Only useful if Surge Mac acts the router for these devices.
#!system=mac

[General]
always-real-ip = %APPEND% *.srv.nintendo.net, *.stun.playstation.net, xbox.*.microsoft.com, *.xboxlive.com