使用 Docker 快速部署 Shadowsocks-libev + v2ray-plugin

转载 秋水逸冰 240860浏览 117评论

条件准备

一台墙外VPS;
一台安装好 SSH 客户端的本地电脑;
如果需要 tls 功能则需要准备一个域名以及一个 Cloudflare 账号。

一、安装 Docker

1.1 以 root 用户登录,执行一键脚本安装 Docker

以Debian系为例,升级源并安装软件

$ apt-get update && apt-get install -y wget vim

执行此命令等候自动安装 Docker

$ wget -qO- get.docker.com | bash

说明:推荐使用 KVM 架构的 VPS,OpenVZ 架构的 VPS 不支持安装 Docker,另外 CentOS 8 不支持用此脚本来安装 Docker。

1.2 对 Docker 的一些命令操作

查看 Docker 安装版本等信息

$ docker version

启动 Docker 服务

$ systemctl start docker

查看 Docker 运行状态

$ systemctl status docker

将 Docker 服务加入开机自启动

$ systemctl enable docker

下面讲解的配置从上往下,难度由简到繁,如果你想一步到位,建议跳过二,三步,直接看第四步。

二、用 Docker 部署 Shadowsocks-libev + v2ray-plugin over websocket (HTTP)

2.1 创建配置文件

在 /etc 目录下创建 shadowsocks-libev 目录

$ mkdir /etc/shadowsocks-libev

切换目录至 /etc/shadowsocks-libev

$ cd /etc/shadowsocks-libev

创建并开始编辑名为 config.json 的配置文件

$ vim 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,请不要修改。关于更多参数用法和说明请参考:这个链接
值得注意的是,如果把 plugin_opts 改为

"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 hub 下载回来的镜像完整路径名

2.3 后期容器处理常用命令

前面 docker run 后面 –name ss-libev 中的 ss-libev 为 $name,其代表容器识别符,也就是 $name=ss-libev。
查看容器在线状态及大小

$ docker ps -as

查看容器的运行输出日志

$ docker logs $name

重新启动容器,一般在修改除端口外的配置后使用使修改生效

$ docker restart $name

停止容器的运行

$ docker stop $name

移除容器

$ docker rm $name

查看 docker 容器占用 CPU,内存等信息

$ docker stats --no-stream

三、用 Docker 部署 Shadowsocks-libev + v2ray-plugin over websocket (HTTPS)

3.1 用 acme.sh 脚本申请 SSL 证书

此处需要用到一个你拥有的域名。参考:这篇文章。下面默认你已经获取到 Clouflare API key,并且也已经安装好 acme.sh 脚本。

3.2 创建配置文件

在 /etc 目录下创建 shadowsocks-libev 目录

$ mkdir /etc/shadowsocks-libev

切换目录至 /etc/shadowsocks-libev

$ cd /etc/shadowsocks-libev

创建 config.json 的配置文件

$ 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 后面的配置除了域名外也不要修改

3.3 安装证书到 Shadowsocks-libev 配置文件的目录 /etc/shadowsocks-libev

假设你的是域名是 mydomain.me,且已经在 Cloudflare 上设置好 A 记录解析
CF_Key 的值替换成你自己的 Cloudflare API Key

$ export CF_Key="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

CF_Email 的值替换成你自己的 Cloudflare 注册邮箱账号名

$ export CF_Email="[email protected]"

用 acme.sh 脚本申请证书

$ acme.sh --issue --dns dns_cf -d mydomain.me -k ec-256

安装证书到 Shadowsocks-libev 配置文件的目录 /etc/shadowsocks-libev

$ acme.sh --installcert -d mydomain.me --fullchain-file /etc/shadowsocks-libev/plugin.crt --key-file /etc/shadowsocks-libev/plugin.key --ecc

3.4 用 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 部署 Shadowsocks-libev + v2ray-plugin over websocket (HTTP) + TLS + caddy + CDN

4.1 申请 SSL 证书以及安装证书

参考上面的 3.1 和 3.3 章节。

4.2 创建配置文件

在 /etc 目录下创建 shadowsocks-libev 目录

$ mkdir /etc/shadowsocks-libev

切换目录至 /etc/shadowsocks-libev

$ cd /etc/shadowsocks-libev

