关于服务器代理方式的严肃科普

关于服务器代理方式的严肃科普

注意,请仔细阅读本文以以获取文中传达的信息。本文是仅探讨技术,不探讨与技术无关的其他事情。另外,请不要在社交平台转载本文,否则后果自负

服务器代理的原理

代理(Proxy),就是在两台计算机之间加入一个中介,代理两台计算机的通信。本来 Bob 可以直接应答 Alice 的请求,但是加入了代理服务器 Proxy 之后,Bob 需要通过 Proxy 作为中间人来应答 Alice 的请求。

功能

  • 协调访问速度:当 Alice 请求的速度和 Bob 答复的速度不一致时,Proxy 通过监视 Alice 的请求,可以实现对请求的部分限制,从而控制 Alice 请求的频次,使 Bob 不会因为大量请求而超负荷。
  • 保护Alice:通过 Proxy 可以实现对真正的请求者 Alice 的隐藏。
  • 过滤内容:如果 Bob 对于 Alice 过于不满而口吐芬芳,Proxy 可以让 Alice 知道 Bob 的本意是为她好的。

Two computers connected via a proxy server. The first computer says to the proxy server: "ask the second computer what the time is".

HTTP协议

HTTP 协议即超文本传输协议。这是目前网页浏览中最常用的数据传输协议。假如我想访问学校的官方主页www.xjtu.edu.cn,即连接学校服务器并下载官网对应的数据包。由于我的网络提供商存在防火墙,我不能直接与学校服务器进行通信。于是我先连接上我的HTTP代理。我的浏览器向HTTP代理发送标准的HTTP请求头,然后HTTP代理连接到了学校服务器,把学校服务器中传给它的任何数据发送给我。

SOCKS5协议

SOCKS5 协议是一种比 HTTP 协议更低层次的数据传输协议,按照OSI模型,它属于会话层(Layer5)的通信协议。(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)而HTTP位于最高层应用层(Layer7)。它会使用握手协议的形式,来促成直接连接。比如我想访问www.xjtu.edu.cn,我需要连接到我的SOCKS代理,告诉它我想与学校服务器连接。代理经过核验后打开一个防火墙上的门,让我和学校服务器之间直接通信。

服务器加密代理

由于直接服务器代理存在在某些特定情况下被劫包的可能,信息传输不是非常安全和私密,于是就需要进行服务器加密代理。

服务器加密代理最流行的方式是使用 shadowsocks 软件(简称SS,直译影袜,但大家都亲切地叫它酸酸,这个名字来源于广为人知的酸酸乳)。这个软件由前知乎程序员 @clowwindy 大神于2012年开发,并在社区开源。它是一种基于 SOCKS5 代理方式进行数据加密传输,在主机与服务器之间进行数据传输的代理协议。在代理中,ss-client 与 ss-server 之间的所有流量都经过多种特定的加密算法进行加密,加密算法有aes、rc4 等。

工作原理

本地的 client 将数据流加密并发送到远程 server 上, server 解密数据包后向特定服务器请求内容,并将收到的答复通过同样的加密方式送回 client 处。

illus2

需要注意的是,酸酸只是使用SOCKS5协议的代理。酸酸只接受SOCKS5协议的流量,而不支持HTTP或者HTTPS的流量。当需要访问网站产生HTTP/HTTPS流量时,是通过酸酸中的插件进行了流量转换,将HTTP/HTTPS协议的流量转换为了SOCKS5协议的流量,再通过虚拟私人服务器进行转发。对于Linux系统终端,由于其产生的HTTP流量无法经过这个插件进行转发,因此需要安装 proxychains 等工具进行协议转换。

配置方式

使用者使用此软件通常是为了绕开某些防火墙,提高访问速度,降低延迟,并且实现数据的加密传输。例如疫情宅家期间,由于使用VPN的人数多流量大,采用VPN访问学校网站变得十分困难(吐槽:实在是连不上我交的官方VPN)。采用这个软件绕过我交的防火墙,类似于走一条较为隐秘的小路进入校园网访问我交图书馆的数据库。为了实现这个目的,首先需要在校内搭建一台虚拟私人服务器,例如我放在宿舍里面一直没关机的树莓派。这台服务器需要能够和我主机顺利通信,不受影响,并且有校内网的合法IP地址。

