Surge for Mac 简明指南

Cheng
16 min readJan 13, 2016

--

Surge for Mac 是针对 Surge for iOS 用户的一项「福利」,这意味着你首先必须是 Surge for iOS 的用户才可以激活和使用 Mac 版,两者一脉相承,除了配置文件的命名和保存位置不同,在使用体验上非常一致。

Mac 版的下载地址和激活都需要通过 iOS 版来实现,打开 Surge for iOS,切换到「More」标签页,展开「Surge Mac Beta」就能看到具体的激活步骤。需要注意的是下载地址区分大小写:http://surge.run/Surge-Mac.zip

Mac 版配置文件和 iOS 版配置文件基本一致,配置文件可以参考这里 https://gist.github.com/scomper/

  • Mac 配置文件增加了 interface 、port、socks-port 几个字段,用来定义缺省的 IP 地址和端口,默认是 0.0.0.0 和 6152、6153(不写入 0.0.0.0 的话会影响 Parallels Desktop 通过代理访问);
  • 因为 Mac 下 Find Friends (fmfd 进程的 sandbox 描述)强制限定了只允许连接到 80, 443, 8888 这 3 个端,Surge 默认的 6152 端口会影响查找朋友中正常的定位,可以将 Surge Mac 配置中的端口定义为 8888;
  • 配置文件需要命名成 .surge.conf 放在「个人」目录下(也可以通过前往文件夹~/ 定位);

配置文件命名成包含 . 前缀的文件 .surge.conf 会被视为隐藏的系统文件,所以要复制和修改它首先需要 Finder 显示系统文件。Alfred 用户安装上 Finder Settings 的 Workflows,可以很简单的切换显示 Finder 的隐藏文件。

Surge Mac 1.0.2开始支持自动更新,1.2.1 增加了偏好设置面板和「Set as System Proxy」选项,方便定义是否启用网络切换通知、顶栏图标是否显示动态的网速。运行过程中如果修改了配置文件可以点击「Reload Configuration」重新加载。

和 iOS 版一样,Recent Requests 窗口中可以直观的查看到网络访问的情况,点击具体的条目弹出详细内容窗口。Surge for Mac 的日志保存在 ~/Library/Logs/Surge/ 目录下,通过偏好设置中的「Reveal Logs in Finder」可以直接定位到日志目录(Helper 的日志保存在 /tmp/SurgeHelper.log)。

Set as System Proxy

启用 Surge 后勾选下拉菜单中的 Set as System Proxy 即可自动向系统网络设置添加必要的参数,因为需要修改系统网络设置,首次勾选时需要输入管理员密码进行确认,去掉 Set as System Proxy 的勾选,会清除网络设置中的代理相关设置

1.2.0 加入 Helper,能够自动修改系统代理设置(注意 Bypass Proxy 是通过配置文件进行设置的,请确保 .surge.conf 中 skip-proxy 有正确条目),网络设置中代理设置的部分会做如下修改:

  • 启用「系统偏好设置 — 网络」 HTTP 和 HTTPS 代理: 127.0.0.1:6152 ,SOCKS 代理中设置为 127.0.0.1:6153。
  • 添加忽略这些主机与域的代理设置(Bypass Proxy):127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local

设置 SOCKS 代理可以有效的解决 Mail.app 应用收发 Gmail 邮件的问题。

多个服务器配置(Proxy Group)

1.0.7 版本以后配置文件可以方便的定义多个可供选择的服务器。通过新增加的 [Proxy Group] 来显示 [Proxy] 中的多个服务器。

[Proxy Group] 配置群组命名应和 [Rule] 规则中调用的一致,如:图示中 A、B、C 三处的名称应一样。

Proxy Group 方式每个配置文件是相对独立的,可以包含各自的服务器地址和不同的规则。例如,按不同的规则的定义来命名区分成不同的配置文件,或者用不同的命名区分服务器提供商。

配置文件中的主要参数

配置文件很多部分随着你升级 Surge 会自动更新,例如 [URL Rewrite] 网址后的参数「header」,[General] 字段部分自动添加 ipv6 = true、replica = 0,[Proxy] 字段部分 HTTPS 代理后的「tls=true」参数等。

还有些特性需要手动添加才可以,如:SSID 群组的支持、Surge-Cli 命令行的支持。

Surge 2.0 配置上的变化

Proxy & nProxy

Proxy GROUP 和 nProxy GROUP群组的作用:Proxy(Group 1)、nProxy(Group 2),正常情况(国内直连)下 Proxy 选代理,nProxy 选 DIRECT 直连;Proxy、nProxy 都选代理服务器就是全走代理。这样配置可以方便的切换成全局代理(主要是指 Mac 版)。

AUTO-GROUP

AUTO-GROUP 通过测速来自动选择定义的线路,能最大限度的避免因个别线路故障或者过慢而影响使用。

