由于经常需要访问 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 的指令是:

1
2
3
  ufw allow 443
  ufw allow 80
  ufw reload

2. 申请一个域名

网上随便找个域名贩卖网站,买一个自己喜欢的域名即可,购买之后,需要 将域名解析到 VPS 的 IP 地址。

3. 安装 & 配置 Caddy

按照 Caddy 的安装步骤 将 Caddy 安装到 VPS 上,具体使用可以看 Caddy 文 档,里头有很多详细的例子。

安装好之后,配置 /etc/caddy/Caddyfile :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 # 你的域名
 <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
         }
 }

相关指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  # 启动 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:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
  {
    "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。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  ---
  # 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 :)

1
2
3
4
5
6
  # 检查运行状态
  systemctl status candy
  systemctl status v2ray
  # 检查输出的日志
  journalctl -u caddy --no-pager | less +G
  journalctl -u v2ray --no-pager | less +G