V2ray with Caddy + HTTP2 + TLS
由于经常需要访问 GitHub 等外网,就需要有一个快速响应的代理。
之前尝试过 v2ray 直连 、WebSocket + TLS + Web 的方式。
直连是比较快的,不需要进行 TLS 连接等操作,但应用 TLS 可以更好地防检测。
用了很长时间 WebSocket + TLS + Web 的组合,一直都比较稳定。
周末时翻到一篇关于 HTTP2 的搭建,有一个网站比较了 HTTP/1.1 和 HTTP2 的加载速度,发现 HTTP2 是真的很快,就想着重新部署一个代理,看是否有更好的体验。
由于换了服务器,现在不太确定是服务器影响还是 HTTP2 的影响,速度上要比之前的好一些。
这篇博客主要记录 V2ray + Caddy + HTTP2 + TLS 的相关配置,其它具体细节请参考 V2ray 新白话文教程 以及 官网。
准备
- 一台国外的 VPS
- 目前我用的是 VULTR,价格可能有一些贵,但稳定,速度也还可以,另外也支持支付宝充值。
- 一个域名
- 可以找个网站买一个便宜的域名,腾讯也有域名可以卖。
- 一些基础的知识
- 简单的命令行操作;Web 服务器的部署,配置,排错;了解怎么在服务器编辑文件。
搭建
这次搭建主要是参考了 HTTP/2+TLS+WEB ,里头用到了 Caddy 作为 Web 服务器,不过他用的是 Caddy1,而我用的是 Caddy2。
除了 Caddy,其实还能用 Nginx,Apache 去做 Web 服务器,不过 Caddy 相对来说使用上更简单方便。
之前搭建 WebSocket + TLS + Web 的时候是用的 Nginx,为了实现 TLS,需要去 Let's Encrypt 申请证书,这篇 教程里有介绍怎么申请。
而 Caddy 默认是开启 HTTPS 的,当你配置了域名,他会自动帮你从 Let's Encrypt 申请证书,到期了自动帮你更新,所以省去了不少步骤。
Tag 释义
下面配置中的 <tag> 是需要自己配置的,替换成对应的值。
| tag | 含义 |
|---|---|
| <uuid> | 可以用 uuidgen 指令生成,是客户端服务器通讯用的标识 |
| <http2-path> | http2 配置的路径 |
| <v2ray-port> | v2ray 监听的端口 |
| <domain> | 申请的域名,例如 hello.world |
| <root-path> | 静态文件路径,例如 /root/÷site |
| <email> | 邮箱 |
1. 购买一个 VPS 服务器
可以从 VULTR 购买,如果有更快,更稳定,价格不是很贵的提供商,欢迎留言推荐。
搭建代理不需要很高的配置,买一个最低配置的 VPS 即可,考虑到 CentOS 不再维护,我安装的是 Ubuntu,总之找一个自己熟悉的 linux 操作系统即可。
Ubuntu 的一个好处是配置防火墙的指令 ufw 相对 CentOS 的 firewall-cmd 而言用起来比较简单。
服务器部署好之后,可以将 443 和 80 端口打开,443 作为 Web 服务器的访问端口,80 是开放给 Let's Encrypt 注册的。
Ubuntu 的指令是:
ufw allow 443 ufw allow 80 ufw reload
2. 申请一个域名
网上随便找个域名贩卖网站,买一个自己喜欢的域名即可,购买之后,需要将域名解析到 VPS 的 IP 地址。
3. 安装 & 配置 Caddy
按照 Caddy 的安装步骤 将 Caddy 安装到 VPS 上,具体使用可以看 Caddy 文档,里头有很多详细的例子。
安装好之后,配置 /etc/caddy/Caddyfile :
# 你的域名 <domain> # [可选] 邮箱,用于注册证书,到期时会有通知, tls <email> # 以下两项是配置一个访问静态文件,不配应该也可以 # 指定静态文件路径 root * <root-path> # 设置为静态文件服务器 file_server # 反向代理,将流量代理到 VPS 上的 V2ray # <http2-path> 替换为 http2 的 path, <v2ray-port> 替换为 v2ray 对应的 port reverse_proxy <http2-path> localhost:<v2ray-port> { header_up Host {host} transport http { versions h2c 2 } }
相关 指令:
# 启动 caddy 服务 systemctl start caddy # 停止 systemctl stop caddy # 重启 systemctl restart caddy # 查看 caddy 服务的状态,可以用于排错 systemctl status caddy # 重新加载 caddy 配置,例如修改了 /etc/caddy/Caddyfile 之后 systemctl reload caddy # 查看 caddy 运行日志 journalctl -u caddy --no-pager | less +G
4. 安装 & 配置 v2ray
根据 fhs-install-v2ray 安装 v2ray, v2ray 的相关指令和 caddy 类似,将 caddy 换成 v2ray 即可。
v2ray 服务器配置
配置含义请 官网 查阅, /usr/local/etc/v2ray/config.json:
config.json
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": <v2ray-port>,
"listen": "127.0.0.1",
"tag": "vmess-inbound",
"protocol": "vmess",
"settings": {
"auth": "noauth",
"udp": false,
"ip": "127.0.0.1",
"clients": [
{
"id": "<uuid>",
"level": 0,
"alterId": 0,
},
]
},
"streamSettings": {
"network": "h2",
"security": "none",
"httpSettings": {
"path": "<http2-path>",
"host": ["<domain>"]
},
"tlsSettings": {
"serverName": "<domain>"
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
},
{
"type": "field",
"domain": ["geosite:category-ads"],
"outboundTag": "blocked"
}
]
},
"dns": {
"hosts": {
"domain:v2ray.com": "www.vicemc.net",
"domain:github.io": "pages.github.com",
"domain:wikipedia.org": "www.wikimedia.org",
"domain:shadowsocks.org": "electronicsrealm.com"
},
"servers": [
"1.1.1.1",
{
"address": "114.114.114.114",
"port": 53,
"domains": ["geosite:cn"]
},
"8.8.8.8",
"localhost"
]
},
"policy": {
"levels": {
"0": {
"uplinkOnly": 0,
"downlinkOnly": 0,
"bufferSize": 204800,
"handshake": 10
}
},
"system": {
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
}
}
v2ray 客户端配置
这里提供 ClashX 配置的参考,其它客户端配置类似的。
主要是配置 server, port 指向域名和对应的服务器。
配置 uuid 和服务器的 uuid 保持一致。
配置 http2 的相关 options。
ClashX 配置
--- # https://github.com/Dreamacro/clash/wiki/configuration port: 7890 socks-port: 7891 allow-lan: false bind-address: '*' mode: rule log-level: info ipv6: true proxies: - name: "proxy" type: vmess server: <domain> port: 443 uuid: <uuid> alterId: 0 cipher: auto network: h2 tls: true h2-opts: host: - <domain> path: <http2-path> rules: # proxy - DOMAIN,google.com,proxy # REJECT - DOMAIN-SUFFIX,ad.com,REJECT # optional param "no-resolve" for IP rules (GEOIP, IP-CIDR, IP-CIDR6) # DIRECT - SRC-IP-CIDR,192.168.1.201/32,DIRECT - IP-CIDR,127.0.0.0/8,DIRECT - GEOIP,CN,DIRECT - DST-PORT,80,DIRECT - SRC-PORT,7777,DIRECT - MATCH,proxy
排障
主要通过查看日志去判断问题是什么,然后 google :)
# 检查运行状态 systemctl status candy systemctl status v2ray # 检查输出的日志 journalctl -u caddy --no-pager | less +G journalctl -u v2ray --no-pager | less +G