创建 config.json 的配置文件

$ vim config.json

以下为配置文件内容示例,添加后保存并退出

{
"server":"127.0.0.1",
"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;path=/ray"
}

说明:因为要监听本地,所以 server 后面地址填 127.0.0.1, 9000 端口不对外开放,此处只是在 websocket 的配置上加了个 path 参数(后面的值可以更改,比如可以改为 path=/teddysun),tls 则要由 caddy 来提供。

4.3 用 Docker 结合上面的配置文件创建并启动容器

命令如下:

$ docker run -d --name ss-libev --restart always --net host -v /etc/shadowsocks-libev:/etc/shadowsocks-libev teddysun/shadowsocks-libev

说明:此处不用端口映射,直接使用

--net host

参数配置,让容器跟宿主机共用网络。

4.4 安装 caddy

执行下面一条命令安装 caddy v1.0.5,并把它放到 /usr/bin 目录下(此为 Linux x86_64 系统示例)

$ wget -O /usr/bin/caddy https://dl.lamp.sh/files/caddy_linux_amd64
$ chmod 755 /usr/bin/caddy

如果是 Linux x86 系统,则执行如下命令

$ wget -O /usr/bin/caddy https://dl.lamp.sh/files/caddy_linux_386
$ chmod 755 /usr/bin/caddy

4.5 配置 caddy 目录

在/root目录下创建 caddy 目录并切换至此

$ cd /root && mkdir caddy && cd caddy

安装证书和 key 到 /root/caddy 目录下

$ acme.sh --installcert -d mydomain.me --fullchain-file /root/caddy/caddy.crt --key-file /root/caddy/caddy.key --ecc

4.6 创建 caddy 配置文件

创建文件并开始编辑 caddy 配置文件 caddy.conf

$ vim caddy.conf

下面是 caddy 配置文件示例,添加后保存并退出

mydomain.me:443 {
  gzip
  tls /root/caddy/caddy.crt /root/caddy/caddy.key
  log /root/caddy/caddy.log
  proxy / https://www.baidu.com
  proxy /ray 127.0.0.1:9000 {
    websocket
    header_upstream -Origin
  }
}

说明:此处只要关注路径和端口号,9000 是 /etc/shadowsocks-libev/config.json 里配置的,/ray 是配置文件内 plugin_opts 后面的 path=/ray,请注意替换。另 caddy 需要监听 443 端口,请确保 VPS 的 443 端口没有被占用。

4.7 运行 caddy

后台运行 caddy

$ nohup caddy -conf /root/caddy/caddy.conf &

可以查看 caddy 运行产生的日志

$ cat /root/caddy/caddy.log

确认 caddy 运行状态,下面的命令有输出则表示正常

$ ps -ef | grep -v grep | grep caddy

4.8 开启 Cloudflare 的 CDN 保护,开启 SSL/TLS 的 Full 模式

如下图所示,第 1 步,开启 CDN

如下图所示,第 2 步,开启 Full 模式

五、客户端配置

5.1 Windows 客户端

先到这个链接下载 v2ray-plugin-windows-amd64 的安装包,下载完成后解压到 shadowsocks-windows 的安装目录下,并重命名为 v2ray-plugin.exe 即可。
选项说明:
插件程序:v2ray-plugin
如果选的是第一种,Shadowsocks-libev + v2ray-plugin over websocket (HTTP),插件选项这里可以留空
如果选的是第二种,Shadowsocks-libev + v2ray-plugin over websocket (HTTPS),插件选项这里填 tls;host=mydomain.me
如果选的是第三种,Shadowsocks-libev + v2ray-plugin over websocket (HTTP) + TLS + caddy + CDN,插件选项这里填 tls;host=mydomain.me;path=/ray
值得注意的是:如果你把 plugin_opts 改为

"plugin_opts":"server;mux=0"

后就可以用 Quantumult X 来使用这个节点,但 Windows 客户端不能直接使用了。

5.2 Android 客户端

先到这个链接下载插件并安装,其余的配置都跟上面 Windows 客户端一致。

5.3 iOS 客户端

请使用 Shadowrocket,也就是俗称的小火箭,添加如下配置使用。
填写服务器,端口,密码,选择算法,插件选择 v2ray-plugin

点击插件 v2ray-plugin

