打开Surge的设置,找到配置里面的本地default.conf文件并打开。在该文件夹中,还有一个汉化的简易说明,感兴趣也可以看看。
这个diy的网络规则配置总共分为几部分,[General]、[Proxy]、[Proxy Group]、[Rule]、[Host]等。下面就来详细讲讲它们是做什么的以及如何配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[General]
# 日志等级: warning, notify, info, verbose (默认值: notify)
loglevel = notify
#跳过某个域名或者 IP 段,这些目标主机将不会由 Surge Proxy 处理。
skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 127.0.0.1, localhost, *.local
# 监听地址 (默认值: 127.0.0.1)
interface = 127.0.0.1
# HTTP 服务端口 (默认值: 6152)
port = 6152
# SOCKS5 监听地址 (默认值: 127.0.0.1)
socks-interface = 127.0.0.1
# SOCKS5 服务端口 (默认值: 6153)
socks-port = 6153
# 强制使用特定的 DNS 服务器
dns-server = 8.8.8.8, 8.8.4.4
#ipv6支持
ipv6 = false
请注意这里的socks5监听地址和端口就是你将来填写到tg代理以及其他支持socks代理软件(比如Spotify)当中的配置。端口可以自行设定,务必不要和本机已经使用的端口冲突。
1
2
3
4
5
6
7
8
9
[Proxy]
🇺🇸美国 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇬🇧伦敦 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇭🇰香港 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇯🇵日本 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
[Proxy Group]
Proxy = select, 🇺🇸美国,🇬🇧伦敦,🇭🇰香港,🇯🇵日本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如果你想要给你的节点分组,比如分成香港组、美国组等,可以参考如下配置
🇺🇸美国 1 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇺🇸美国 2= custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇭🇰香港 1= custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
🇭🇰香港 2 = custom,ip,端口,加密协议,密码,https://github.com/Newlearner365/Surge-config/raw/master/SSEncrypt.module
[Proxy Group]
Proxy = select,US Group,HK Group
US Group = select,🇺🇸美国1,🇺🇸美国2,......
HK Group = select,🇭🇰香港1,🇭🇰香港2,......
当然,这里除了填写“ select”之外,还有其他选择,这里列出常见的两种:
url-test:自动选择该策略组当中延时最低的节点
fallback:自动选择该策略组当中最靠前的可用节点
顾名思义,Proxy是代理的意思,如果你有socks5代理,只要在设置当中的图形化界面填写即可。如果不想去配置socks或者压根没有自己的服务器而是用的别人的ss节点,请参考上述配置。
这里的ip填写你自己的服务器ip地址,端口加密协议和密码相信不需要多说了,所有配置用英文输入法填写。(什么?你问什么是ss?打扰了~)
后面的链接则是直接引入ss模块。请注意一个节点对应一行,填写顺序也要和后面的Proxy Group顺序相一致。这样一来,就像小飞机的「服务器配置」一样,我们配置好了自己的ss节点。
对于[Proxy Group],一共有三种策略组类型: “select“, “url-test” 和 “ssid“
select: 具体哪个子策略将被使用,由用户界面上进行选择。
url-test: 具体哪个子策略将被使用,通过测试到具体 URL 的访问速度选择
# url: 必填,测试时用到的目标 URL.
# interval: 可选, 秒 (默认值: 600s),指定在多长时间后,上次的测试结果将被抛弃。
# tolerance: 可选, 毫秒 (默认值: 100ms), 只有当新的优选线路,比原优选线路的响应时间,大于该值的时候,才会触发线路变更。相当于是一个开启线路变更的阈值。
# timeout: 可选, 秒 (默认值: 5s),如果某策略在该时间后依然没有完成,放弃该策略。ssid: 具体哪个子策略将被使用,根据 Wi-FI 的 SSID 决定
# default: 必填, 默认策略。
# cellular: 可选,在数据网络下的策略。 若不填,那么默认策略将被使用。示例:
1
2
3
4
[Proxy Group]
SelectGroup = select, ProxyHTTP, ProxyHTTPS, DIRECT, REJECT
AutoTestGroup = url-test, ProxySOCKS5, ProxySOCKS5TLS, url = http://www.google.com/generate\_204
SSIDGroup = ssid, default = ProxyHTTP, cellular = ProxyHTTP, SSIDName = ProxySOCKS5
在surge3 for Mac中,新增加了远程list。可以将代理策略组写进list放在本地或者托管到远端,简化了Proxy Group的规模。值得注意的是以上所述的老版本配置文件在3中依然适用,list语法如下:
1
2
3
4
5
#远端
PProxy = select, policy-path = https://远端链接.list
#本地
Proxy = select, policy-path = 本地.list
- 核心与灵魂:Rule
自用rule:传送门(按字母和类型整理,有屏蔽广告功能,dns请按自己喜好自行添加)
有了代理之后,我们仍然无法正常使用Surge来上网,因为没有网络规则,Proxy会代理一切网络请求。这样的话与全局模式并无差异,违背了我们想要pac模式的初衷。下面就为大家简单介绍下规则(rule)怎么写:
一个规则有三个基础部分:类型, 值, 策略。
1、有三种基于域名的类型: “DOMAIN“(完整域名), “DOMAIN-SUFFIX” (域名后缀)和 “DOMAIN-KEYWORD“(域名关键词)。
2、有两种基于ip的类型: “IP-CIDR” and “GEOIP“,如果是一个使用域名进行访问的请求,那么 Surge 将进行 DNS 查询以确认是否应该被该规则匹配.。若 DNS 查询失败,将放弃规则匹配过程并直接给出错误。
3、值对应相应的类型,域名的话后面填写的值必须要域名,ip类型的话后面的值必须是ip。
4、有几种策略:
1
2
3
4
5
DIRECT:表示直连而不再任何代理,一般用于国内网站以及一些没有被墙的国外服务器网站
Proxy:表示代理,直接交给刚刚填写好的代理组来代理,一般用于被封锁的国外网站
REJECT:表示拒绝访问,可用来屏蔽一些广告(比如爱奇艺等),也可以阻止一些破解版软件认证和自动更新
no-resolve: (可选)如果是一个使用域名进行访问的请求,跳过该条规则,不触发 DNS 查询。
force-remote-dns: (可选)如果某请求被该规则匹配, 且策略不是DIRECT. 那么 DNS 查询将永远在远端代理服务器执行, 即使该请求由 Surge TUN 处理。
示例:
1
2
3
4
5
6
7
8
9
10
11
DOMAIN-SUFFIX,appldnld.apple.com,DIRECT
DOMAIN-KEYWORD,google,ProxyHTTP,force-remote-dns
DOMAIN-KEYWORD,youtube,Proxy
DOMAIN-SUFFIX,ad.com,REJECT
DOMAIN,www.newlearner.site,DIRECT
#判断是否是局域网,如果是,走直连
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT
# 判断服务器所在地,如果是国内,走直连
GEOIP,CN,DIRECT
规则写完之后不要忘记在最后一行加上:FINAL,Proxy(其他的走代理)
同样的在surge3之后rules也支持了远端list
1
RULE-SET, https://远端.list, 策略组名称
这样就将之前大篇幅的rules简化,并且可以根据不同的策略分门别类的写相对应的list。老版本的配置依然适用。
其他
[Hosts]相当于是本地本地 DNS 记录,该功能等同于 /etc/hosts,加上了泛解析和别名支持。
[URL Rewrite]
^http://www.google.cn http://www.google.com header
^http://yachen.com https://yach.me 302
该段定义针对 HTTP 请求的 URL 重定向规则,即当你打开一个URL时代理会自动帮你跳转到另一个URL。(个人感觉类似dns污染)
有两种重定向方式: “header” 和 “302“
①Header 模式
Surge 会修改发出的 http header,必要时还会修改 Host 字段。客户端将感知不到这个重定向过程. 不支持重定向到一个 HTTPS 的地址。
② 302 模式
Surge 直接简单的返回一个302重定向回应。
[String]
该功能在3.2.0版本已经提供,本人由于不愿升级无缘体验这个功能了,等iOS正式版支持后或许可以一窥。
原理:使用 JavaScript 来对 response body 进行修改。
1
2
[Script]
http-response .* script-path=anti-spoiler.js
每一行配置分为三个部分,第一部分为脚本类型,目前仅支持 http-response
; 第二部分为针对请求 URL 的正则表达式; 第三部分为参数表,使用半角逗号分隔,参数有:
- script-path:JS 脚本的路径,可以是 URL、相对路径或绝对路径(仅限 macOS),必填。
- script-update-interval:JS 脚本的更新间隔,仅当使用 URL 时生效,选填,默认值为 24 小时。
- max-size:最大允许进行修改的 body 大小,单位为字节,选填,默认值为 524288 (512KB)。
由于进行 script 修改会需要 Surge 先将 response body 完全下载后再进行处理,如果遇到了较大的数据将导致内存占用量暴增,Surge iOS 受系统内存限制在该情况下极易被直接终止。
当返回的数据长度超过 max-size 设定值后,Surge 将放弃对该请求执行脚本并回退到 passthrough 模式。
编写脚本
Surge 会向 JSVM 上下文传入以下全局变量:
- body[String]: 原始 response body
- status[Number]: HTTP 状态码
- method[String]: HTTP 请求方法
- url[String]: URL 地址
Surge 将使用脚本的最后一行运行结果作为返回值,返回值约定如下:
- String 类型: 将使用该结果作为新的 response body
- Null: 终止该请求
- undefined: 不对请求进行修改
一个简单的样例
1
2
3
4
var obj = JSON.parse(body); // 对 response body 进行 JSON 解析得到 Object
obj['surge'] = 'OK'; // 增加 'surge' 字段
JSON.stringify(obj); // 进行 JSON 编码并作为结果返回
另一个样例,将全文查找所有的文字进行反剧透 https://gist.github.com/Blankwonder
- 受 JavaScript 语言限制,目前仅支持对 UTF-8 编码的 response body 执行脚本,如果 response body 的二进制数据无法进行 UTF-8 解码,将跳过脚本直接返回。
- 默认情况下,每次执行脚本时将使用一个干净的 JVM 上下文,如果需要可配置
1
2
3
[General]
shared-jvm-context=true
该模式下所有脚本将共享上下文,可以使用全局变量共享数据。
- 可使用 console.log 将日志输出到 Surge 的日志中,方便调试。
- Dashboard 中抓到的 response header 和 response body 为修改后的结果,在 Notes 中可看到脚本的执行情况。
拓展
1、Terminal(终端)全局代理
众所周知小飞机也好Surge也好,规则模式以及全局代理针对的是浏览器,而对于终端,依然是直连国内网络。这样就给我们在终端里面安装homebrew等带来了困扰。现在配合Surge,可以实现让终端也用上代理。
「访达」—「前往文件夹」:~/.bash_profile
。该文件是隐藏的,command+shift+. 即可显示。打开该文件,增加:
1
2
3
4
5
6
7
8
9
10
#这个是一个function函数,当终端输入setProxy即打开终端代理,输入unsetProxy即为关闭
function setProxy() {
export https_proxy=http://127.0.0.1:6152;export http_proxy=http://127.0.0.1:6152;export all_proxy=socks5://127.0.0.1:6153(根据surge配置中的http、https、socks5端口填写)
}
function unsetProxy() {
unset all_proxy http_proxy https_proxy
}
接着在终端里面输入:
1
2
3
source /Users/你的mac管理员名称/.bash_profile
#如果你安装了oh my zsh,请将.bash_profile替换为.zshrc
这样我们即可在终端使用代理了,那么如何检验呢?
setProxy之后,我们输入:curl -i http://ip.cn
或者curl -i http://cip.cc
即可看见终端当前使用何网络。
2、App使用socks5代理
有一些app提供了内置代理设置,ip填写本地ip127.0.0.1,端口填写Surge的socks5监听端口。如果没有内置的代理可以填写,我们就开启Surge的增强模式,类似于sstap,可以将强行代理软件。
注:使用增强模式前必须先配置 dns-server 参数,因为启动 TUN 后不能获取到系统的 DNS 配置,不管是 TUN 全局模式还是部分模式 dns-server 参数都是必需的。另外这个增强模式只能代理tcp流量,udp和icmp流量无法代理,周知。
3、本地流量情况实时监控
作为一个网络调试工具,打开控制台之后,经过mac的所有流量就会呈现在我们面前。并且告诉我们某个请求是经过什么样的方式(直连、代理),在我们电脑上面上传、下载的数据包大小,连接的时间等等。如果某个链接你不想让他在后台访问,可以右键制定规则屏蔽掉。同样的,某些应该直连却代理的网站(规则没写好),我们也可以同样操作让其实现直连。
4、iOS Http代理
打开Surge设置,找到https一项,点击「生成新证书」,接着点击「把证书安装到系统」。输入密码安装好证书之后,将右面的主机名设置成*即可。最后回到设置-通用,把http和socks5的监听ip改为0.0.0.0。
准备就绪之后,到mac设置-网络里面查看,找到本机的ip地址(路由器模式下面一般是196.168.1.x)并记录。
打开iPhone,和电脑连接到同一个局域网下面,点击!号进入Wi-Fi配置,配置http代理。服务器填写mac的ip地址,端口填写Surge的http代理监听端口。打开Surge的控制台,在远程客户端就可以看见iOS上面的流量情况了,点击流量抓取即可抓取和监管流量。
注:iOS端勿使用VPN、ss等代理,否则不会显示。
但是http代理本身也有诸多弊端:
- 代理协议本身不支持 UDP;
- 很多设备不支持配置代理;
- 部分支持配置代理的设备,也有很多流量不走代理;
- 部分设备走代理会出现连接异常断开的问题(如 Apple TV 和 PS4);
还好surge for Mac为我们提供了gateway(网关模式):Surge for Mac之网关模式的妙用
写到这里该说的也都说的差不多了,完结撒花!
参考链接:
Surge官方文档:https://manual.nssurge.com/
Surge for Mac 简明指南:https://medium.com/@scomper/surge-for-mac-简明指南-f6f357b8f09c
让人耳目一新的 Surge Mac 2.0:https://medium.com/@scomper/耳目一新的-surge-mac-2–0-bb7cf735b1b8
文章转自: https://www.newlearner.site/2018/08/29/surge-for-mac.html