很久以前自己写过ss-libev+simple-obfs免流教程,现在obfs已经停止更新了,看到了@Conners Hua大佬的文章教程,记录一下自己参考文章部署2ray-plugin的过程(在我写这篇文章的时候作者已经把原文删除了)

教程中有提到:
Quantumult X,它需要 v2ray-plugin 服务端配置 mux=0 参数,与Shadowrocket等软件所使用的服务端配置是有所不同的,后面会有既满足Quantumult X又满足Shadowrocket的方案

准备工作准备工作

  1. 一个域名
  2. 一台云服务器(作者用的Ubuntu,我用的是Debian)

如果是新系统,请先刷新软件源及更新软件

sudo apt update && sudo apt upgrade

另外还需要一些软件

sudo apt install vim curl wget

按照教程内容分为两大部分

  1. web服务器
  2. shadowsocks

部署web服务器之Caddy

(Caddy比较简单,能够自动申请证书,配置https)

安装 Caddy

curl https://getcaddy.com | bash -s personal

新建配置文件目录

sudo mkdir /etc/caddy
sudo chown -R root:root /etc/caddy

新建 caddy 配置文件

sudo touch /etc/caddy/Caddyfile
sudo chown root:root /etc/caddy/Caddyfile
sudo chmod 644 /etc/caddy/Caddyfile

新建 SSL 证书目录

sudo mkdir /etc/ssl/caddy
sudo chown -R root:www-data /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

新建 Web 根目录

sudo mkdir /var/www
sudo chown www-data:www-data /var/www
sudo chmod 555 /var/www

配置 Web 站点
example.com 是一个文件夹,可以以你的域名为名字

sudo mkdir /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 555 /var/www/example.com

配置 Caddy 服务
下载服务文件并配置

sudo wget <https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service>
sudo cp caddy.service /etc/systemd/system/
sudo chown root:root /etc/systemd/system/caddy.service
sudo chmod 644 /etc/systemd/system/caddy.service
sudo systemctl daemon-reload

启动 caddy

sudo systemctl start caddy.service

设置开机启动

sudo systemctl enable caddy.service

配置 Caddy 网站

sudo vim /etc/caddy/Caddyfile

内容如下:

example.com { # 你的域名
    tls mail@example.com # 你的邮箱用于申请 SSL 证书
    gzip
    # root /var/www/example.com
    proxy / www.microsoft.com # 需要反向代理网站的网址
    proxy /s localhost:10100 { # 用于 v2ray-plugin 的 path
        websocket
        header_upstream -Origin
    }
    proxy /x localhost:10200 { # 可以多加一个给 Quantumult X
        websocket
        header_upstream -Origin
    }
}

PS:

  1. 如果有兴趣可以自己写一些静态页面放置于/var/www/example.com目录或者干脆反向代理一个国际网站,如果你想要自己弄一个静态页面可以将 proxy / www.microsoft.com 注释掉,也就是在前面加上 # 号,然后将 root 前的 # 号去除
  2. 这里你需要有个印象,在这里我配置了两个 path ,一个是 /s 对应端口为 10100 用于普通 v2ray-plugin 软件。另一个是 /x 对应端口为 10200 用于 Quantumult X,如果你不使用可以将第二个 /x 的配置删除。

修改好 Caddyfile 后保存退出,然后重启下 Caddy 服务让其生效。

sudo systemctl restart caddy.service

PS:在重启服务后可以查看下服务状态,也就是

sudo systemctl status caddy.service

如果你访问网站发现没有成功,就可以查看上述状态是否是绿色,并且注意运行端口,Caddy 可能会指定一个随机端口,此时你可以再次修改 Caddyfile 中强制指定 443 端口,比如:

example.com:443 { # 你的域名
    tls mail@example.com # 你的邮箱用于申请 SSL 证书
        ...
}

之后和上面一样保存退出、重启服务

遇到「listen tcp :443: bind: permission denied」问题
如果通过查看 status 发现「listen tcp :443: bind: permission denied」

