代理 - shadowsocks
聊一聊代理。
代理
代理的含义本身很简单。生活中有代理,开发模式有代理,封装的类也经常用到代理类。
在网络这一块,代理差不多也是同一个意思:A请求B,但无法连接上B,所以将请求发给C,C作为代理去访问B,再把结果返回给A。
代理服务分类
http代理
该代理服务器仅代理http请求,所以只代理浏览器访问网页。
socks代理
全能代理。
之所以全能,是因为它是处于OSI model第五层的,在TCP/UDP之上,各种应用层协议(HTTP/FTP/IMAP/SSH/DNS等)之下,所以所有的应用层协议它都能代理。这就意味着不止用浏览器上网,发邮件也是可以用它代理的。
如果说五层模型的话,它显然是网络层的,和IP数据包在同一层,不过因为它要被IP数据包封装,所以可以认为它在网络层的偏上部。
socks4只能代理tcp,socks5也支持tcp。所以DNS协议(基于UDP)也能用socks5代理。
socks协议在网络层就可以处理,而不用上升到应用层,所以对于代理服务来说,处理起来要比http代理快得多。
一般socks代理服务绑定本地1080端口。
socks5协议和处理流程,很清楚地表明了socks协议传输的东西:
- request:
- DSTADDR:destination address,client要告诉server我要连哪个地址;
- DSTPORT:同上;
- response:
- BNDADDR:bound address,请求成功后客户端需要连接的代理服务器的地址或域名(有可能就是代理服务器本身的一个网卡,也可能被分配到别的代理服务器),客户端之后的通信均通过地址对应的服务器;
- BNDPORT:同上;
也就是说:在连接建立之后,server新开一个地址让client连接,client会把所有request都发到这个新的连接上,代理服务器会把这个新连接的所有request转发给刚刚的目标服务器。
根据我的实测,使用代理连接twitch,连接建立之后,把代理关了,此时client访问不了其他需要翻墙的网站了,也访问不了其他twitch页面,但是刚刚打开的twitch流就没断过。查看服务器的代理端口,的确没有连接:
1
2
3
4
5
6
{} ~ sudo netstat -anp | grep :8005
tcp 0 0 104.225.232.103:8005 0.0.0.0:* LISTEN 21247/python3
udp 0 0 104.225.232.103:8005 0.0.0.0:* 21247/python3
{} ~ sudo netstat -anp | grep :8004
tcp 0 0 104.225.232.103:8004 0.0.0.0:* LISTEN 21247/python3
udp 0 0 104.225.232.103:8004 0.0.0.0:* 21247/python3
所以他们应该是使用另外的端口在交流。
参考:
- https://www.addesp.com/archives/2594
代理方式
代理可以配置在系统上,所有的网络请求都走代理,也可以单独配给某个应用。
系统代理
整个系统的代理,系统所有的请求都发往系统代理。Windows可以直接在设置里进行设置。
分应用代理
各个应用可能会支持单独配置代理,比如浏览器、迅雷、qq等。
代理软件
代理软件有很多。但都需要你拥有一个代理服务器的地址,然后把地址告诉代理软件,并配置哪些请求会用这个代理。
所以代理软件之间的区别无非就是做的是否更人性化、更方便配置、拥有更多的功能设置。代理软件有开源的也有收费的,但不管怎么样,都需要有提前购买好的代理服务器地址才能使用。
v2rayN
支持系统级代理配置的软件,可以配置整个系统的代理,所以买了各种代理之后,经常被要求先下载个v2rayN。
- https://github.com/2dust/v2rayN
它有以下代理模式:
全局模式
电脑所有的网络请求都先发给代理服务器。
打开全局模式之后,可以查看windows系统设置里的代理,发现系统已经配置了全局代理服务器,localhost:10809
。所以其实就是v2rayN帮你设置了全局代理模式,代理服务器是v2rayN里填入的服务器地址。
PAC模式 - GFWlist & 手动添加
PAC(Proxy Auto-Config),即自动配置的代理。
一般是一个配置文件(PAC文件),只有PAC文件里的域名需要走代理,其他的不需要代理。
PAC名单里的域名是哪些?已经有一个整理好的 GFWlist(Great Fire Wall,中国国家防火墙),里面记录了很全的被屏蔽的域名。
所以v2rayN里的PAC模式就是设置了GFWlist的文件地址:
- https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
它的内容base64编码了,可以很容易反编码:
1
2
$ url=https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
$ curl -s $url | base64 -D
- https://github.com/gfwlist/gfwlist/issues/1199
GWFlist现在是github的一个工程,里面记录了中国大陆屏蔽的网站:
- https://github.com/gfwlist/gfwlist
它的语法可以参阅wiki:
- https://github.com/gfwlist/gfwlist/wiki/Syntax
- https://github.com/gfwlist/gfwlist/issues/401
它会更新,但不一定很及时。所以v2rayN还支持自己手动添加一些PAC规则,添加完会立即生效。
直连模式
仅开启http代理,不代理其他的。和单独给浏览器配置代理服务器应该是一个意思。
SwitchyOmega
SwitchyOmega是chrome的一个插件,它也是一个方便配置代理的工具。只不过它只能给浏览器配置代理,属于应用级代理配置软件,不能给整个系统配置。(给chrome配置了,只有chrome能用,firefox也并不能用)
- https://github.com/FelisCatus/SwitchyOmega/wiki/GFWList
相较于浏览器自己提供的代理配置,SwitchOmega会更强大一些,支持任意切换等。
ShadowSocks(client)
shadowsocks主要指代理server,但也有client,用于连接代理服务器。这里指的是client。它是一个经常使用的支持系统级代理配置的软件。
- https://github.com/shadowsocks/shadowsocks-windows
代理服务器
那么最关键的问题来了:代理服务器哪里搞?无外乎买别人的,或者自己搭。
从我自己的经验来看,买别人的其实性价比不高。一般情况下,买代理可能比自己买服务器搭建代理稍微便宜一点儿,但其实存在诸多不便,比如:
- 流量限制:显然,每月的流量有限额。想不限流可以,但就很贵了;
- 不稳定:毕竟是和别人共用的代理服务器,经常被封。虽然有订阅地址可以更新,但还是很麻烦;
- 跑路:卖代理的是什么背景咱也不知道……正规厂家肯定不敢干这个,所以代理突然跑路了也正常……
自己搭则各种爽。唯一的门槛就是需要linux相关知识。
事实证明,知识就是力量。
自建代理
自己搭建代理服务器需要两步:
- 首先需要买一台海外服务器,或者说VPS(虚拟私有服务器);
- 给海外的服务器安装代理服务;
购买VPS
一定要是海外的,阿里云不行(阿里云海外版可以),不然访问不了国外网络,搭个代理有啥用……
官网,但是国内没法直连:https://bandwagonhost.com/
国内可以直连的一些相关官网镜像:
- https://hupost.org/article/tech/web_tech/vpn-%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91
- https://www.bwgyhw.cn/bandwagonhost-deploy-new/
- 搬瓦工官网国内镜像:https://bwh81.net/index.php
- 已购产品页:https://bwh81.net/clientarea.php?action=products
- VPS管理页:https://kiwivm.64clouds.com/main.php
我是在搬瓦工上买的服务器,约300RMB一年,支持支付宝支付,配置如下:
- 20GB ssd;
- 1GB ram;
- 1TB bandwidth;
- 2x intel Xeon cpu;
- 网速:1Gigabit/s;
- 流量:1TB/month;
一个月1T流量,一天能用30多G,基本相当于不限速了。
买好之后可以在订单里找到买的服务器信息。我直接把redhat重装为Debian 11 bullseye了。
还能在它提供的简单管理界面查看服务器监控、执行命令等。
不过,既然已经有了以下信息:
- ip;
- root & password;
直接用本地linux shell ssh上去就行了,还能复制粘贴,比官方自己的浏览器版命令行好用多了。
代理服务
代理服务一般是shadowsocks或者加强版shadowsocks-R。这里选的是shadowsocks。
在shadowsocks的官网上,有关于配置、调优的细节:
- https://shadowsocks.org/en/config/quick-guide.html
令人兴奋的是,在首页发现shadowsocks竟然在AUR里可以直接安装,arch还是强啊!
- https://aur.archlinux.org/packages/?O=0&K=shadowsocks
还找到了shadowsocks的白皮书,相当不错,需要的时候可以研究一下:
- https://shadowsocks.org/assets/whitepaper.pdf
安装代理服务
pip
参考:
- https://github.com/frank-lam/vps-ss
- https://github.com/shadowsocks/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
建议先安装zsh,操作bash实在是不够方便。
准备:
1
2
apt update & apt upgrade
apt install python3 pip
安装shadowsocks server:
1
pip install shadowsocks
配置:
1
2
3
4
5
6
7
8
9
10
11
12
{
"server": "xxx",
"port_password": {
"8001": "xx",
"8002": "xx",
"8003": "xx",
"8004": "xx",
"8005": "xx"
},
"timeout":300,
"method":"aes-256-cfb"
}
- 填server公网ip;
- 这里不同的端口号配置了不同的密码,方便分享给不同的人;
启动/关闭服务:
1
2
ssserver -c /etc/shadowsocks.json -d start
ssserver -c /etc/shadowsocks.json -d stop
果然,报错了……人生处处都是坑……
1
libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup
查了一下,果然是版本问题。简单粗暴的做法就是需要把openssl里的变量替换一下。这里我的shadowsocks的openssl的地址为:/usr/local/lib/python3.9/dist-packages/shadowsocks/crypto/openssl.py
,使用vim对文件全局搜索替换::%s/cleanup/reset/
。
再启动就好了。
后来重启了一次,结果起不来了,有了新的报错:
FileNotFoundError: [Errno 2] No such file or directory: b'liblibcrypto.a'
,很迷幻。后来参考这个回答,类比着创建了一个软连接:ln -s -f libcrypto.a liblibcrypto.a
,就启动成功了。
debian
- https://github.com/shadowsocks/shadowsocks/wiki/Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
客户端连接
服务都启动好了,用客户端连接就行了。
客户端没必要非得用shadowsocks,上面说的v2ray也行,本质上都是一样的。shadowsocks client下载地址:
- windows:https://github.com/shadowsocks/shadowsocks-windows/releases
- macos:https://github.com/shadowsocks/ShadowsocksX-NG/releases
- android:https://github.com/shadowsocks/shadowsocks-android/releases
- ios:https://github.com/shadowsocks/shadowsocks-iOS/wiki/Help
shadowsocks的官网也有下载链接:
- https://shadowsocks.org/en/download/clients.html
最后,都别忘了配置PAC。
一个不错的链接
找到个关于shadowsocks的终极教程,里面有关于苹果ipad/iphone使用ss的介绍。是一个名为shadowsockshelp的github账号:
- https://shadowsockshelp.github.io/Shadowsocks/ios.html
- https://shadowsockshelp.github.io/
- https://shadowsockshelp.github.io/Shadowsocks/
其他配置
- 一键部署ss,不过看起来停止维护了:https://www.flyzy2005.com/fan-qiang/shadowsocks/install-shadowsocks-in-one-command/
- 控制流量,其实就是iptables控制端口流量:https://www.flyzy2005.com/fan-qiang/shadowsocks/multiple-users-and-traffic-limited/
- shadowsocks-manager:https://www.flyzy2005.com/fan-qiang/shadowsocks/shadowsocks-manager-config/
后记
起飞!自己的代理可比买别人的爽太多了!再也没人限制我了!再也不用改配置了!再也不会连不上了!还能分享给亲友使用,这才是最具性价比的方式。
最最最关键的,代理的价值已经让VPS的钱回本了,那这台VPS不就相当于白嫖的了嘛:D