假定我已经获取了树莓派在校内网的IP地址,然后我只需要在树莓派上安装 ss-server ,安装完成后设置转发端口密码,接着设置加密协议,等待服务器启动后即完成服务器端的设置。当然,为了方便大家快速稳定地查阅图书馆的文献,有些同学将自己搭好 server 的私人服务器出租外包。因为多台树莓派的昼夜不停,噪音很大,同宿舍的同学就以机场作比。为了防止宿舍夜间断电影响熬夜建模,有的同学会购买多台树莓派并合理安置到不同书院,利用不同书院的熄灯时间不同,以保证能够在家熬夜学习。

使用方式

如果需要使用加密代理,我需要在我的设备上安装 ss-client,这个不用担心,因为已经有人开发好各平台的免费版本,只需要在各个平台找到对应的客户端软件并安装(例如桌面端可以在github上获取),即可满足同学们随时随地使用各种设备阅读图书馆文献的需求。安装完成后输入先前在服务器端设置的IP地址、转发端口、用户名、密码、加密协议,保证与服务器一致后即可连接并开始转发。有意思的是,最初开发者采用纸飞机图案作为软件的 icon ,所以后来的各种魔改版本只是改变了纸飞机的颜色,例如安卓平台常用的是绿色的版本。

在iOS平台,可以使用 shadowrocket 软件进行加密服务器代理,图案是白色小火箭。也许是因为我国的航天航空不交给私人公司运营,因此在 AppStore 国区找不到这个软件,但是在美区商店可以找到这个软件。也许是因为美国商业航天比较发达,下载这个软件需要付费(18元左右)。当然在iOS平台还有其他软件可以实现服务器的加密代理,如Kitsunebi、Quantumult(X)、Potatso,如这里不再详述。

如果和某些同学合租校内树莓派,则可以采用订阅链接方式,输入链接,一键更新server。因为书院时有断电,这种方式可以动态配置用户租赁的树莓派,确保随时都能查阅图书馆数据库。

其他软件

由于仅使用酸酸的加密效果不好,后来有程序员在酸酸基础上加入了混淆,发展成为 shadowsocks-rss 即酸酸乳。起初这个软件并未开源,因此遭受到了酸酸的原作者和社区的一致谴责。现在这个软件已经采用多个协议开源。对于 client 端,社区已经开发了兼容所有主流平台的版本。对于 server 端,已经使用 Python/Go/C/C++/Perl 等语言实现,并发布于相关的社区中。这个版本比酸酸更广为人知,尤其是它粉色的标志,更加深入人心。同样可以在github上找到它各大平台的客户端。此外,酸酸乳还支持链接分享、二维码分享和NFC分享功能。通过酸酸乳分享的链接如下所示

ssr://djEtY24wMS4wMDgwMTUueHl6OjU4MjphdXRoX2FlczEyOF9tZDU6YWVzLTEyOC1jdHI6dGxzMS4yX3RpY2tldF9hdXRoOk5qbFRhMk5ELz9yZW1hcmtzPVZqRXQ1TGl0NTd1bkxlYVdzT1dLb09XZG9UQXhXM2d4TGpBZ1hRJnByb3RvcGFyYW09TVRJNE5EUTZSVmRHYkhscyZvYmZzcGFyYW09TW1JMVpUVXhNamcwTkM1dGFXTnliM052Wm5RdVkyOXQ

服务器加密代理与虚拟专用网络的区别

虚拟专用网络(VPN),主要用来给企业内网进行加密传输数据。使用者在公网中连接上虚拟专用网络,然后所有数据流量都通过虚拟专用网络代理,相当于将公网中暴露的设备接入了一个私有的局域网。使用者的IP地址变成了局域网中分配的IP地址。虚拟专用网络技术可以对流量进行加密,因为这一技术的初衷就是实现网络通信的安全性。但是却有很多不法分子使用这一技术进行突破国家防火墙的尝试,这一点非常不可取。首先采用这一技术搭建非法信道进行国际联网,直接违反《中华人民共和国计算机信息网络国际联网管理暂行规定》第六条、第十四条;其次,使用虚拟专用网络进行通信,其流量特征非常明显,而且设备握手是明文,有明显的流量特征,易于国家防火墙进行封锁。

