shadowsocks
原版是使用 python 开发的,后来推出了其他语言实现的版本。这里推荐使用 shadowsocks-libev
版本,这是 C 语言的实现版,运行速度更快,占用资源更少。
shadowsocks-libev
主要包含以下组件:
参考资料: https://github.com/shadowsocks/shadowsocks-libev
这里主要介绍前三个组件的使用,其他组件待补充。
ss-server
是服务端程序。它跟 python 版本的 ssserver 类似,不过它不再支持 “port_password” 的配置,变成了单端口单用户模式。
示例配置如下:
{ "server": "0.0.0.0", "server_port": 8388, "password": "password", "timeout": 60, "method": "chacha20-ietf-poly1305", "user": "nobody", "fast_open": true, "reuse_port": true }
关键参数:
参数 | 解释 |
---|---|
server | 服务器监听地址,一般可设为 0.0.0.0 。 |
server_port | 服务器监听端口。 |
password | 密码。 |
method | 加密方式。推荐使用 chacha20-ietf-poly1305 。 |
python 版本的 ssserver 既是单端口单用户程序,也是多端口多用户。 而 libev 版本做了区分,把多端口多用户做成了 ss-manager
。
示例配置如下:
{ "server": "0.0.0.0", "port_password": { "8388": "password_1", "8389": "password_2", }, "timeout": 60, "method": "chacha20-ietf-poly1305", "fast_open": true, "reuse_port": true }
关键参数:(其他参数见 ss-server)
参数 | 解释 |
---|---|
port_password | 监听端口和该端口对应的密码。这是跟 ss-server 最大的区别,由原来的单个端口和密码变成可设置多个端口和密码。 |
注意: 这里没有用户名的概念,通过给不同的端口设置不同的密码来区分不同的用户。这个配置也可以没有,后续可以通过其他程序来动态添加和删除用户。
ss-local
为客户端程序。配置文件跟 python 版本的类似。
示例配置如下:
{ "server": "xxx.xxx.xxx.xxx", "server_port": 8388, "local_address": "0.0.0.0", "local_port": 1080, "password": "password", "timeout": 60, "method": "chacha20-ietf-poly1305", "user": "nobody" }
关键参数:
参数 | 解释 |
---|---|
server | 服务器地址,具体的服务器 ip 。 |
server_port | 服务器监听端口。 |
password | 密码。需要跟服务器一致。 |
method | 加密方式。需要跟服务器一致。 |
local_address | 客户端监听地址。设为 127.0.0.1 只给本机代理; 设为 0.0.0.0 可以共享给别人。 |
local_port | 客户端监听端口。 |
apt install shadowsocks-libev
若服务器只运行单用户,推荐直接修改默认的配置文件即可。若需运行多用户,建议停掉系统服务: systemctl disable shadowsocks-libev
,然后创建一个 ss-manager 的系统服务。
安装完成后,它会在系统里注册一个服务,开机时默认运行 ss-server
,默认加载的配置文件为 /etc/shadowsocks-libev/config.json
。
按实际情况修改该配置文件,然后启动服务即可: systemctl start shadowsocks-libev
。
运行命令
ss-server -c config.json -f /tmp/ss-server.pid
— Jinkin Liu 2021/11/08 14:58
在 /etc/shadowsocks-libev/
目录下创建 local 所需的配置文件 client.json
,然后运行命令 systemctl start shadowsocks-libev-local@client.service
即可。(@后面的名字跟配置文件的名字要一致。)
运行命令
ss-local -c config.json -f /tmp/ss-local.pid
ss-manager 以 root 身份加 -a 切换用户的方式运行时,子进程 ss-server 无法创建。如果想以普通用户身份运行时,需要创建一个普通用户
useradd -m -s /bin/bash shadowsocks
以普通用户身份运行
# 切换用户 su - shadowsocks ss-manager --manager-address /tmp/ss-manager.sock --executable $(which ss-server) -c manager.json -f /tmp/ss-manager.pid # manager-address 就是管理端,也可以使用 ip 和端口,如下 ss-manager --manager-address 127.0.0.1:10001 --executable $(which ss-server) -c manager.json -f /tmp/ss-manager.pid
可以使用老牌的 nc
工具来管理用户的增减。 安装方式 apt install netcat-openbsd
。
使用 nc
连接 ss-manager :
# -u 表示使用 udp 通信。 nc -u -U /tmp/ss-manager.sock # 或者 nc -u 127.0.0.1 10001
连接上去之后,有4个管理命令可用:
list
列出当前所有监听的端口和对应的密码。ping
列出每个端口的总流量。add
增加一个端口和密码。格式示例: add: {“server_port”:8838, “password”:“my_password”}
。注意 add: 的冒号之后必须有个空格,否则会报命令错误。remove
删除一个端口。 格式示例: remove: {“server_port”:8838}
。使用完毕后,使用 Ctrl-C 退出 nc 。
参考资料: https://github.com/shadowsocks/shadowsocks/wiki/Manage-Multiple-Users
— Jinkin Liu 2021/02/02 14:39
创建文件 /etc/systemd/system/shadowsocks-libev-manager.service
[Unit] Description=Shadowsocks-libev Manager Service by ljskr Documentation=man:shadowsocks-libev(8) After=network.target [Service] # Type=simple # CapabilityBoundingSet=CAP_NET_BIND_SERVICE # AmbientCapabilities=CAP_NET_BIND_SERVICE User=nobody Group=nogroup LimitNOFILE=32768 # ExecStart=/usr/bin/ss-manager -c /etc/shadowsocks-libev/manager.json --manager-address 127.0.0.1:10001 --executable /usr/bin/ss-server ExecStart=/usr/bin/ss-manager -c /etc/shadowsocks-libev/manager.json --manager-address /tmp/ss-manager.sock --executable /usr/bin/ss-server [Install] WantedBy=multi-user.target
docker pull shadowsocks/shadowsocks-libev:latest
version: '3' services: shadowsocks: image: shadowsocks/shadowsocks-libev ports: - "8388:8388" environment: - METHOD=chacha20-ietf-poly1305 - PASSWORD=password restart: always
# 需要先在当前目录下创建一个 sslocal.json 的配置文件,内容见前文介绍 。 docker run -d -p 1080:1080 \ -v $(pwd)/sslocal.json:/home/sslocal.json:ro \ --name ss \ --restart=always \ shadowsocks/shadowsocks-libev:latest \ ss-local -c /home/sslocal.json