ShadowsocksR-win-4.9.2设置

系统代理模式、PAC、代理规则解释

Posted by 浅唱 on August 15, 2019

前言

ShadowsocksR控制代理模式的地方主要就是这三个设置:系统代理模式PAC代理规则,相信很多人对这三个设置会感到很迷惑,尤其是PAC代理规则里面相似的选项,那么它们究竟应该怎么设置,又分别实现什么功能呢?

系统代理模式

系统代理模式顾名思义就是ShadowssocksR在系统设置里面设置一个代理服务器,让软件可以直接调用系统代理设置直接连接代理服务器,而不需要单独的配置。
这样所有的软件都可以知道现在有一个代理服务器可以连接,而且只要跟随系统代理设置即可连接,无需额外配置。
一般而言,只有浏览器(包括内嵌在各种软件中的浏览器,比如 WeGame、优酷、迅雷9等软件中的内嵌浏览器)会自动调用系统代理进行连接。
而其它大部分应用一般是不会自动启用系统代理进行连接的,要在支持使用代理的软件里面手动设置, 所以这个选项的设置不会影响到这些软件。
这是因为绝大部分需要进行代理的需求都在浏览器上,其它软件很少有这个需要(如果有的话一般会提供配置和开关给用户)。
查看系统代理设置:

所以,系统代理设置控制的就是这个,它有三个选项:

  1. 直连模式
    直接模式会在系统代理设置里关闭代理,使启用系统代理设置的软件(一般为浏览器)不通过代理连接网络。但是,它并没有关闭在本地构建的代理服务器,其它手动配置代理的软件仍然可以通过代理连接网络。
  2. PAC模式
    PAC模式会在系统代理设置设置一个PAC脚本文件,让系统通过这个文件自动选择每一个连接是否启用代理服务器,以及选择哪一个代理服务器。
    详细的PAC介绍见 PAC 一节。
  3. 全局模式
    全局模式会在系统代理设置手动设置一个代理服务器,所有跟随系统代理设置的软件(一般是浏览器)都会使用这个代理服务器。

PAC

代理自动配置(英语:Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来访问一个网址。一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url, host)”。这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理器或者直接访问。
当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自动发现协议(WPAD)自动配置的。
简单来说,PAC是一种自动选择每一个连接是否使用代理服务器,以及选用哪一个代理服务器的技术,而自动选择是通过一个JavaScript脚本文件实现的,这个脚本文件制定了一系列的规则进行判断。
我们选择在系统代理模式中选择PAC模式后,PAC才会生效。ShadowsocksR右键菜单的PAC选项可以更新PAC文件为各种规则,但是貌似不能自动更新,可以定期手动更新下来获取最新的PAC文件规则。
上面是比较专业的术语,在这里我们用比较好理解的语言解释一下PAC各个选项中的运作模式
PAC规则 是根据PAC文件中的黑白地址名单来判断那些网站走代理。也就是判断 流量是否进入shadowsockR客户端。

  1. 绕过局域网IP
    • 此时走系统代理模式的浏览器,在访问局域网IP时不连接shadowsockR客户端,直接走正常的网络;
    • 在访问非局域网IP时,连接进入shadowsockR客户端的代理规则再做判断是否走代理网络。
      这边我们选择了该选项再打开pac.txt可以看到所规定的局域网IP
  2. 绕过大陆常见域名列表
    • 此时走系统代理模式的浏览器,在访问大陆常见域名列表时不连接shadowsockR客户端,直接走正常的网络;
    • 在访问非大陆常见域名列表时,连接进入shadowsockR客户端的代理规则再做判断是否走代理网络。
      这边我们选择了该选项再打开pac.txt可以看到这个规则包含了局域网IP以及很多大陆可访问的网站 这些都不需要通过代理来连接
  3. 绕过大陆IP(慎用)
    这个选项的原理跟前两个是一样的,为什么慎用呢?
    这里的大陆IP肯定不是指我们在浏览器的地址栏手动输入的IP地址,这边又涉及到域名的解析模式,我们在浏览器输入域名后,通过DNS服务器的解析获取到IP地址,此时再使用PAC规则判断是否要进入shadowsockR客户端。
    比较大型的网站都是有分配cdn节点的,不同地区获取到的IP是不同的。
    • 举例:比如我们在中国获取到服务器IP地址,他是本地网络访问最快的节点,但是他不在PAC的列表中没有被绕过,就会造成连接进入shadowsockR客户端绕行,减缓反应速度。如果又被代理规则命中走了代理,甚至可能导致无法访问。
      因此我们是不建议通过解析后的IP来判断连接是否进入shadowsockR客户端的。
  4. GFWList
    这个规则包含了被墙的域名,被该规则命中的连接进入shadowsockR客户端,其他未被命中的连接不进入shadowsockR客户端,不存在被代理规则判断的问题。
    • 曾经看到有一个问题>如果paclist里某个网址被墙,但是却是非国外网站,那么这时候,shadowsocks就不会让它走代理服务器(如果选了“绕过局域网和大陆”)。
    • 对此的结论是该连接不会走代理。该连接被PAC规则命中进入了shadowsockR客户端,进行代理规则判断,此时代理规则为“绕过局域网和大陆”,该连接为大陆IP,被代理规则绕过,也就是他进入了shadowsockR客户端,但是没有通过代理而是通过正常网络直接进行连接
  5. 仅通过大陆常见域名
    这个选项就是2选项的反向模式了,适合国外用户连接国内的代理服务器使用,在规则内的进入shadowsockR客户端被代理规则判断,不再规则内的走正常网络。