Proxy auto-config

对于虚拟专用网络,一旦用户使用虚拟专用网络进行通信,其设备的IP地址将会被换为局域网中分配的IP地址,则使用该设备产生的所有数据流量都将通过局域网进行转发。

酸酸乳的全局模式下,会将设备的所有 HTTP/SOCKS5 数据都通过代理服务器进行转发。即连接所有网站都需要通过酸酸乳进行代理。那么这又出现了一个有意思的问题,如果我开启了酸酸乳,再访问百度等网站,会怎么样呢?首先用户的请求会通过酸酸乳转发到校园网内的树莓派上,然后树莓派借助校园内网的出口向百度的服务器进行请求。如果校园内网关闭,或者学生区网络限速,则会导致对百度访问缓慢卡顿。为了解决这个问题,酸酸乳的发明者提出了 Proxy auto-config 方案。

而酸酸乳中加入了 Proxy auto-config ,即PAC模式。此模式下会将校园内网,如思源学堂、选课端等网站加入一个名单,对名单上的网站采用酸酸乳进行流量转发。对于不在名单上的网站,则不进行代理服务器转发,直接连接。如果查看此时的IP地址,从名单上的站点来看,此时你的IP地址为代理服务器(即宿舍的树莓派)。从不在名单上的站点来看,此时你的IP地址为你家里的IP地址。

神机规则

这是一套应用于iOS端主流代理软件的规则,可以在https://github.com/ConnersHua/Profiles/tree/master 中找到详细介绍。这套规则主要用于加速Apple服务和部分流媒体服务,并且集成了拦截应用广告、拦截欺诈广告的功能。由于开发者精力有限,无法再维护主分支,并移除了主分支的所有内容。请需要学习参考的同学自行切换 branch 为 master 分支查看。

Linux 终端代理

由于本人电脑上的Win10被自己折腾version 2004搞坏了,而且最近写coursework装不上环境,于是就把自己的主要工作平台迁移到了 Ubuntu 上面。由于很多资料放到了 Office Onedrive 上面无法替代,于是采用网页版 Onedrive Live 和桌面端的 WPS2019 for Linux 暂时代替。因为微软的 Onedrive 使用的主服务器在美国,在国内直接访问过于缓慢,严重影响使用体验。通过查阅资料了解到,购买 Office365 和Onedrive for Business 后可以使用世纪互联公司的代理服务器,但是仅适用于 Windows 平台,当然也可以通过修改DNS的方式来解决这个问题,但是不是长久之计。由于我是 Linux 平台,只能尝试在 Linux 端自行设置服务器代理,将流量通过代理服务器转发到微软的主服务器上,绕过速度较慢的出口通道来提升访问速度。

由于Linux的终端是只支持 HTTP 代理而不支持 socks代理的,如果要让终端上跑的服务使用代理,则需要设置终端代理。使用proxychains可以对终端的 socks 流量进行代理。proxychains允许使用SOCKS4、SOCKS5、HTTP等多种协议进行服务器代理

sudo apt-get install proxchains

修改配置

sudo vi /etc/proxychains.conf

将最后一行的[ProxyList]增加或修改为socks5 127.0.0.1 1080代表从本地IP127.0.0.11080端口进行监听,然后Esc -> :wq! 保存并退出

现在就把终端代理配置好了。此时开启 shadowsocks-ssr ,在终端中在需要使用代理的命令前加入 proxychains就能够通过 socks5 对终端中的命令进行代理了。

例如,我需要使用代理启动 dropbox, 那么我可以在终端中输入如下代码

proxychains dropbox start -i

当然,dropbox中也可以在 preference 中自行设置 proxysocks5 转发


参考链接

https://en.wikipedia.org/wiki/SOCKS#Comparison_to_HTTP_proxying

https://doubibackup.com/4e-hd3iu-2.html

https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

https://duyaoss.com 这里有非常详细的介绍和选购指南

http://zhihan.me/network/2017/09/24/socks5-protocol/

https://merlinblog.xyz/wiki/rules.html

https://congcong0806.github.io/2018/04/20/SS/

参与讨论