设置插件 v2ray-plugin,开启 TLS,填写路径,服务器则填写你的域名

六、写在最后

本文为网友【毕世平】所总结,我只是在其基础上稍作修改。如有不对的地方,欢迎在评论里指出。

参考链接:

https://shiping.date/6.html

转载请注明:秋水逸冰 » 使用 Docker 快速部署 Shadowsocks-libev + v2ray-plugin

发表我的评论
取消评论

请输入正确答案后提交评论 *超出时限。 请再次填写验证码。

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (117)

  1. 4.7 运行 caddy 这一步 $ nohup caddy -conf /root/caddy/caddy.conf & 这个命令是不是没写全啊?
    mayim4年前(2019-11-28)回复
    • 请问你用的是Centos7吗?如果用的是Centos7。那么可能是安装caddy的那个脚本没有成功将caddy所在的路径加入环境变量取值。 解决办法:4.7这一步你可以设使用绝对路径也就是 nohup /usr/local/bin/caddy -conf /root/caddy/caddy.conf & 这样运行。很抱歉之前没有测试Centos7。
      毕世平4年前(2019-11-28)回复
  2. 感谢大佬分享
    Mai1me4年前(2019-11-27)回复
  3. 大佬,请问选用第一种方式,小火箭那里应该怎么设置呢?
    banana4年前(2019-11-27)回复
    • 第一种方式,ss-libev+v2ray-plugin over websocket (http)的话,小火箭里填好服务器,端口,密码,算法,混淆默认none,点进插件选v2ray-plugin,地址、端口默认留空,模式选websocket,不开启TLS,分流路径默认/,服务器默认留空,Fastopen根据你服务器端配置选择,实际上也就是小火箭的第一张和第二张截图,可能没有表示清楚,不好意思。 如果是第二种或者第三种,ss-libev+v2ray-plugin over websocket(https)或者ss-libev+v2ray-plugin over websocket (http)+tls+caddy +cdn的话,这两种实际上都是ss+ws+tls,写法的话就是第一张图加第三张图。这里说一下第三张图,插件选v2ray-plugin,地址端口留空,模式选websocket,开启TLS,默认不开启“允许不安全”就可以使用,但是如果你不开启这个不能用的话,建议你开启这个或者去检查自己证书是否配置正确,Peer名称默认留空,路径填你之前设置的/ray,域名填你的域名,Fast open根据你服务端设置而定。不好意思,可能没描述清楚。
      毕世平4年前(2019-11-28)回复
      • Hi 大神同学, 不知我是否经验有误,好像没有protocol和simple-obfs(ssr) 在办公场所的时候DNS不解析, 手机数据可以用,但是wifi上不了。用的是v2ray的脚本+tls (port 443)+CDN (cloudflare.com), 如果没记错的话(可能经验有误 - 直接debian10 ss-libev脚本), 也就是说v2ray个人使用脚本(社区大神提供) + ss-libev 好像wifi出不去(可能当时443端口是v2ray占用), 可否简单介绍下这种方法的优势?
        kimberlysz4年前(2019-11-28)回复
        • 你好,我也是小白一个。 我是还没实际经历过这样的使用场景,结合下之前网上看到的(不一定对)说下看法:dns不解析域名可能是跟网络运营商有关系,你换个时间使用或者重启下wifi没准就可以了,就像手机上开关飞行模式一样。办公室的话可能有限制端口访问,使用443端口是受推荐的。 优势的话,我也没法不懂,我觉得ss相比之下配置简单,参数也不多,仅供参考。
          毕世平4年前(2019-11-28)回复
          • 好的,谢谢大神!
            kimberlysz4年前(2019-11-29)回复
      • 大神,我想补充一下,如果是第二章方法的话,路径这一栏好像是不填写的。
        帝国荣光4年前(2020-01-28)回复
  4. 4.5 配置 caddy 目录下最后一步返错: Unknown parameter : --keyfile
    昵称4年前(2019-11-27)回复
    • --keyfile 改为 --key-file 一开始写错了,后来纠正过来了。
      Teddysun4年前(2019-11-28)回复
  5. 我是第三种方案,docker logs ss-libev 是这样 ERROR: failed to handshake with 127.0.0.1: authentication error
    llgo4年前(2019-11-27)回复
  6. 在4.5安装证书和 key 到 /root/caddy 目录下 提示 root@4bit:~/caddy# acme.sh --installcert -d mydomain.me --fullchain-file /root/caddy/caddy.crt --keyfile /root/caddy/caddy.key --ecc [Tue Nov 26 23:52:49 EST 2019] Unknown parameter : --keyfile
    4bit4年前(2019-11-27)回复
    • 你好,我查阅了github上的该项目的介绍,这里是可以用--keyfile 后面跟key的绝对路径的,注意是两个-,然后如果还是不行,你尝试更换为--keypath试试,如果也不行的话,建议去这个项目下去提issue或者先升级自己的acme.sh脚本。 https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
      毕世平4年前(2019-11-27)回复
    • 不对,是--key-file,不是--keyfile,在key和file中间还有个-
      毕世平4年前(2019-11-27)回复
    • --keyfile 改为 --key-file
      MurrddoL4年前(2019-11-27)回复
  7. 大神, 请教一下ss-libev+v2ray-plugin 与v2ray社群中某大神同学提供的 多用户安装脚本中v2ray Vmess+tls+cloudflare CDN的区别在哪里, 哪个目前感觉更加有前景,比较好用。 谢谢大神。
    kimberlysz4年前(2019-11-27)回复
    • 没有前景。 不是我悲观,事实上终有一天,你会对现有的所有翻墙手段感到无助……钱,时间,精力,砸进去的越来越多,而墙永远是个无底洞。
      Teddysun4年前(2019-11-28)回复
      • 其实我很感谢的,我现在就在经营机场,用的是社区的脚本。 对的,我是认同zy价值观,所以我要了解一些外面的资讯,顺便把我认为好的东西带给身边的朋友。 这个也是我的side project,我们主营的是电子产品方案和整机设计和集成的业务。 这个有时候确实很抓狂,经常让人压抑。 谢谢大神们对社区的贡献,非常感激,这里面投入的时间精力我相信是信念支撑的。 最后大概问下,这个方法是否算是蛮快的方法? 我想也要保留一些方法为未来做些准备,所以问下这个方法的优点?另外,跟ss-libev+simple-ofs(另大神不推荐)的异同? 我现在主要用的方法是LEMP+Nginx+ssr+port redirect, ssl/tls用certbot安装的。 VPS设置instruction 参考 url1: https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mariadb-php-lemp-stack-on-debian-10 url2: https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lemp-nginx-mariadb-and-php-on-debian-10 url3: https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-10
        kimberlysz4年前(2019-11-28)回复
        • simple obfs 原作者已经停止维护了。
          野猫4年前(2019-11-28)回复
          • Hi 是的madeye好像已经停止转到v2ray-plugin维护了。
            kimberlysz4年前(2019-11-29)回复
  8. 非常感谢大佬的教程,支持脚本
    Watson4年前(2019-11-27)回复
  9. 昨天正在找相关的教程 ,今天就在TG 频道看到了推送。同样的疑问第四种和直接使用v2ray部署有什么区别呢?
    mahone4年前(2019-11-27)回复
  10. 如果这样设置的话"server;mux=0" win端怎么填写呢?
    MurrddoL4年前(2019-11-27)回复
    • 如果这么设置的话,Windows 客户端里不可用
      Teddysun4年前(2019-11-28)回复
  11. 昨天试了一下docker的多端口,需要注意的是主机的地址可以任意位置,但是容器的地址需要指定为/etc/shadowsocks-liber。即-v /any/path/in/host:/etc/shadowsocks-libev.否则容器会使用默认的配置文件
    earwen4年前(2019-11-27)回复
  12. 复杂了点,小白的我还是喜欢一键操作。
    烟头儿4年前(2019-11-27)回复
  13. 第四个方案和v2ray tls ws web有什么区别吗?速度会更快,延迟更低,还是吃性能更低?
    mayim4年前(2019-11-27)回复
  14. 非常感谢大佬的详细教程!
    Kinder4年前(2019-11-26)回复
    • 声明:教程不是我写的,本教程为转载。我只是稍加整理了一下而已。
      秋水逸冰4年前(2019-11-26)回复
  15. 前排坐起!
    i4年前(2019-11-26)回复