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试用的资格,然后创建实例(启动实例),步骤如下:

  1. 选择Red Hat Enterprise Linux 8 (HVM), SSD Volume Type 64 位 (x86)
  2. 选择实例类型,默认即可
  3. 配置实例,默认即可
  4. 添加储存,默认即可,如果你想增加的话,增加的那部分储存空间可额外收费的
  5. 添加标签, 默认即可
  6. 配置安全组,这步比较关键,需要对这实例增加端口(也就是其他一些教程说的防火墙规则),因此我们需要点击添加规则(类型:自定义TCP规则,协议:默认TCP,端口:8989,来源:任何位置),最后点击审核和启动
  1. 启动,选择密钥对,下载并保存好,后续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-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
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn