神代綺凛の随波逐流

[SS/SSR] 分析&相关科普:“允许来自局域网的连接”到底怎么用

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »

rt,这一块会详细的讲一下

这篇文章所讲的内容有一部分是来自于个人的理解,可能与实际有偏差/不符,如有错误欢迎指正

允许来自局域网的连接

通过这个选项,我们可以在本机上开启 酸酸/酸酸乳,并让其他没有(或无法安装) 酸酸/酸酸乳客户端 的设备使用代理

但是在这之后我们应该如何在其他设备上设置?为什么可以做到这样?

关于这个问题,我们先要从 HTTP代理 / SOCKS代理 和 PAC 讲起

PAC

PAC 是“Proxy Auto Config”的缩写,顾名思义,这是一个用于配置代理(Proxy)的一种文本配置文件

i> 实际上,这货是一种脚本,其本质是 JavaScript

当你使用 PAC 代理模式的时候,会通过 PAC 文件里的函数的返回(return)结果来决定对每个 HTTP 连接进行的操作

返回值总共有三种:

因此,通过 PAC 文件我们可以实现智能代理,让不需要走代理的流量直连,让需要走代理的流量通过代理服务器

HTTP代理

在 PC 上使用 酸酸/酸酸乳 的“全局模式”时候,客户端所做的仅仅是设置系统的代理服务器为 酸酸/酸酸乳 程序在本机上监听的 HTTP 代理端口

在使用“PAC模式”的时候,客户端会将系统代理设置成“使用自动配置文件”,并在配置文件地址中填写一个 PAC 地址,你在上网的时候系统就会根据这个 PAC 文件决定是否对当前站点启用 HTTP 代理

所以,实际上 PAC 代理模式的本质就是 HTTP 代理(或 SOCKS 代理),只不过是可以做到根据条件来选择性地代理

i> 酸酸/酸酸乳 在本机上建立的 HTTP 代理服务器的监听端口即为 酸酸/酸酸乳 的“本地端口”,默认为1080

SOCKS代理

SOCKS 是一种代理协议,分为 SOCKS4 和 SOCKS5 两种,他们的区别也就是 SOCKS4 不能代理 UDP,而 SOCKS5 可以

酸酸/酸酸乳 的本质实际上就是 SOCKS5,代理的流程简单来说就是这个样子(去程举例):

上网流量 → (HTTP代理 →) SOCKS5代理 → 酸酸/酸酸乳客户端(对数据包明文进行加密、混淆等处理) → 酸酸/酸酸乳服务器

i> 酸酸/酸酸乳 在本机上建立的 SOCKS5 代理服务器的监听端口即为 酸酸/酸酸乳 的“本地端口”,默认为1080
对,也就是说 酸酸/酸酸乳 在同一个端口上监听了两种代理协议,无论是哪种代理协议都可以使用这一端口

回到正题

那么我们应该如何正确设置,让这些设备的流量通过 PC 端正在运行的 酸酸/酸酸乳 客户端?

首先,一切的前提:PC 的防火墙必须要开放 酸酸/酸酸乳 的 SOCKS5 端口
不过,一般情况下,我们直接关闭防火墙就行了,这样是最省事的,在 Windows 的“控制面板”中有防火墙的设置,全部关闭即可

然后不要忘记在 酸酸/酸酸乳 的设置中允许来自局域网的连接:

如果你在公共网络下,例如学校校园网、公司内部网络,建议设置本地代理的用户名和密码(貌似只有酸酸乳可以设置,在右击菜单-选项设置里,而酸酸不可以)

方法一:PAC 代理法

这种方法十分简便,因为大部分系统都会自带 HTTP 代理的功能,一般不需要安装任何第三方软件即可使用

  1. 右击任务栏图标-PAC-复制 PAC 链接
  2. 把这个连接中的127.0.0.1换成 PC 的内网 IP
  3. 一般情况下,你会在设备的 WIFI 详细设置中看到设置 HTTP 代理的地方,将代理模式改为“自动”,然后填入这个链接即可(这个链接不能省略?后面的内容)

!> 一但你关闭/重启了 酸酸/酸酸乳 客户端以后,你都需要按照这个步骤重新填写 PAC 链接,具体原因将在后文解答

为啥每次都要重新填_(:3」∠)_

我们观察一下得到的 PAC 链接,大概像这个样子

#ss
http://127.0.0.1:1080/pac?t=20180226170918645&secret=vQylzqD8GubwJ6YE4nODz+bnv9DMZbX69P1webkpON8=
#ssr
http://127.0.0.1:1080/pac?auth=kWCRu-9D6FsbBpJajzJl&t=201802261715330850

如果你访问这个链接,你可以得到一个生成的 PAC 文件

可以自己试验一下,每次你关闭再重新打开酸酸,你复制的链接后面的查询字符串都会不同,而且你使用之前生成的链接是无法访问的

i> 查询字符串,英文叫做 QueryString,搞网站的朋友们看到这个单词应该不会陌生
例如链接http://127.0.0.1:1080/pac?t=20180226170918645&secret=vQylzqD8GubwJ6YE4nODz+bnv9DMZbX69P1webkpON8=的查询字符串就是t=20180226170918645&secret=vQylzqD8GubwJ6YE4nODz+bnv9DMZbX69P1webkpON8=,即问号后的内容

酸酸生成的 PAC 链接中,查询字符串中的参数是用来保证你的 PAC 文件只有你自己才能使用,相当于密码一样的东西

在家中还好,如果在大型公共网络中,例如学校校园网、公司内部网络,没有了这种如同密码的防护措施,任何人都可以通过在内网中“挨家挨户扫”的方法来盗用你的 PAC 文件

所以各位注意啦,当你通过这种方法使用 PAC 链接的时候,不能漏掉查询字符串,而且也要注意重新打开酸酸的时候要更换使用重新生成的 PAC 链接,否则是无法得到 PAC 内容的!

为什么不同的设备可以使用同一个 PAC 链接

对编程方面有一定知识了解并且善于思考的同学可能会发现一个问题:

PAC 文件可以用返回PROXY host:port的方法来让网页使用酸酸的代理,然而 PAC 文件是写死的,为什么 PAC 文件通过同一个链接可以让不同的设备使用?

拿某list的 PAC 举例子,打开原本的 PAC 文件,我们可以看到:

var proxy = "__PROXY__";
//中间省略……
function FindProxyForURL(url, host) {
    if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) {
        return proxy;
    }
    return direct;
}

如果你在电脑上使用http://127.0.0.1:1080/pac?t=20180226170918645&secret=vQylzqD8GubwJ6YE4nODz+bnv9DMZbX69P1webkpON8=这样的链接打开,你会得到

var proxy = "PROXY 127.0.0.1:1080;";
//后面省略……

假设你 PC 的 IP 是192.168.1.100,如果你在内网中的设备使用http://192.168.1.100:1080/pac?t=20180226170918645&secret=vQylzqD8GubwJ6YE4nODz+bnv9DMZbX69P1webkpON8=这样的链接打开,你会得到

var proxy = "PROXY 192.168.1.100:1080;";
//后面省略……

这下就很明了了,当你通过酸酸客户端生成的这种链接去访问 PAC 文件的时候,酸酸会根据你请求的主机(host),将__PROXY__替换成PROXY 主机:端口;

因此,即使你的 PC 处在多重网络的环境下,不同网域内的设备通过正确的 Host 得到的 PAC 文件链接就已经是包含正确配置信息的 PAC 文件了

既然如此,是不是直接填写静态的 HTTP 代理信息也可以?

是的,将设备的 HTTP 代理模式设置为“手动”,然后填写 PC 的 IP 和酸酸本地端口以及用户名密码(如果你是酸酸乳并且设置了本地代理的用户名密码),这样也是可以的

但是 PAC 的好处就在于可以智能代理,如果你手动填写 HTTP 代理信息,那么就只能全局代理了,在一般情况下我们用不到全局代理

方法二:通过第三方软件使用 SOCKS5 代理

可能比较麻烦,但也更强大

上一种方法介绍的直接在系统设置上使用 PAC(其本质也是 HTTP 代理)或者直接使用 HTTP 代理的方法,都有一个局限性,就是只能代理 HTTP 流量,即我们浏览网页的流量,而大部分应用程序发出的 TCP/UDP 流量是无法被代理的

Android

安卓可以通过一个名为 ProxyDroid 软件使用 SOCKS 代理,不过需要 root 权限

这个软件还能做到分应用代理等

然而安卓都有 酸酸/酸酸乳 客户端了,貌似不用这样多此一举,除非你是在使用安卓模拟器

iOS

通过 Shadowrocket 或者 Potatso Lite 之类的软件可以使用 SOCKS 代理(不过 Shadowrocket 本来就可以连接 酸酸/酸酸乳 了,这样实际上是多此一举)

PC

可以使用 Profixier 或者 Socks5Cap 来使用 SOCKS 代理应用程序

因为 PC 上的酸酸程序本身只是建立了一个 SOCKS5 服务器并监听本地端口,并不能直接做到代理应用,需要配合第三方应用来代理程序

如果是要代理网游之类的应用,为了更好的稳定性和效果,还是推荐直接使用 SSTap