本文主要为大家记录如何才能够安装,配置并维护一台Shadowsocks-libev服务器。这篇内容的主要重点在于,如果大家能够按照这里的配置建议,我们的Shadowsocks-libev服务器就可以抵御各种已知的攻击。这其中包含来自于gfw的主动探测和封锁,以及partit oracle的攻击。当然我们也可以在教程的最后加入了有关Shadowsocks-libev部署的一些常见问题和解决方法。截止的日期为2021年的11月7日,在这个时间里,我们收到了很多用户的报告,按照这个教程配置的服务器,仍然遭受到了端口的封锁,因此我们在这篇文章当中分享了一个配置备用端口来缓解端口被封锁的好方法,希望对大家能够有所帮助。
其实我们一直都致力于更新和维护这篇文章当中的教程。如果今后我们发现了一些新的针对Shadowsocks-libev的攻击,就可以在第一时间在这篇文章当中加入相关的缓解攻击的方法。所以我们可以考虑将这个页面加入到自己的收藏夹当中。除此之外,也是非常希望这篇教程能够对那些技术小白同样的友好,简单的理解就可以进行更好的操作,如果大家在任何步骤卡住了,也可以第一时间与我们联系,或者是在下方评论区留言,我们将会针对出现的问题进行教程方面的改进,谢谢大家。
首先需要安装Snap 应用商店
我们可以通过Snap 应用商店来安装Shadowsocks-libev,这也是目前官方所推荐的方式之一。
如果自己的服务器运行Ubuntu16.04 LTS及以上的版本,那马就已经默认安装好了。
如果自己的服务器运行了其他的Linux 发行版,我们只需要跟着对应的发行版本来安装Snapcore。
现在我们就需要测试一下自己的服务器已经安装了需要的snapd和Snap core,具体为:
sudo snap install core
Shadowsocks-libev等安装
现在我们已经安装了最新版本的Shadowsocks-libev
sudo snap install shadowsocks-libev –edge
以下就是我们推荐的Shadowsocks-libev服务器配置,具体为:
“server”:[“::0″,”0.0.0.0”],
“server_port”:8388,
“method”:”chacha20-ietf-poly1305″,
“password”:”ExamplePassword”,
“mode”:”tcp_and_udp”,
“fast_open”:false
}
希望大家注意的是,我们要把里面的ExamplePassword替换成一个更加强大的密码,一个很强的密码有助于缓解最新发现的针对Shadowsocks服务器的Partitioning Oracl的攻击。我们可以再用以下命令,在终端生成一个很强的密码,具体为:
openssl rand -base64 16
还可以考虑将server_port的值从8388改为1024到65535之间的任意整数。
现在我们就可以打开通过Snap 来安装Shadowsocks-libev默认的配置文件了,具体为:
sudo nano /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json
可以将上面替换款的密码的配置信息,直接复制粘贴到配置文件之后,然后按ctrl+x退出,退出的时候,本片气息就会问大家“Save modified buffer?”,请输入y,然后按回车键就可以了。
这个时候就可以看到,我们已经通过Snap安装了Shadowsocks-libev,只不过默认的配置文件路径有点儿太长了,并不方便大家记忆。同时默认配置路径,又没有在官方文档当中清晰的标记出来,所以在这里面建议大家能够收藏这个页面,以防以后能够更好的寻找到。
我们可以使用Ufw 来管理Shadowsocks服务器的防火墙。这个主要是基于Debian的服务器上面,我们完全可以通过这样的命令来安装ufw,具体为:
sudo apt update && sudo apt install -y ufw
接下来就可以开放有关ssh和Shadowsocks-libev的端口。 需要注意的是,以下命令假设你在/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json中的server_port的值为8388。 假如你的server_port用了其他的值,还需要对以下的命令进行修改:
sudo ufw allow ssh
sudo ufw allow 8388
现在我们就可以启动ufw了,具体为:
sudo ufw enable
启动然后发现弹出Command may disrupt existing ssh connections. Proceed with operation (y|n)?,请输入y并按回车键。
接下来要用sudo ufw status检查一下你的配置是否和下面的一样:
Status: active
To Action From
— —— —-
22/tcp ALLOW Anywhere
8388 ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
8388 (v6) ALLOW Anywhere (v6)
坐到这里我们就可以启动Shadowsocks-libev了,具体为:
sudo systemctl start snap.shadowsocks-libev.ss-server-daemon.service
需要知道的是,一定记得设置Shadowsocks-libev开机自启动:
sudo systemctl enable snap.shadowsocks-libev.ss-server-daemon.service
这就需要大家检查运行状态和日志。
以下的这些命令可以帮助大家查看Shadowsocks-libev的运行状态,具体为:
sudo systemctl status snap.shadowsocks-libev.ss-server-daemon.service
如果大家看到绿色的Active: active (running),那么你的Shadowsocks-libev服务器可以正常的运行; 如果你看到红色的Active: failed,请用跳至如下命令journalctl -u snap.shadowsocks-libev.ss-server-daemon.service的尾部查看问题出在哪里了。
每当我们修改配置文件之后,不需要大家用下面的命令重启一下Shadowsocks-libev,已加载修改之后的文件,具体为:sudo systemctl restart snap.shadowsocks-libev.ss-server-daemon.service。
我们将时间截止到2021年的11月7日,已经接收到了很多用户的报告,他们按照这个教程配置的服务器仍然遭受到了端口的封锁。
但是因为报告当中的封锁方式都是端口封锁,而不是我们平时说的IP封锁,所以在此分享一个备用端口,用来缓解封锁的一个好方法。
大家可以在服务器上面使用一下这个命令,将服务器从12000~12010端口当中收到的tcp和udp流量全部都转发到8388端口,具体为:
sudo iptables -t nat -A PREROUTING -p tcp –dport 12000:12010 -j REDIRECT –to-port 8388
sudo iptables -t nat -A PREROUTING -p udp –dport 12000:12010 -j REDIRECT –to-port 8388
需要注意的是:
将12000:12010替换成一个只有你自己知道的端口号,或者是一个端口区间,在这里面推荐大家能够从1024~65535车间选择几个端口或者是一个区间,这样更稳妥一些。
也可以将8388端口替换成自己的Shadowsocks服务器实际使用的端口。
通过以上这样的操作,如果我们使用的是12000端口遭受到了封锁,那么无需大家更换IP地址,或者是登录服务器来修改配置文件,目前的操作就比较简单,只需要在客户端(电脑端或者是手机端)将端口从12000改为12001,这样就可以继续正常的使用了。
假如自己的配置正确,那么我们运用以下命令输出的时候,就应该显示如下:
sudo iptables -t nat -L PREROUTING -nv –line-number
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REDIRECT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:12000:12010 redir ports 8388
2 0 0 REDIRECT udp — * * 0.0.0.0/0 0.0.0.0/0 udp dpts:12000:12010 redir ports 8388
需要大家注意的是,其实任何1024~65535的端口都可以作为我们的备用端口。即使是大家使用ephermeral端口(/proc/sys/net/ipv4/ip_local_port_range)作为备用的端口,其实也不会干扰到服务器的正常向外连接。
我已经按照教程进行配置了,为什么服务器还会被封呢?
将时间截止到2021年的11月7日,其实我们还是收到了几个来自用户报告当中的端口被封锁的问题,那是因为通过这篇文章配置的Shadowsocks-libev服务器其实是已经可以抵御已知的所有来自gfw的主动探索,也有可能是审查者使用了配置的攻击手段。如果大家在按照这样的配置之后遇到了类似的问题,建议大家可以考虑上述当中的备用端口,从而来缓解被封锁的问题。当然我们也非常希望你能够将封锁的具体情况汇报给我们,我们就可以进行认真的调查,从而给出一个正确的处理方法。
我们可不可以从发行版的仓库上面下载和安装Shadowsocks-libev呢?
要知道发行版仓库里的Shadowsocks-libev并不一定是最新版的,举个简单的例子,截止到2021年的1月,Debian buster仓库的Shadowsocks-libev版本为v3.2.5。而这个版本的Shadowsocks-libev并不能够防御来自gfw的主动探测。
怎样才能够更好的更新用Snap来安装Shadowsocks-libev呢?
这主要是因为Snap 每天都会自动更新,并通过其他安装的软件,所以这种情况下并不需要大家手动进行更新,如果需要更新的话,还请大家使用sudo snap refresh。
chacha20-ietf-poly1305作为加密方式的理由是什么呢?
这是因为它其中有一种叫做AEAD ciphers,这个是可以抵御来自gfw的主动探测,甚至已经成为了Shadowsocks-libev和Outline VPN的一种默认加密方式了。
我们可以使用Shadowsocks的Stream Cipher 吗?
这个不应该存在呀,那是因为Shadowsocks的Stream Cipher当中有着我们不可接受的安全隐私漏洞,同时还可以被精准的主动探测,正如我们所说的,即使是最新版本的Shadowsocks-libev,在其中同样可以被精准的识别到,更令我们害怕的是,即使是在不需要密码的情况之下,进攻者也可以完全解密,并记录下来我们的Shadowsocks会话,这将是多么严重的问题呀!
为什么我使用的机场仍在使用Stream Cipher呢?
如果大家对这个方面有想法的话,那就说明大家的机场缺乏安全意识和安全措施,一定要再仔细阅读一下这篇教程和总结,并分享给自己的机场主。
可以把配置当中的server_port改为像443这样的常见端口吗?
大家尽量不要这样去做,因为无论大家使用了哪个端口,Gfw可能都会检测并怀疑到大家的Shadowsocks流量的。
为什么配置文件会使用tcp_and_udp模式呢?
其实我们之前使用tcp_only模式就是为了缓解Partitioning Oracle的攻击。也正像我们在Vinicius当中所指出的那样,如果我们长期使用了随机密码,那么Partitioning Oracle攻击往往就会以失败告终。所以我们也就不需要禁用udp的代理模式,可以开启Udp代理模式,这样就可能会让经过Shadowsocks代理的视频通话质量更佳一些。