使用docker快速部署shadowsocks-libev 作者: 毕世平 时间: 2020-09-23 分类: 默认分类 前言:Shadowsocks-libev是一款`安全`、`轻量`和`快速`的代理协议。它是由`clowwindy`发明,后同很多技术大牛一起开发,原作者被喝茶以后,因为项目是开源的,所以很多人fork后继续开发,现在主要由`madeye`负责更新维护。`shadowsocks`注重加密,数据包几乎没有特征,而`shadowsocksr`注重混淆,倾向无加密化,现在已经停更,所以不再推荐使用。之前的`simple-obfs`插件已经弃更,在github项目里也被标识为不推荐使用,转之项目维护者推荐使用`shadowsocks-libev+v2ray-plugin`插件。 本文会知无不言地介绍一下使用`秋水逸冰`为之制作的`docker`镜像快速部署`shadowsocks-libev+v2ray-plugin`,主要介绍`ws和ws+tls`模式。 ### 条件准备: - 一台墙外VPS - 一台安装好SSH客户端的PC电脑 - 只用ws就不用域名,加tls就需要准备一个域名 - 注册好Cloudflare账号 - 会使用基本的Linux命令 # 一、安装docker ## 1.1 以root用户登录,执行一键脚本安装docker apt-get update && apt-get install -y wget vim //以Debian系为例,升级源并安装软件 wget -qO- get.docker.com | bash //执行此命令等候自动安装docker > **说明**:推荐使用KVM架构的VPS,OpenVZ架构的VPS不支持安装docker,另外CentOS8好像还不受此脚本支持来安装docker。 ## 1.2 对docker的一些命令操作 docker version //查看docker安装版本等信息 systemctl start docker //启动docker服务 systemctl status docker //查看docker运行状态 systemctl enable docker //将docker服务加入开机自启动 ## 二、用docker部署shadowsocks-libev+v2ray-plugin(ws类型,不用域名) ## 2.1 创建配置文件 mkdir /etc/shadowsocks-libev //在/etc目录下创建shadowsocks-libev目录 cd /etc/shadowsocks-libev //工作空间切换至此 vim config.json //创建并开始编辑名为config.json的配置文件 //下为配置文件示例,请添加至文件 { "server":"0.0.0.0", "server_port":9000, "method":"aes-256-gcm", "timeout":300, "password":"password0", "fast_open":false, "nameserver":"8.8.8.8", "mode":"tcp_and_udp", "plugin":"v2ray-plugin", "plugin_opts":"server" } //上为配置文件示例,添加至文件后保存并退出 > **说明**:server后面默认填0.0.0.0,请不要修改。 > 关于更多参数用法和说明请参考:[这个链接](https://github.com/shadowsocks/shadowsocks-libev/blob/master/doc/shadowsocks-libev.asciidoc "这个链接") > **值得注意的是**:如果你配置文件里`"plugin_opts":"server;mux=0"`这样配置,那么你可以使用Quantumult X来添加节点使用。 ## 2.2 用docker结合上面的配置文件创建并启动容器 docker run -d --name ss-libev --restart always -p 9000:9000 -p 9000:9000/udp -v /etc/shadowsocks-libev:/etc/shadowsocks-libev teddysun/shadowsocks-libev > docker run:开始运行一个容器 -d 参数:容器以后台运行并输出容器ID --name 参数:给容器分配一个识别符,方便将来的启动,停止,删除等操作 --restart 参数:配置容器启动类型,always即为docker服务重新启动时自动启动本容器 -p 参数:容器的9000端口映射到本机的9000端口。默认是TCP映射,当需要UDP映射时候,那就再追加一次UDP的映射。冒号后面是容器端口,冒号前面是宿主机端口,可以写成一致,也可以写成不一致 -v 参数:挂载卷(volume),冒号后面是容器的路径,冒号前面是宿主机的路径,可以写成一致,也可以写成不一致 teddysun/shadowsocks-libev:这是从docker拉取回来的镜像路径 ## 2.3 后期容器处理常用命令 记前面docker run后面`--name ss-libev`中的`ss-libev`为`$name`,其代表容器识别符,也就是`$name=ss-libev`。 docker ps -as //查看容器在线状态及大小,在这里你一般可以看到$name=ss-libev docker logs $name //查看此容器的运行输出日志 docker restart $name //重新启动容器,一般在修改除端口外的配置后使用使修改生效 docker stop $name //停止此容器的运行 docker rm $name //移除此容器 docker stats --no-stream //查看docker容器占用CPU,内存等信息 # 三、用docker部署shadowsocks-libev+v2ray-plugin(ws+tls类型,需要域名) ## 3.1 用acme.sh脚本申请证书 本文使用`acme.sh`脚本申请证书。以Debian系为例,以root用户登录vps,执行以下命令安装脚本。 apt-get update && apt-get -y install socat //安装socat wget -qO- get.acme.sh | bash //安装脚本 source ~/.bashrc # 设置默认CA为letsencrypt acme.sh --set-default-ca --server letsencrypt ## 3.2 安装证书到放置ss配置文件的目录 假设你的是域名是`mydomain.me`,且已经在`Cloudflare`上设置好`A`记录解析 mkdir /etc/ssplugin && cd /etc/ssplugin //创建目录并切换至此 export CF_Key="slfjksjffjfhfhkjhfksjf" //此处替换成你自己的Key export CF_Email="yourcloudflare@gmail.com" //此处填写你注册Cloudflare使用的邮箱账号 acme.sh --issue --dns dns_cf -d mydomain.me -k ec-256 //用脚本申请证书 acme.sh --installcert -d mydomain.me --fullchain-file /etc/ssplugin/plugin.crt --key-file /etc/ssplugin/plugin.key --ecc //安装证书到/etc/ssplugin目录下 ## 3.3 创建配置文件 cd /etc/ssplugin //其实上一步之后应该就是在这个目录里了 vim config.json //创建并开始编辑配置文件 //下面是配置文件示例 { "server":"0.0.0.0", "server_port":9000, "password":"password0", "timeout":300, "method":"aes-256-gcm", "fast_open":false, "nameserver":"8.8.8.8", "mode":"tcp_and_udp", "plugin":"v2ray-plugin", "plugin_opts":"server;tls;host=mydomain.me;cert=/etc/shadowsocks-libev/plugin.crt;key=/etc/shadowsocks-libev/plugin.key" } //上面是配置文件示例,请添加至文件后保存并退出。 > **说明**:server后面的 `0.0.0.0` 不要修改,`plugin_opts`后面的证书位置配置也不要修改,尽管你证书明明是放在 `/etc/ssplugin` 目录下,尽管你宿主机里没有创建 `/etc/shadowsocks-libev` 目录,这里cert和key的`路径是写死的`,当然证书名是要根据你上一步生成的。 ## 3.4 用docker配合配置文件创建并启动容器 docker run -d --name ss-plugin --restart always -p 9000:9000 -p 9000:9000/udp -v /etc/ssplugin:/etc/shadowsocks-libev teddysun/shadowsocks-libev > docker run:开始运行一个容器 -d 参数:容器以后台运行并输出容器ID --name 参数:给容器分配一个识别符,方便将来的启动,停止,删除等操作 --restart 参数:配置容器启动类型,always即为docker服务重新启动时自动启动本容器 -p 参数:容器的9000端口映射到本机的9000端口。默认是TCP映射,当需要UDP映射时候,那就再追加一次UDP的映射。冒号后面是容器端口,冒号前面是宿主机端口,可以写成一致,也可以写成不一致 -v 参数:挂载卷(volume),冒号后面是容器的路径,冒号前面是宿主机的路径,可以写成一致,也可以写成不一致 teddysun/shadowsocks-libev:这是从docker拉取回来的镜像路径 ## 3.5 后期docker容器常用处理命令 记前面docker run后面`--name ss-plugin`中的`ss-plugin`为`$name`,其代表容器识别符,也就是`$name=ss-plugin`。 docker ps -as //查看容器在线状态及大小,在这里你一般可以看到$name=ss-plugin docker logs $name //查看此容器的运行输出日志 docker restart $name //重新启动容器,一般在修改除端口外的配置后使用使修改生效 docker stop $name //停止此容器的运行 docker rm $name //移除此容器 docker stats --no-stream //查看docker容器占用CPU,内存等信息 # 四、用docker部署shadowsocks-libev+v2ray-plugin(ws+caddy提供的tls,可选套cdn) ## 4.1 使用acme.sh脚本安装证书 本文使用`acme.sh`脚本申请证书。以Debian系为例,以root用户登录vps,执行以下命令安装脚本。 apt-get update && apt-get -y install socat //安装socat wget -qO- get.acme.sh | bash //安装脚本 source ~/.bashrc # 设置默认CA为letsencrypt acme.sh --set-default-ca --server letsencrypt export CF_Key="slfjksjffjfhfhkjhfksjf" //此处替换成你自己的Key export CF_Email="yourcloudflare@gmail.com" //此处填写你注册Cloudflare使用的邮箱账号 acme.sh --issue --dns dns_cf -d mydomain.me -k ec-256 //用脚本申请证书 ## 4.2 创建ss的配置文件 mkdir /etc/ssplugin && cd /etc/ssplugin //创建目录并切换至此 vim config.json //创建并开始编辑config.json配置文件 //下面是配置文件示例,请添加至文件 { "server":"127.0.0.1", "server_port":9000, "method":"aes-256-gcm", "timeout":300, "password":"password0", "fast_open":false, "nameserver":"8.8.8.8", "mode":"tcp_only", "plugin":"v2ray-plugin", "plugin_opts":"server;path=/ray" } //上面是配置文件示例,请添加至文件后保存并退出 > **说明**:因为要监听本地,所以server后面地址填`127.0.0.1`,所以9000端口不对外开放,此处只是在ws的配置上加了个path参数,tls要由后面的caddy来支持。 ## 4.3 用docker搭配配置文件创建并启动容器 docker run -d --name ss-plugin --restart always --net host -v /etc/ssplugin:/etc/shadowsocks-libev teddysun/shadowsocks-libev > **说明**:此处不用端口映射,直接使用`--net host`参数配置,让容器跟宿主机共用网络。 ## 4.4 安装caddy # 下载然后重命名放到/usr/bin目录下,这里感谢秋水逸冰释出的编译成果 wget -O /usr/bin/caddy https://dl.lamp.sh/files/caddy_linux_amd64 # 赋予权限 chmod 755 /usr/bin/caddy > **说明**:之前给出的安装caddy的脚本好像已经不能用了,里面caddy1的下载链接404了,这里使用秋水逸冰编译好的caddy1版本,具体使用方法还跟之前一样。 ## 4.5 配置caddy证书 mkdir /root/caddy && cd /root/caddy //在/root目录下创建caddy目录并切换至此 acme.sh --installcert -d mydomain.me --fullchain-file /root/caddy/caddy.crt --key-file /root/caddy/caddy.key --ecc //安装证书和key到/root/caddy目录下 ## 4.6 创建caddy主配置文件Caddyfile vim Caddyfile //创建文件并开始编辑 //下面是caddy配置文件示例,请添加至文件 mydomain.me:443 { gzip tls /root/caddy/caddy.crt /root/caddy/caddy.key log /root/caddy/caddy.log proxy / https://baidu.com proxy /ray 127.0.0.1:9000 { websocket header_upstream -Origin } } //上面是配置文件示例,请按照实际情况替换填写 > **说明**:此处只需要关注路径和端口号,9000是你`/etc/ssplugin/config.json`目录下配置的,/ray是你这个文件内plugin_opts后面的`path=/ray`,请注意替换。 ## 4.7 注册caddy服务 cd /etc/systemd/system && vim caddy.service //切换到此目录下,创建并开始编辑服务文件 //以下是文件内容,请添加至文件 [Unit] Description=Caddy Service After=network.target [Service] ExecStart=/usr/bin/caddy -conf /root/caddy/Caddyfile Restart=on-abort LimitNOFILE=1048576 [Install] WantedBy=multi-user.target //以上是文件内容,添加至文件 systemctl daemon-reload //重载守护进程 systemctl start caddy //启动caddy.service服务 systemctl status caddy //查看caddy服务运行状况 systemctl enable caddy //将此服务加入开机自启动 # 五、客户端配置 ## 5.1 Win端 - 先到[这个链接](https://github.com/shadowsocks/v2ray-plugin/releases "这个链接")下载v2ray-plugin-windows-amd64的包 - 下载完成后解压到[shadowsocks-windows](https://github.com/shadowsocks/shadowsocks-windows/releases "shadowsocks-windows")的目录下 - 重命名为v2ray-plugin.exe文件 > 插件程序:v2ray-plugin > 如果选的是第一种,v2ray-plugin的ws类型,**插件选项**这里可以留空 > 如果选的是第二种,v2ray-plugin的ws+tls类型,**插件选项**这里填 tls;host=mydomain.me > 如果选的是第三种,v2ray-plugin的ws+caddy提供的tls类型,**插件选项**这里填 tls;host=mydomain.me;path=/ray。 > 第三种配置建议是开启CDN,然后本地配置两个节点,服务器那里写IP就是ss+ws+tls,写域名就是ss+ws+tls+cdn。 > **值得注意的是**:如果你这么设置`"plugin_opts":"server;mux=0"`,你就可以使用Quantumult X来使用这个节点,但win端不能直接使用了。 ## 5.2 Android端 - 先到[这个链接](https://github.com/shadowsocks/v2ray-plugin-android/releases "这个链接")下载插件并安装 - 其余的配置都跟上面win端一致 # 六、总结 到此即介绍完所有我觉得要介绍到的地方,如果那里有介绍不对,欢迎留言批评指正。感谢各位大佬们用爱发电,感激他们的付出,我们才能走得更远。 *** ### 参考链接: - [github上shadowsocks-libev项目开源地址](https://github.com/shadowsocks/shadowsocks-libev "github上shadowsocks-libev项目开源地址") - [github上v2ray-plugin插件项目开源地址](https://github.com/shadowsocks/v2ray-plugin "github上v2ray-plugin插件项目开源地址") - [github上simple-obfs插件项目开源地址](https://github.com/shadowsocks/simple-obfs "github上`simple-obfs`插件项目开源地址") - [github上docker项目开源地址](https://github.com/docker/docker-ce "github上docker项目开源地址") - [github上Neilpang关于acme.sh证书申请脚本项目开源地址](https://github.com/Neilpang/acme.sh "github上Neilpang关于acme.sh证书申请脚本项目开源地址") - [秋水逸冰“介绍几款Docker镜像”文章](https://teddysun.com/536.html "秋水逸冰“介绍几款Docker镜像”文章") - [秋水逸冰发布shadowsocks-libev docker镜像地址](https://hub.docker.com/r/teddysun/shadowsocks-libev "秋水逸冰发布shadowsocks-libev docker镜像地址") - [shadowsocks官网地址介绍](https://shadowsocks.org "shadowsocks官网地址介绍") - [V2Ray白话文配置教程](https://toutyrater.github.io/advanced/wss_and_web.html "V2Ray白话文配置教程") 标签: none