搭建ss服务器

背景

更换了一个不太好控制的路由器,于是把ss服务器搭建在树莓派上.
本文记录直接搭建和docker搭建两种方式.

提供ss服务器的两个包

  1. shadowsocks
    1. python2.7写的
    2. 可执行文件名为 ssserver
    3. 项目陈旧不再维护,且性能可能不大好,不推荐使用
  2. shadowsocks-libev
    1. 主要是C语言写的,还算小巧
    2. 可执行文件有许多 ss-server, ss-client, ss-manager
    3. 是目前shadowsocks官方docker使用的工具
    4. 由于较新,支持一些新的加密方式等等
    5. 可执行文件变了,但配置方式和命令选项没有变

配置方式

可以通过命令行配置,也可以用配置文件配置,自主选择即可.

配置项目

无论是GUI端,还是CLI端,通常都支持配置

  • 端口
  • 密码
  • 加密方式
  • 是否允许UDP
  • 超时时间(秒)

配置文件

可以使用以下命令启动

1
ss-server -c /path/to/config.json

通常如果直接安装 shadowsocks-libev 包,
默认配置文件位于 /etc/shadowsocks-libev/config.json
默认的配置内容有

1
2
3
4
5
6
7
8
9
10
{
"server": ["0.0.0.0","::0"],
"mode": "tcp_and_udp",
"server_port": 8388,
"local_address": "127.0.0.1",
"local_port": 1080,
"password": "xxx",
"timeout": 60,
"method": "aes-256-gcm"
}
  • 服务器设置 0.0.0.0 而不是 127.0.0.1,
    0.0.0.0 表示本机上的所有地址,(有线网卡,无限网卡,环回网络(127.x))

  • 可能是追求client配置与server配置尽量共用同一个配置文件,
    出现了 local_addresslocal_port 等配置,暂时不用理会.
    在浏览器配置socks协议时可以写上面的 127.0.0.1:1080.

  • mode的值有

    • tcp~andudp~
    • tcp~only~
    • udp~only~
  • 密码方面,建议使用安全的密码以防止一些针对ss服务器的攻击

    1
    openssl rand -base64 16

    允许的情况下可以生成更长的密码

命令行配置

1
2
3
4
5
6
7
8
9
ss-server \
-s $SERVER_ADDR \ # 服务器地址,比如0.0.0.0
-p $SERVER_PORT \ # 服务器端口,比如8388
-k $PASSWORD \ # 密码
-m $METHOD \ # 加密方式
-t $TIMEOUT \ # 超时时间
-d $DNS_ADDR \ # DNS服务器,比如谷歌的
-u \ # -u表示tcp_and_udp,-U表示udp_only,什么都不写表示 tcp_only
$OTHER_ARGS

本地搭建使用

可以安装 shadowsocks-libev 包之后

  1. 直接使用 ss-server 命令手动启用
  2. 借用系统服务 shadowsocks-libev.service 启用,
    当然,需要先检查下对应服务中读取的是哪里的配置文件

docker搭建

使用docker搭建的优点:

  1. 自启动依赖已经配置好的docker,更方便
  2. 配置更加标准一些,迁移性更好

docker镜像

官方只提供了有限的docker容器支持,x86,arm64等
树莓派 armv7larmhf 上能够使用的暂时没有
其他个人自定义的Dockerfile又有各种的不爽.
好在官方提供了Dockerfile.

官方提供的基础镜像中,看着还是alpine顺眼一些,其他不熟.
build思路

  • 设置一些环境变量
  • 安装一些基础包
  • 将整个项目拷贝到镜像中
  • 直接在镜像中 make
  • make 结束后会删除项目的源代码

使用官方Dockerfile自行编译

1
2
3
4
5
6
7
8
9
10
11
12
# 准备环境
git clone xxx/shadowsocks-libev.git
cd shadowsocks-libev
git clone xxx/libbloom.git && cd libbloom && git checkout xxx && cd ..
git clone xxx/libcork.git && cd libcork && git checkout xxx && cd ..
git clone xxx/ipset.git libipset && cd libipset && git checkout xxx && cd ..

# 在根目录直接build
docker build -f ./docker/alpine/Dockerfile -t shadowsocks-libev:armv7l .

# 确认结果
docker images
  • 项目中提到的三个lib不会嵌套下载,需要手动clone到本地
    • 需要手动checkout到对应的hash
    • ipset的项目名和文件夹名不符,需要注意
    • 没有这些lib会报错说找不到 makefile.in
  • 可能会报信息说,延后软件的配置,因xxx没有安装,不要紧
  • 其他报错说没安装的一些包,编辑Dockerfile添加安装即可

运行方法

官方也提供了 docker-compose.yml 文件以供启动.
且还能参照dockerhub上的一些启动说明来进行适当的自定义.比如

1
2
3
4
5
6
7
8
9
shadowsocks:
image: shadowsocks-libev:armv7l
container_name: ss-server
ports:
- "8288:8388/tcp"
environment:
- METHOD=aes-256-gcm
- PASSWORD=xxx
restart: always

参考

  1. shadowsocks的古代安装方法
  2. 新一些的ss-server安装方法
  3. arch上的参数解释
  4. 强密码的生成
  5. dockerhub上的启动说明
  6. 一些自定义的Dockerfile例子
  7. 长见识系列:搭配simple-obfs更稳定一些
  8. simple-obfs的介绍和初步使用
  9. obfs的具体使用意义说明