很久没写教程了,之前写过一篇关于 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"
}
说明:
server
此处我打算仅使用 v2ray-plugin 的方式使用 SS,所以只监听本地地址。server_port
用于对应 Web 服务器,也就是之前设置的10100
端口password
密码method
依旧建议使用 AEAD 算法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
第一种方案的问题在于,如果你同时需要用 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 的 method
和 password
。
对于对应 Web 服务器端口的 10100
和 10200
以及和 path
也可以自行修改,但要记住如果这里改了对应的 Web 服务器配置也要改。
修改完成后重启 V2Ray 服务以让其生效:
sudo service v2ray restart
为防止意外查看下 V2Ray 的服务状态是否是正常的绿色
sudo service v2ray status
本文到此结束,GLHF。