当 Proxy 中选择使用 Auto Group 时,Surge 会并发尝试通过该 Group 下所有的服务器去发起到目标 url 的请求,并根据最优结果选择哪个服务器将被使用。默认间隔 600 秒后需要重新发起测试,更多详细的参数介绍可以参阅这里 trello.com

  • 默认配置中的 URL 不要修改成其他地址;
  • 为保证测速的基本公平,默认 URL 目标设置的是 gstatic.com 这样的在全球都有节点的 URL 作为测试目标;
  • 基于性能考虑,只支持使用 http 协议的 URL;
  • 为了避免资源浪费,Auto Group 中不应放入太多的线路,2–3 个即可。如 US 这样的线路不应该放入,因为几乎不可能赢得测试;
  • 不要使用 google.com 作为测试目标,这么做可能导致 proxy 服务器 ip 被加入黑名单,导致各种操作需要输入验证码;

SSID-GROUP

SSID-GROUP 的作用则是让 Surge 根据不同的网络环境自动切换,判断是处在 Wi-Fi 网络还是蜂窝移动网络,通过 Wi-Fi 的 SSID 的判断选择使用不同的代理设置,可以和 Auto 搭配使用。

Scene = ssid, default = Auto, cellular = SG, “SSID NAME1” = HK, “SSID NAME2” = JP
Proxy = select,Auto,Scene,JP,US

SSID GROUP 的定义中,default 是默认和必须的,定义没有匹配到 SSID 时网络代理的选择,cellular 是可选项,如果不写走 default 的设置,后面的SSID NAME 改成你想要定义的 SSID 的名称,支持多个。

SSID 名称如果存在空格需要用英文引号标注。

※ Mac 上的文本编辑器推荐 TextWrangler

surge.conf

[General]
# warning, notify, info, verbose
loglevel = notify
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
bypass-tun = 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
interface = 0.0.0.0
port = 8888
socks-port = 8889
external-controller-access = pw@0.0.0.0:6155
[Proxy]
HK = http,adc-hk.com,443,username,password,tls=true
SG = custom,1.2.3.4,443,chacha20,password,http://abc.com/ss.module,ota=true
JP = http,adc-jp.com,443,username,password,tls=true
US = http,adc-us.com,443,username,password,tls=true
TW = http,adc-tw.com,443,username,password,tls=true
[Proxy Group]
Auto = url-test,HK,SG,JP,url = http://www.gstatic.com/generate_204
nProxy = select,DIRECT,TW
Scene = ssid, default = Auto, cellular = JP, "SSID NAME" = HK
Proxy = select, Auto,Scene,US
[Rule]
# 规则部分请参照范例补充完善,此处仅示意
DOMAIN-KEYWORD,umeng.co,REJECT
DOMAIN-KEYWORD,google,Proxy,force-remote-dns
GEOIP,CN,nProxy
FINAL,Proxy
[URL Rewrite]
^http://www.google.cn http://www.google.com header

