slug: shadowsocks 【2.4.1】shadowsocks搭建了一个梯子
一、Shadowsocks基本概念
- GFW=Great Firewall (of China)=防火长城=中国国家防火墙=简称:墙
- Shadowsocks在技术上可以简单总结为: 一套基于Socks5代理方式的网络加密传输数据包的技术
Shadowsocks这套技术,有个自己官网:
另外,对应的ss技术的github主页是:shadowsocks
Shadowsocks(ss) 是由 Clowwindy 开发的一款软件,其作用本来是加密传输资料。当然,也正因为它加密传输资料的特性,使得 GFW 没法将由它传输的资料和其他普通资料区分开来(上图),也就不能干扰我们访问那些「不存在」的网站了。
但是时至今日,Shadowsocks 的安全性被发现是存在缺陷的,其 IP 和端口可以被嗅探到。因而,有了基于它但增加了混淆能力的 ShadowsocksR 项目、Simple-obfs 插件,以及 v2ray 项目等。 它们本质上,都是依托墙外服务器的网络代理软件。ssR 和官方版 ss 均已不再更新,目前还在更新的只有 shadowsocks-libev,可以说是最轻量的 ss 版本,也是本文推荐安装使用的版本。
1.1 Shadowsocks技术用于科学上网方法
而把Shadowsocks技术用于科学上网,则多种方案/方式可选择:
服务器+客户端模式
- 服务器:首先需要有个ss的服务器
- 服务器本身自己能够访问国外的网络
- 当然,同时该服务器上运行了ss的服务
- 即:服务器+ss服务,则一般有两种方式: 去买Shadowsocks第三方服务商提供的服务器;或者是自己买了VPS服务器后自己搭建出来的Shadowsocks服务器
- 客户端:然后需要对应客户端,才能用起来Shadowsocks的服务,才能科学上网
- 不同的平台下,需要安装不同的客户端
- 且要支持对应的ss服务器所设置的加密方式
- 尤其是部分ss服务器采用最新的更复杂的加密方式,还要求客户端是最新版才支持,否则无法使用
路由器模式
还有一种,不需要客户端的、更一劳永逸的、但更复杂的、也更方便的方案:路由器模式
首先我们知道,我们一般上网都是通过连接了路由器提供的网络而才能去上网的。
而如果通过设置,去实现了,在路由器内部本身就通过ss实现了科学上网,则意味着: 其他使用此路由器提供的网络的人,不论是电脑(Window/Mac)还是手机端(iOS/Android),都无需额外设置,本身就可以达到科学上网的效果了。
总的说就是:用路由器实现ss科学上网,其他连接此网络的设备,无需任何操作即可一劳永逸的直接科学上网了
二、Shadowsocks服务器的配置
2.1 申请服务器
申请一个亚马逊的的账户,申请一个EC2服务器
首先注册一个亚马逊账户,获取免费一年AWS试用的资格,然后创建实例(启动实例),步骤如下:
- 选择Red Hat Enterprise Linux 8 (HVM), SSD Volume Type 64 位 (x86)
- 选择实例类型,默认即可
- 配置实例,默认即可
- 添加储存,默认即可,如果你想增加的话,增加的那部分储存空间可额外收费的
- 添加标签, 默认即可
- 配置安全组,这步比较关键,需要对这实例增加端口(也就是其他一些教程说的防火墙规则),因此我们需要点击添加规则(类型:自定义TCP规则,协议:默认TCP,端口:8989,来源:任何位置),最后点击审核和启动
- 启动,选择密钥对,下载并保存好,后续SSH登录时需要用
经过上述步骤,AWS实例是创建完成了,然后用SSH登录实例即可
2.2 服务器配置Shadowsocks
然后本地的服务器来远程连一下申请的EC2的服务器,这里注意一下,默认的用户为ec2-user,否则会报错
chmod 600 .ssh/identity.pem
[sam@g03 ~]$ ssh -i .ssh/my-amazon.pem root@ip
Please login as the user "ec2-user" rather than the user "root".
Connection to 3*** closed.
如果用其他用户,可能会报错 Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
[sam@g03 ~]$ ssh -i .ssh/my-amazon.pem ec2-user@ip
登录以后,做一些配置
sudo yum update
sudo yum install wget
sudo yum install python3
wget -c https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9
tar -xzvf pip-9.0.1.tar.gz
cd pip-9
sudo mkdir -p /usr/local/lib/python3.6/site-packages/test-easy-install-24126.write-test # 没有这一步,会提示安装路径问题
sudo python3 setup.py install
修改/etc/sudoers文件,/usr/local/bint添加到secure_path中:
sudo vim /etc/sudoers #给sudo 添加环境变量路径
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
sudo pip install shadowsocks
最后启动shadowsocks,-p指端口,-k指shadowsocks登录时的密码,-m指加密方式;如果要关闭,则将start改为stop即可
sudo ssserver -p 8989 -k password -m aes-256-cfb -d start
通过命令:netstat -autn 或:netstat -lnp,去查看ss的端口是否正常
[root@crifan yum.repos.d]# netstat -autn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21500 0.0.0.0:* LISTEN
...
tcp 0 0 45.79.205.194:443 222.188.39.139:52004 ESTABLISHED
...
tcp 0 1 45.79.205.194:80 61.147.173.53:45254 LAST_ACK
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:21500 0.0.0.0:*
其中的21500就是上面设置的ss的端口,对应着tcp和udp的服务,表示都在正常运行。
2.3 遇到的报错
/lib64/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup
解决办法:
cd /usr/local/lib/python3.6/site-packages/shadowsocks/crypto
sudo cp openssl.py openssl.py.bak
将openssl.py中
将所有
EVP_CIPHER_CTX_cleanup
替换成为
EVP_CIPHER_CTX_reset
二、Shadowsocks客户端通用逻辑
2.1 客户端下载
windows版本:
https://github.com/shadowsocks/shadowsocks-windows/releases
Mac版本
MAC Shadowsocks客户端各版本区别 Shadowsocks 的MAC客户端,主要有两个版本:ShadowsocksX 和 ShadowsocksX-NG,其中ShadowsocksX-NG为ShadowsocksX的最新版本 。目前这两个版本仅支持SS原版,不支持SSR的混淆功能。 而Shadowsocks R 的MAC客户端,则衍生于以上两个版本,在名称后面多个字母R:ShadowsocksX-R 和 Shadowsocks-NG-R。带R版本支持SSR混淆功能。 目前更建议安装 Shadowsocks-NG-R 版本,下面我们会做详细介绍。
ShadowsocksX :
- 对应下载地址是:ShadowsocksX-2.6.3.dmg
ShadowsocksX-NG:
- 之所以换用ShadowsocksX-NG ,后来在shadowsocks.to改用新加密算法chacha20-ietf-poly1305后,而ShadowsocksX不支持,所以才换用ShadowsocksX-NG的。
ShadowsocksX-NG-R :
- ShadowsocksX-NG-R 目前最新版本为 ShadowsocksX-NG-R8 1.4.4,适用于iMac/Macbook。
- 下载地址:https://pan.baidu.com/s/1eDvQXVq8aSZA8YYmicKmRg
ShadowsocksX-NG-R和 ShadowsocksX-NG,我都试了一下,现在这两个都报错,具体什么原因,还没有解决。。
#ShadowsocksX-NG 版本 1.8.2
tail -n 20 ~/Library/Logs/ss-local.log
2019-07-17 10:57:01 INFO: initializing ciphers... aes-256-cfb
2019-07-17 10:57:01 INFO: listening at 127.0.0.1:1096
2019-07-17 10:57:01 INFO: tcp port reuse enabled
2019-07-17 10:57:01 INFO: udprelay enabled
2019-07-17 10:57:01 INFO: udp port reuse enabled
2019-07-17 10:57:01 ERROR: remote_recv_cb_recv: Connection reset by peer
2019-07-17 10:57:01 ERROR: remote_recv_cb_recv: Connection reset by peer
#ShadowsocksX-NG-R 版本 1.4.4-R8
500 Internal Privoxy Error
Privoxy encountered an error while processing your request:
Could not load template file connection-timeout or one of its included components.
Please contact your proxy administrator.
If you are the proxy administrator, please put the required file(s)in the (confdir)/templates directory. The location of the (confdir) directory is specified in the main Privoxy config file. (It's typically the Privoxy install directory, or /etc/privoxy/).
安卓手机客户端下载
https://github.com/shadowsocks/shadowsocks-android/releases
2.2 ss客户端使用ss服务的配置信息包含哪些
ss客户端使用ss服务的配置信息包含哪些 有了ss客户端,想要用ss服务的话,前提是你已经有了对应的ss服务器的配置信息
最最基本的ss服务器的配置信息至少包括:
- 服务器的地址:一般是IP或域名
- 服务器的端口号:
- 加密方式:常见都有aes-256-cfb、chacha20-ietf-poly1305等等
- 密码:
然后把这些配置信息,添加到ss的客户端中,就可以使用ss了。
2.3 加密方式:aes-256-cfb 和 chacha20-ietf-poly1305
在介绍如何用ss客户端之前,先对于加密方式做个详细的解释,否则会导致下载了客户端,但不支持新的加密方式,而无法使用的问题。
ss技术本身不限制你采用何种加密方式去加密数据。
目前主流的ss服务器端所采用的加密方式,其实更多的还是:aes-256-cfb
而有些ss服务,比如前面提到的shadowsocks.to,现在是采用最新的加密方式:chacha20-ietf-poly1305
对比来说就是:
之前旧的加密方式是:aes-256-cfb
- 最常见,使用的最为广泛
- 所以一般的ss的客户端也都支持
- 比如之前我就用过的: Mac的ShadowsocksX; Android的影梭
- 但是不是足够复杂和安全
现在新的加密方式是:chacha20-ietf-poly1305
- 相对来说,更加复杂,但也更安全
- 但是:很多旧版本客户端都不支持。换句话说:如果你的ss服务用的是chacha20-ietf-poly1305加密方式,但你用的客户端不支持chacha20-ietf-poly1305(即使支持chacha20-ietf也不行),那就没法使用ss了 只有一些新版的客户端才支持,包括:
- Mac:macOS shadowsocksX-NG 1.6.1+
- Windows:Shadowsocks-Windows 4.0.6+
- Android:Shadowsocks Android 4.2.5+
- iOS:最新版shadowrocket 或Potatso/Potatso Lite
2.4 添加ss服务配置信息的方式
对于ss客户端中去添加上述ss服务器的配置信息,有多种方式:
手动(一个一个)添加(ss服务器配置信息)
对于上述的ss服务器的配置信息,可以一个个手动的去输入。
典型的方式是,一个个复制和粘贴对应的ss服务器的地址,端口号,选择对应的加密方式,粘贴密码等等,去手动添加配置信息。
扫(描二维)码(添加单个ss服务器配置信息)
一般的购买到的ss的第三方服务,都提供了二维码,某个二维码是对应ss服务器的配置信息根据一定规则生成的
-> 所以ss客户端如果支持扫码添加的话,即可去扫码,内部自动解析配置,从而自动添加该ss服务器配置信息
和上面的手动的复制和粘贴相比,肯定是通过扫码去添加配置,要方便多了。
批量导入(导入单个json配置文件实现一次性添加多个服务器配置信息)
ss客户端支持的话,可以去利用别人(比如我自己去添加多个服务器配置后,去导出)弄好的配置信息(一般是json文件),然后直接导入配置文件,即可实现批量添加多个ss服务器配置信息了。并且,同时也把其他ss客户端的其他设置信息也添加进来了,更是方便。
和上面的手动或扫码比,批量的导入,当然是更加方便了。
2.5 工作模式
如果不想要看下面的模式的详细解释,那么直接使用默认的PAC自动模式即可。
关于不同工作模式的解释:
PAC自动模式:
- 让Shadowsocks-NG去(根据设置中的GFW List)自动识别在打开网页时,是否需要翻墙
- 推荐:普通小白用户使用此模式
- 比如打开国内的百度,腾讯,网易等网站,不需要翻墙
- 比如打开国外的google,youtube等需要翻墙
全局模式:
- 强制对于所有打开的网页都是用翻墙
- 优点和使用场景:对于部分页面,有些网页用自动模式打不开,则可以尝试全局模式,往往可以打开
- 缺点:如果对于本身无需翻墙的国内网站,比如百度也强制翻墙的话,访问速度可能会降低
手动模式
- 提示:一般人很少用
- 设置为手动模式后,需要自己去编辑PAC用户自定规则,添加自己定义的规则,决定哪些页面翻墙,哪些页面不翻墙。
参考资料
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn