Ubuntu Server 部署 v2ray-plugin – Circumvention Technology – Medium

Ubuntu Server 部署 v2ray-plugin – Circumvention Technology – Medium

很久没写教程了,之前写过一篇关于 Shadowsocks-libev + obfs 的,但众所周知目前 obfs 项目已经被 Deprecated,所以与时俱进一起来使用 v2ray-plugin 吧。

在开始之前先提一下 Quantumult X,它需要 v2ray-plugin 服务端配置 mux=0 参数,所以和 Shadowrocket 等软件所使用的服务端配置是有所不同的,关于为什么有这个要求,我在咨询作者后得到答复如下:

Quantumult X 是以并发吞吐量为前提的,后续不会支持 mux.cool(即多个网络请求通过同一个 TCP 连接来传输数据);特别的,TCP 连接吞吐量易受网络波动影响(相同的原地址端口与目标地址端口的两个 TCP 连接,由于网络波动及拥塞算法的关系,可能吞吐量差别巨大),当多个请求封装在一个 TCP 连接中时,受影响的效果将会被放大(虽然 mux.cool 因连接复用的关系会减少子连接的网络请求握手延迟,但这个特性不在 Quantumult X 考虑内,因已有 TFO 支持)。另外运营商也可能会对每个 TCP 连接做带宽限制。

所以本文会给出一种同时适配普通 v2ray-plugin 和 Quantumult X(也即是 mux=0 )的方案。

预先准备

1.一个域名

2.一台云服务器

这次依旧使用 Ubuntu Server 作为例子

# 如果是新系统,请先刷新软件源及更新软件
sudo apt update && sudo apt upgrade
# 另外还需要一些软件
sudo apt install vim curl wget

本文主要分两大部分,部署 Web 服务器和 Shadowsocks。

一、Caddy

下载 Caddy

首先先开始安装 Web 服务器,为什么是 Caddy 而不是 Nginx,是因为 Caddy 的配置文件非常简单,对于新手来说非常便于理解,此外还提供自动配置 HTTPS,可以极大的简化部署步骤。

当然关于 Nginx 的配置我也会有提到。

那么开始:

安装 Caddy

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

配置 Caddy

对于非 root 用户运行 caddy 还需要

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

一些目录设置

新建配置文件目录

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
}
}

一些说明:

1.如果有兴趣可以自己写一些静态页面放置于 /var/www/example.com 目录或者干脆反向代理一个国际网站,如果你想要自己弄一个静态页面可以将 proxy /[www.microsoft.com](<http://www.microsoft.com>) 注释掉,也就是在前面加上 # 号,然后将 root 前的 # 号去除

2.这里你需要有个印象,在这里我配置了两个 path ,一个是 /s 对应端口为 10100 用于普通 v2ray-plugin 软件。另一个是 /x 对应端口为 10200 用于 Quantumult X,如果你不使用可以将第二个 /x 的配置删除。

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

sudo systemctl restart caddy.service

⚠️ 注意:在重启服务后可以查看下服务状态,也就是

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; 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

使用 Nginx

Nginx 的具体部署步骤就略过了,知道 Nginx 的一般都会,这里只说一下具体配置

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;
}

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

二、Shadowsocks 与 v2ray-plugin

这里有两种方案,建议可以先不急着跟着做,可以先看完然后选一种方案(个人倾向于后者)

1.Shadowsocks-libev + v2ray-plugin 方案

首先是部署 v2ray-plugin,编译该项目需要安装 Go

先到 Go 官网下载页面 https://golang.org/dl/ 获取最新下载链接

# 安装并配置 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

sudo apt install 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":"aes-128-gcm",
"plugin":"v2ray-plugin",
"plugin_opts":"server;path=/s;loglevel=none"
}

说明:

  1. server 此处我打算仅使用 v2ray-plugin 的方式使用 SS,所以只监听本地地址。
  2. server_port 用于对应 Web 服务器,也就是之前设置的 10100 端口
  3. password 密码
  4. method 依旧建议使用 AEAD 算法
  5. plugin v2ray-plugin 前面已放入 PATH 环境,所以直接指定
  6. 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

第一种方案的问题在于,如果你同时需要用 Shadowrocket 等和 Quantumult X 的 v2ray-plugin 就比较麻烦,因为 Quantumult X 需要 mux=0 但这样其他软件如 Shadowrockety又不兼容。