ShadowSocks 服务器地址的添加可以参照 SG 那一行,其中 custom 不可更改,ss.module 的地址必须有效。
[URL Rewrite]每行两个参数,以空格分隔,第一个是匹配用的正则表达式,第二个是替换的内容。正则的输入字符串是完整的 URL(包含 http://),输出的字符串也必须以 http:// 开头。该功能只对非 https 请求有效。

Launch Surge at login

如果希望开机自动加载 Surge,可以到「系统偏好设置-用户与群组」中将 Surge 添加到「登录项」,update:1.3.0 版本之后,偏好设置中已经支持开机加载(Launch Surge at login)的勾选设置。

※ 注意,登录项的设置中不要勾选 Surge 前的「隐藏」。

和 iOS 版使用同一个配置文件

关键词:iCloud 同步、软链接

通过给文件创建软链接的方式,可以令 Mac 版和 iOS 版的 Surge 共用同一个文件,这样后期维护和编辑会方便很多。Mac 的配置中多几句端口的设定语句,不过这并不妨碍 iOS 版的 Surge 直接使用相同的配置。

这里以 /iCloud Drive/Surge 文件夹中 Surge.conf 为主体,为其创建软链接(软链接的链接名称可以和源不一样)。

  • 确认 Surge iOS 中已经启用 「iCloud Drive Sync」
  • Mac 上打开终端窗口,直接复制如下 ls 命令并运行:
ln -sfv "/Users/$(whoami)/Library/Mobile Documents/iCloud~run~surge/Documents/Surge.conf" "/Users/$(whoami)/.surge.conf"

Surge-Cli 命令行

Surge Mac 1.4.0 版本增加了命令行模式,可以通过命令行对 Surge 进行控制。

conf 配置文件中需要增加一行:

external-controller-access = password@0.0.0.0:6155

这里的 password 可以可以改成你自己的密码。

[General]
# warning, notify, info, verbose
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
interface = 0.0.0.0
port = 8888
socks-port = 8889
loglevel = notify
external-controller-access = password@0.0.0.0:6155

利用 ln 命令为 Surge 程序中包含的 Surge-cli 创建一个「符号链接」就可以在终端中直接调用了。

ln -s /Applications/Surge.app/Contents/Applications/surge-cli /usr/local/bin/surge-cli

软链接创建完成后就可以在终端中运行对应的命令来获取结果。

watch request 命令运行的结果

surge-cli 默认会根据 ~/.surge.conf 中的配置,自动连接本机的 Surge。如果你想控制另一台设备上的 Surge (包括 iOS),请使用 -h 选项。

surge-cli -h password@192.168.1.10:6155 COMMAND

这里的 password 可以可以改成你自己的密码,COMMAND 改成最终的命令.

连接到 iPhone 运行 watch request

基于命令的格式,范例中 apw 是配置中我设定的密码字符串,192.18.0.2 填写的是 iPhone 在 Wi-Fi 网络中获取的 IP (设置-无线局域网,点 ⓘ 查看 iPhone 的 IP 地址),COMMAND 部分填写 watch request 命令查看 iPhone 上的网络请求。

支持的命令列表:

watch request:执行该命令后持续输出最新收到的请求
test-rule :测试 hostname 对应的 rule(test-rule example.com)
dump dns:显示目前的 DNS 缓存和 DNS 条目
dump policy:显示所有可用的策略名称
dump active:显示目前活动的连接
dump request:显示最近的请求
dump rule:显示目前所有生效的规则
set-policy:设置针对某个 hostname 的策略(set-policy yach.me DIRECT),相当于在 0 位置插入了条 DOMAIN 或者 IP 规则
insert-rule:在特定 index 插入一条规则,index 和 dump rule 的结果一致(insert-rule DOMAIN-SUFFIX,yach.me,Proxy 10)
reload:重新加载配置(仅限 OSX)
flush dns:强制清除本地 DNS 缓存
flush rule:强制清除规则匹配缓存

更多关于 Surge-cli 的使用可以访问作者写的具体介绍

Surge Dashboard

Surge Mac 2.0 提供了更加直观的 Dashboard 界面,用来查看最近的访问、DNS 解析记录以及规则。

Dashboard 中不仅可以查看 Surge Mac 的访问情况,也支持访问 iOS 设备中的 Surge 数据,前提是配置文件中包含 external-controller-access 的定义。如果要连接到 iOS 设备,填入 IP、端口和密码即可,IP 在 Wi-Fi 属性中去查询,端口和密码取决于你的 external-controller-access 的定义。

Dashboard 可以临时调整规则(Rule),同样可以保存到配置文件中,不过保存后注释的部分不会被保留。

Surge TUN 模式

Surge 2.1.0 (311) 增加了 TUN 模式,用来处理部分应用不走 HTTP、SOCK 代理的问题,通过勾选菜单项中的「 Enhanced Mode」启用。之前的 Surge,使用词典无法使用其中的维基百科进行查询、终端也无法走代理,通常我们会选择再安装一个 Proxifier 来接管这些不走常规代理的应用,Surge 支持 TUN 模式后这些问题就都解决了。

使用增强模式前必须先配置 dns-server 参数,因为启动 TUN 后不能获取到系统的 DNS 配置,不管是 TUN 全局模式还是部分模式 dns-server 参数都是必需的。

配置文件中如果不包含 enhanced-mode-by-rule 参数 ,菜单项中勾选 Enhanced Mode 就是全局模式,如果在配置中添加 enhanced-mode-by-rule = 1 就是 TUN 规则匹配模式,规则匹配模式中具体的规则后需要添加 enhanced-mode 参数。

Parallels Desktop 中,如果使用部分 TUN 模式(enhanced-mode-by-rule = 1),可以使用共享网络模式,如果是 TUN 全局模式的话就只能选桥接模式才能正常访问网络。

版本更新

  • 1.0.2 +自动更新
  • 1.0.4 +新特性:可以指定本地的出口 interface
  • 1.0.5 +Proxy Group 和 URL Rewrite 特性
  • 1.1.0 +SOCKS5 代理的支持,解决 Mail.app 等应用不走 HTTP 代理的问题
  • 1.2.0 +加入 Helper(Set as System Proxy)和偏好设置面板,能够自动修改系统代理设置(请注意 Bypass Proxy 是通过配置文件进行设置的,请确保 .surge.conf 中有正确条目)
  • 1.3.0 +AutoGroup,增加自动切换服务器群组,自动根据测速结果切换服务器
  • 1.3.2 +Shadowsocks 协议加入 OTA 支持
  • 1.4.0 +增加了命令行模式,可以通过命令行对 Surge 进行控制
  • 2.0.0 +增加了 Dashboard 面板,方便查看请求和编辑规则,可以连接到 Surge iOS
  • 2.1.0 +Surge 2.1.0 (311) 增加了 TUN 模式

Surge Mac Beta 测试版最新动态请关注作者的 Twitter 账户: @Blankwonder更多问答:https://trello.com/b/qy4sDvxg/surge

本文档适用于:Surge for Mac 2.0.0,Surge for iOS 2.1.0
内容制作软件:Ulysses、OmniGraffle

--

--