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
:
{ "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。
--- # 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