sudo vim /etc/systemd/system/caddy.service 

去掉 CapabilityBoundingSetAmbientCapabilities 的注释

; The following additional security directives only work with systemd v229 or later.
; They further restrict privileges that can be gained by caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
找到以下两行,将注释也就是开头的 ; 移除,保存并退出重启服务即可。
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

;NoNewPrivileges=true

部署web服务器之Nginx

这里就贴一下我用的配置文件

server {
        listen 80;
        server_name banana-zone.me;##你的域名
        #rewrite ^(.*)$  https://$host$1 permanent; ##这句是强制HTTP跳转HTTPS
        #rewrite ^/(.*) https://www.microsoft.com permanent;
}
#上面这个我是让http直接跳转到/www.microsoft.com permanent,会导致shadowrocket连不了
server
    {
        listen 443;
        ssl on;
        server_name banana-zone.me;##你的域名
        ssl_certificate  /root/ssl/banana-zone.me.fullchain.cer;  ##证书位置
        ssl_certificate_key /root/ssl/banana-zone.me.key;         ##证书位置
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        index index.html index.htm index.php;
#上面是Nginx的https配置
        location / {
        proxy_pass  https://www.microsoft.com;
    }
#这个是反向代理,即浏览banana-zone.me时会跳转到www.microsoft.com
        location /s { # path
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10100; # Shadowsocks 或 VMess 配置里的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
#上面是适用于shadowrocket的配置
        location /x { # path
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10200; # Shadowsocks 或 VMess 配置里的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}
#上面是适用于Quantumult X的配置
#看个人需求,需要哪个要哪个或者两个一起

PS:重点都是对应到后端 Shadowsocks 或者 V2Ray 的端口以及 WebSocket 的 path 路径

location /s { # path
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10100; # Shadowsocks 或 VMess 配置里的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
#上面是适用于shadowrocket的配置
        location /x { # path
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10200; # Shadowsocks 或 VMess 配置里的端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }

PS:以上内容必须放在listen 443那段后面,放在别的地方,shadowrocket会连不上

部署v2ray-plugin 与 Shadowsocks

(部署Shadowsocks有两种方法)

首先是部署 v2ray-plugin,编译该项目需要安装 Go
先到 Go 官网下载页面获取最新下载链接
安装并配置 Go

wget https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz && tar -xaf go1.13.1.linux-amd64.tar.gz
mv go /usr/local/

配置环境

vim /etc/profile

在最后加上

export PATH=$PATH:/usr/local/go/bin

然后保存退出
使配置生效

source /etc/profile

查看 Go 版本以确认安装成功

go version

看到返回结果为go version go1.13.1 linux/amd64,即 go 安装成功了
下载并编译 v2ray-plugin
下载并进入目录

git clone https://github.com/shadowsocks/v2ray-plugin.git && cd v2ray-plugin

编译 v2ray-plugin

go build

将编译好的主体放入 PATH 环境

mv v2ray-plugin /usr/local/bin

方法一

Shadowsocks-libev + v2ray-plugin(有局限性)
安装并配置 Shadowsocks-libev

sudo apt install shadowsocks-libev

卸载

apt remove shadowsocks-libev

编辑 Shadowsocks 配置文件

vim /etc/shadowsocks-libev/config.json
{
    "server":"127.0.0.1",
    "server_port":10100,
    "local_port":1080,
    "password":"FuckGFW",
    "timeout":60,
    "method":"chacha20-ietf",
    "plugin":"v2ray-plugin",
    "plugin_opts":"server;path=/s;loglevel=none"
}

说明:

  • server 此处打算仅使用 v2ray-plugin 的方式使用 SS,所以只监听本地地址。
  • server_port 用于对应 Web 服务器,也就是之前设置的 10100 端口
  • password 密码
  • method 依旧建议使用 AEAD 算法(实际测试ss-server不识别aes-128-gcm)
  • plugin v2ray-plugin 前面已放入 PATH 环境,所以直接指定
  • plugin_opts 如示例中填写, path 就是之前配置 Web 服务器中的 /s,另外如果是用于 Quantumult X 需要加上 mux=0 完整的示例就是 server;mux=0;path=/x;loglevel=none (注意加上 mux=0 后不与 Shadowrocket 等兼容)

修改完成后重启 Shadowsocks 服务以让其生效

sudo systemctl restart shadowsocks-libev

PS:第一种方法的问题在于,不能同时使用 Shadowrocket 等和 Quantumult X 的 v2ray-plugin,因为 Quantumult X 需要 mux=0 但这样其他软件如 Shadowrockety又不兼容

方法二

V2ray(ss)+v2ray-plugin
可以同时支持多种 v2ray-plugin,不仅是两种不同的 v2ray-plugin,甚至进一步的使用其他协议比如 VMess、以及软件和配置都可以统一使用 V2ray

安装 V2ray

bash <(curl -L -s https://install.direct/go.sh)

配置 V2Ray

cd /etc/v2ray/
sudo mv config.json config.json.bak
sudo vim config.json

可以新建一个 config.json 把电脑上编辑好的粘贴或者上传到 /etc/v2ray,这里不详细介绍,直接贴配置

{
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "info"
  },
  "inbounds": [
    { // 第一个进站配置,用于普通的 v2ray-plugin
      "port": 10100,
      "protocol": "dokodemo-door",
      "tag": "wsdoko",
      "settings": {
        "address": "v1.mux.cool",
        "followRedirect": false,
        "network": "tcp"
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/s"
        }
      }
    },
    { // 配合上面的进站配置的 SS 协议配置
      "port": 8389, // 此处的端口实际用不到但必须设置
      "protocol": "shadowsocks",
      "settings": {
        "method": "aes-128-gcm",
        "ota": false,
        "password": "qwe123",
        "network": "tcp,udp"
      },
      "streamSettings": {
        "network": "domainsocket"
      }
    },
    {  // 第三个进站配置,用于 Quantumult X 的 v2ray-plugin
      "port": 10200, 
      "protocol": "shadowsocks",
      "settings": {
        "method": "aes-128-gcm",
        "ota": false,
        "password": "qwe123",
        "network": "tcp,udp"
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/x"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    },
    { // 用于普通 v2ray-plugin
      "protocol": "freedom",
      "tag": "ssmux",
      "streamSettings": {
        "network": "domainsocket"
      }
    }
  ], // 用于普通 v2ray-plugin
  "transport": {
    "dsSettings": {
      "path": "/var/run/ss-loop.sock"
    }
  },
  "routing": {
    "rules": [
      { // 用于普通 v2ray-plugin
        "type": "field",
        "inboundTag": [
          "wsdoko"
        ],
        "outboundTag": "ssmux"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "blocked"
      }
    ]
  }
}

PS:对于对应 Web 服务器端口的 10100 和 10200 以及和 path 也可以自行修改,但要记住如果这里改了对应的 Web 服务器配置也要改
修改完成后重启 V2Ray 服务以让其生效

sudo service v2ray restart

为防止意外查看下 V2Ray 的服务状态是否是正常的绿色

sudo service v2ray status

原文快照参考

最后附上Quantumult X 和Shadowrocket的设置
参考
v2ray-plugin-1

更新后续遇到的问题

ss-libev+v2ray-plugin
Shadowrocket无法连接成功,原因是ss-server不识别aes-128-gcm这个加密方式,自动转换成rc4-md5
但是在v2ray中的ss则没有这个问题。
v2ray-plugin-1
v2ray-plugin-2
v2ray(ss)+v2ray-plugin
Shadowrocket无法连接成功,Quantumult X则无问题,原因是wordpress设置了固定链接,所以nginx配置中添加了这一段

location / {
        try_files $uri $uri/ /index.php?$args;
        }
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

结果导致连接不上,最后把wordpress设定成默认链接即可