2.V2Ray 方案

那么同时支持多种 v2ray-plugin 方案我建议是使用 V2Ray,不仅是两种不同的 v2ray-plugin,甚至进一步的使用其他协议比如 VMess、以及软件和配置都可以统一使用 V2Ray。

# 进入 root
sudo su
# 安装 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 里就行。

如果你看过我之前写过的《Project V(V2Ray) 》系列教程对于配置应该大体明白,如果没有我这里就啰嗦一点,从 V2Ray 最基础但配置开始讲

首先是一个默认的 V2Ray 配置

{
"inbounds": [
{ // 这是一个最简单的 VMess TCP 配置,就在这个花括号 {} 里,但我们不需要它,后面会删除
"port": 30019,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "bef7c553-3a5a-479c-9b0a-4a11eb6de1b7",
"level": 1,
"alterId": 64
}
]
}
}],
"outbounds": [{
"protocol": "freedom", // Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
"settings": {}
},{
"protocol": "blackhole", // Blackhole(黑洞)是一个出站数据协议,它会阻碍所有数据的出站,配合路由(Routing)一起使用,可以达到禁止访问某些网站的效果。
"settings": {},
"tag": "blocked"
}],
"routing": { // 路由
"rules": [
{
"type": "field",
"ip": ["geoip:private"], // 局域网
"outboundTag": "blocked" // 使用 blackhole 禁止访问
}
]
}
}

那么简单来说 V2Ray 基本配置由进/出站、路由构成。

{
"inbounds": [
// 进站
}],
"outbounds": [{
// 出站
}],
"routing": { // 路由
"rules": [

]
}
}

这里部署的是服务端,所以主要是针对 inbounds 进行修改

先说 Quantumult X 的配置,因为比较简单

{
"inbounds": [
{
"port": 10200, // 用于连接 Web 服务器(Nginx 或 Caddy)转发的端口
"protocol": "shadowsocks",
"settings": {
"method": "aes-128-gcm",
"ota": false,
"password": "FuckGFW",
"network": "tcp,udp"
},
"streamSettings": {
"network": "ws", // WebSocket 协议
"wsSettings": {
"path": "/x" // path
}
}
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": { // 路由
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
}
]
}
}

这部分其实挺简单的,其实就是增加 Shadowsokcs 协议并且配上了 WebSocket 及其路径(也就是 streamSettings 这一部分,如果没有 streamSettings 就是一个普通原版的 Shadowsocks。

进一步来说,如果你在使用例如「233v2」一类的脚本,可以加入如上示例中的 Shadowsocks 进站配置到现有配置的 inbounds 里,然后编辑现有 Caddy 的配置文件加入对应到 V2Ray 这边的端口和路径即可。

那么普通(也就是不需要 mux=0 )的软件如何设置呢?在以上基础上继续加

{
"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": "FuckGFW",
"network": "tcp,udp"
},
"streamSettings": {
"network": "domainsocket"
}
},
{ // 第三个进站配置,用于 Quantumult X 的 v2ray-plugin
"port": 10200,
"protocol": "shadowsocks",
"settings": {
"method": "aes-128-gcm",
"ota": false,
"password": "FuckGFW",
"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"
}
]
}
}

这部分新增配置参考

因为ss那边分离出了插件层,所以协议结构和v2这边不太一样。 如果想用 v2做server, ss over v2做客户端的话需要在server 设置一个任意门(tag:ws-in),地址设置为 v1.mux.cool,传输协议设置websocket 设置一个ss inbound (tag:ss-loc),传输协议不配置 设置一个freedom outbound (tag: ws-out),redirect到 ss-loc这个inbound 配置路由 ws-in -> ws-out,ss-loc -> 默认freedom

你可以将上述例子和前一个例子对比都加入了哪些东西?

如果你觉得麻烦或者不想研究那么多,那么直接套用我最后给出的示例即可。在上述示例中你只需要修改 Shadowsocks 的 methodpassword

对于对应 Web 服务器端口的 1010010200 以及和 path 也可以自行修改,但要记住如果这里改了对应的 Web 服务器配置也要改。

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

sudo service v2ray restart

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

sudo service v2ray status

本文到此结束,GLHF。