Surge 规则详解

Easter79
• 阅读 3037

打开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即可看见终端当前使用何网络。

Surge 规则详解

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)并记录。

Surge 规则详解

打开iPhone,和电脑连接到同一个局域网下面,点击!号进入Wi-Fi配置,配置http代理。服务器填写mac的ip地址,端口填写Surge的http代理监听端口。打开Surge的控制台,在远程客户端就可以看见iOS上面的流量情况了,点击流量抓取即可抓取和监管流量。

注:iOS端勿使用VPN、ss等代理,否则不会显示。


Surge 规则详解

Surge 规则详解

但是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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k