V2ray with Caddy + HTTP2 + TLS

Table of Contents

由于经常需要访问 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

Author: Spike Leung

Date: 2022-08-08 Mon 00:00

License: CC BY-NC 4.0