自己搭建了一个 SS 服务器以后,自然而然的会同身边的朋友共享。自然,身边的朋友一起用,大部分服务器配置都可以毫无压力的支撑。但倘若一传十十传百,最后成百上千的人一起用一个服务器,那就撑不住了。 当然你可以隔一段时间换一次密码,但是后面的麻烦事也不少(要同步更新不同设备上的设置,身边的朋友来问你新设置)。 几天我研究了一下,为 ss 服务器增加了多用户即为每个用户设置独立的连接数限制的方法,这样能够比较完美的解决同朋友共享服务器的问题了。

这里默认你已经知道怎么按照通常的方法安装和配置 SS 了。如果你不了解的话,网络上的文章很多的。

1 多用户的实现

多用户的实现比较简单,Python 和 Go 实现的服务器自带多用户支持。通常的配置我们一般是这么写

1
2
3
4
5
6
{
"server": "::",
"server_port": "8888",
"password": "yourpassword"
// Other configs
}

只需要将配置文件按照下面的方式进行修改就可以实现多用户了。

1
2
3
4
5
6
7
8
9
{
"server": "::",
"port_password": {
"8881": "password1",
"8882": "password2",
"8883": "password3"
}
// other configs
}

就可以了。之后不同的用户可以通过不同的端口访问,而每个端口都有独立的密码。

Further Reading: Reference

2 限制用户连接

我在网上调查了一下实现限制用户连接的方法,很多都提到了通过iptables来进行设置。但是这种方法太过复杂,很容易出问题。后来我找到一个 ss 的补丁,可以比较好的解决这个问题。补丁地址是falssen/PySocket。 这个工程提供了一些其他的功能,但是我们这里只关注Limit_Clients文件夹下的socket.py这个文件。这个文件的原理是利用 Python 包导入的机制,用自定义的socket.py来替换默认的socket包,并在socket接口中植入一些新的功能。 按照READMe.md的提示安装好socket.py文件 > 有很多朋友不知道这里要怎么处理 socket.py 文件。其实并不复杂。用which命令查看一下 ss 脚本安装的位置,一般情况下是/usr/local/bin/,那么你只需要把socket.py文件放到/usr/local/bin下面就行。这一操作的原理是,python 在导入包时总是先检查当前目录。注意,如果修改了socket.py文件,需要重启进程才能生效。

然后修改文件中white_listblack_list两个变量。例如我自己使用的1017端口,我不希望添加限制,则将white_list设置为

1
white_list = [1017]

我给朋友们用的是[1018]端口,我希望这个端口的连接数不要超过 40 个,则将black_list设置为

1
black_list = {1018:40}

3 注意

注意方法的实质是限制接入的客户端 IP 数量,因此,处在同一路由器下面的多台设备也会被识别为一台。

4 更多阅读

  • Shadowsocks 中继:从 IPv4 到 IPv6: 目前防火墙越加越高,遇到重大事件的时候,很多梯子都会挂掉。不过,有个好消息是,因为 IPv6 网络在国内的普及率还不高,因此 IPv6 还没有被特别针对。如果你有 IPv6 资源(一般教育网支持 IPv6),可以将 Shadowsocks 通信从 IPv4 转化成 IPv6 再出去,会更加安全可靠一些。
  • Shadowsocks 性能优化
  • Shadowsocks 上手配置