代理规则

ShadowsocksR会在用户的电脑上构建一个本地Socks5代理,代理规则选项是对所有连接了shadowsockR客户端的连接请求进行DNS解析(此时使用代理服务器的DNS获取域名的无污染解析IP),对解析得出的IP进行判断,根据不同的判断依据选择是否进行代理。
这边也顺带解释一下自定义的代理规则
代理规则 - 用户自定义 的规则文件是目录下的 user.rule 文件(如果没有就自己新建)。
注意:每次修改规则文件后,都需要 重启SSR客户端 才能应用最新规则。
提供一个Github上面找到的 ACL(PC客户端 规则文件,带去广告):https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/gfwlist-user.rule
如果不满意,可以去 Github 搜索 ACL,应该会搜到类似的文件!
你们可以边参考这个规则,边理解下面的解释,当然最好自己动手多测试几次。
当然你也可以直接下载这个现成的规则文件到ShadowsocksR客户端同目录下,并重命名为 user.rule 文件名拿来用。

文件格式

  1. 注释
    以#号开始的一行为注释内容,注意:#号的前面不得有空格
  2. 基本规则
    规则文件内,除了空行和注释,其它的每行都是一条规则,规则之间有先后次序之分。
    若出现相同的规则,那么后一条规则可覆盖前一条规则。
    规则分两类:
    1. 域名规则
      格式:

       hostname rule
       # 域名 规则
      

      hostname 格式支持三种写法:

       直接写完整域名,如 b.com ,此时不匹配 a.b.com 这类子域名。
       # 配置[b.com remoteproxy],即代表只有 b.com 走代理。
       带通配符的域名,如 *.b.com ,此时不匹配 b.com,但能匹配 a.b.com 这类子域名。
       # 配置[*.b.com remoteproxy],即代表只有 b.com 的子域名走代理,b.com 将继续往下面判断,如果下面没有 b.com 的规则,那么就直连。
       全部匹配的域名,比如.b.com,用于匹配 b.com 及 a.b.com 这类子域名的 ,任何末尾为 b.com 的域名均匹配。
       # 配置[.b.com remoteproxy],即代表 b.com 以及其所有子域名例如 a.b.com 都走代理。
      

      注意:b.com 与 .b.com 是会相互覆盖的(后写的有效),如果你需要 b.com 和它的子域名走不同的规则,那么分别写 b.com 和 *.b.com 两条规则即可。

      域名规则还有一种特殊的规则 rule 写法,例如:

       a.com 127.0.0.1
      .b.com 123.123.123.123
      

      这种规则相当于给 指定域名 (a.com) 或 一组子域名 (.b.com) 一个相应的IP,但不直接指定最终结果。
      这个相当于hosts,给域名指定ip地址,不论他是否走代理,域名的ip地址被固定下来了
      最终结果将由IP段规则决定,比如接下来的IP规则判断中,127.0.0.1 规则判断结果是直连,那么将使用此规则所指定的IP来连接。

    2. IP段规则
      格式:

       ip1 ip2 rule
       # IP段起始 IP段结尾 规则
       # 如果只要控制一个IP,那么 ip1 和 ip2 写一样就行,例如:
       # 1.0.1.1 1.0.1.1 remoteproxy
       # 1.0.1.1 走代理
      

      注意:ip2 必须大于或等于 ip1 ,此规则应用于包含 ip1、ip2 及它们之间的所有IP。
      如果两条不同的IP规则发生IP重叠,那么重叠的那部分以 后一条规则为准
      利用这个规则可以编写基于黑名单或白名单的IP规则,例如在规则文件内先写:

       :: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff remoteproxy
       0.0.0.0 255.255.255.255 remoteproxy 
       1.0.1.0 1.0.1.255 localproxy
       ......(等等其他规则)
       # 解释:
       # 如果你访问的IP是 1.0.1.5 ,那么第二行规则判断该IP走代理,第三行规则判断该IP走直连(或者说二级代理)。
       # 如果你访问的IP是 1.0.2.5 ,那么第二行规则判断该IP走代理,第三行规则判断该IP走代理(因为没有在IP段规则范围内)。
      

      前两行这样意味着所有的IP(第一行是IPv6全部IP段,第二行是IPv4全部IP段)默认走代理,然后利用后一规则覆盖前一规则来设置不走代理的IP,所以这就是白名单规则。
      反过来如果所有IP设置为 localproxy,那么就是黑名单规则:

       :: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff localproxy
       0.0.0.0 255.255.255.255 localproxy
       1.0.1.0 1.0.1.255 remoteproxy
       ......(等等其他规则)
       # 解释:
       # 如果你访问的IP是 1.0.1.5 ,那么第二行规则判断该IP直连(或者说二级代理),第三行规则判断该IP走代理。
       # 如果你访问的IP是 1.0.2.5 ,那么第二行规则判断该IP直连(或者说二级代理),第三行规则判断该IP继续走直连(或者说二级代理)。
      
    3. 规则匹配结果类型
      规则匹配结果类型有四种:
      • remoteproxy
      • localproxy
      • direct
      • reject
        均可用于两类规则。
        四种结果的含义:
        remoteproxy:经过SSR服务器连接(走代理)
        localproxy:经过本地代理连接,或没有配置本地代理时使用直连连接(本地代理指的是:选项设置 - 二级(前置)代理)
        direct:直连连接(直连,不走代理)
        reject:拒绝连接(可用于屏蔽广告,当然前提是用系统代理规则:全局模式,否则只有进入SSR客户端的广告才会被过滤)
    4. 规则匹配次序 当你访问 www.google.com ,浏览器配置全局模式(或者PAC模式,但谷歌被墙,PAC判断为走代理),然后浏览器会把谷歌网址的访问请求发给 SSR 客户端,然后:

       ┏━ SSR客户端 代理规则选择:用户自定义(你已经配置好了规则),然后 SSR客户端 会去代理规则中匹配 域名:
       ┃
       ┗┳━ 如果匹配域名规则 返回结果为直连,那么就直连不走代理(将不再继续 IP判断)。
       ┃
       ┣━ 如果匹配域名规则 返回结果为走代理,那么就直接走代理(将不再继续 IP判断)。
       ┃
       ┗━ 如果匹配域名规则 没有返回结果(就是没找到相应规则),那么就会去 SSR服务端 请求域名的 DNS解析,得到 IP 后,再继续匹配 IP规则:
       ┃
       ┗┳━ 如果匹配IP规则 返回结果为直连,那么就直连不走代理。
       ┃
       ┣━ 如果匹配IP规则 返回结果为走代理,那么就直接走代理。
       ┃
       ┗━ 如果匹配IP规则 没有返回规则(没有找到相应规则),那么就直接走代理。所以,空的 user.rule 文件等于全局模式(所有域名/IP走代理)。
      

与hosts的关系

hosts是本地定义域名,根据上述的原理,所有走本地网络的连接才会与hosts有关,包括被pac绕过的连接和被shadowsockR客户端的代理规则判断为直连的连接。

个人的选择建议

  1. PAC
    • GFWList仅包含被墙的客户端,如果单纯为了访问被墙的网站而连接shadowsockR应该选择这个选项
    • 绕过大陆常见域名列表,则使未被命中的连接进入shadowsockR的代理规则再次判断,所以如果是速度较快的付费梯子可以选择这个
  2. 代理规则
    • 建议使用自定义,下载别人编辑好的,在根据自己的需求进行修改。
    • 另外,代理规则的本地回环受到影响,原因未知,一旦本地回环进入shadowsockR客户端,将会无法访问,除非在PAC规则绕过本地回环

附带一张代理流程图

通过流程图可以看出,如果系统代理模式设置了PAC模式,浏览器等通过系统代理设置进行连接的软件要通过PAC、代理规则两层判断,而剩余情况只需通过代理规则这一层判断。