在AWS EC2上搭建V2ray+Caddy代理

Page content

环境及软件版本

  • 服务器: AWS EC2
  • 系统: ubuntu 18.04
  • Caddy: 2.x
  • V2ray: 4.x

V2ray

V2ray安装

bash <(curl -L -s https://install.direct/go.sh) # 直接使用脚本

此脚本会自动安装以下文件:

  • /usr/bin/v2ray/v2ray:V2Ray 程序;
  • /usr/bin/v2ray/v2ctl:V2Ray 工具;
  • /etc/v2ray/config.json:配置文件;
  • /usr/bin/v2ray/geoip.dat:IP 数据文件
  • /usr/bin/v2ray/geosite.dat:域名数据文件 此脚本会配置自动运行脚本。
    自动运行脚本会在系统重启之后,自动运行 V2Ray。 目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

修改配置

编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式。

vim /etc/v2ray/config.json 

启动V2ray

service v2ray start
  • 之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行

服务端配置

将服务器 /etc/v2ray/config.json 文件修改成下面的内容。 这里是一个最基本的服务端配置,我们尽量保持简单,太复杂的东西总是难以维护,最后就放弃了。

修改完成后要运行service v2ray restart重启 V2Ray,才会使修改的配置生效。

启动后,V2ray会以 Vmess + WS 方式监听 8888 端口。

{
    "inbound": {
        "port": 8888, // 服务器监听端口
        "listen": "127.0.0.1", // 只监听 127.0.0.1,避免除本机外的机器探测到开放了8888端口 
        "protocol": "vmess",
        "settings": {
            "clients": [
                {
                    "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
                    "alterId": 64
                }
            ]
        },
        "streamSettings": {
            "network": "ws", // WebSocket 方式
            "wsSettings": {
                "path": "/ray"
            }
        }
    },
    "outbound": {
        "protocol": "freedom", // 主传出协议 这里是直接转发所以流量
        "settings": {}
    }
}

客户端配置

将客户端的 config.json 文件修改成下面的内容,修改完成后要重启 V2Ray 才会使修改的配置生效。

{
  "inbounds": [
    {
      "port": 1080, // 本地监听端口
      "protocol": "socks", // 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth"  //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess", // 出口协议
      "settings": {
        "vnext": [
          {
            "address": "your_server_ip", // 服务器地址,请修改为你自己的服务器IP
            "port": 8888,  // 服务器监听的端口
            "users": [
              {
                "id": "b831381d-6324-4d53-ad4f-8cda48b30811",  // 用户 ID,必须与服务器端配置相同
                "alterId": 64 // 此处的值也应当与服务器相同
              }
            ]
          }
        ],
        "streamSettings": {
          "network": "ws",
          "wsSettings": {
            "path": "/ray"
          }
        }
      }
    }
  ]
}

客户端运行

  • 在 Windows 和 macOS 中,配置文件通常是 V2Ray 同目录下的 config.json 文件。直接运行 v2ray 或 v2ray.exe 即可。
  • 在 Linux 中,配置文件通常位于 /etc/v2ray/config.json 文件。运行 v2ray –config=/etc/v2ray/config.json,或使用 systemd 等工具把 V2Ray 作为服务在后台运行。

配置代理

为啥选Caddy

完成前面V2Ray + Websocket 模式的配置后,V2ray就基本可以正常使用了,但依然不够安全,存在被封的风险。 WALL不知道你做了什么,但知道你使用加密协议在访问外网。 通常的做法是将V2ray放在Nginx或Caddy或Apache代理的后面,伪装成普通http服务。

目前比较流行的是 Vmess + WebSocket + TLS (以下简称 wss)方式, WSS三件套的思路其实就是,本地v2ray客户端出口(outBound)访问代理服务器,然后通过代理服务器将请求转发到服务端的v2ray入口(inBound)。 由于使用TLS协议加密,且整个过程看起来就是普通的https请求,降低被WALL的几率。

  • 使用 Nginx/Caddy/Apache 是因为 VPS 已经有 Nginx/Caddy/Apache 可以将 V2Ray 稍作隐藏
  • 使用 WebSocket 是因为搭配 Nginx/Caddy/Apache 只能用 WebSocket
  • 使用 TLS 是因为可以流量加密,看起来更像 HTTPS
  • 使用域名是因为 TLS 需要使用域名和证书,域名需要添加A记录,将域名解析到Caddy所在的服务器

Nginx需要手动生成一个SSL证书,添加到配置里。 Caddy 会自动申请证书并自动更新,所以使用 Caddy 不用指定证书、密钥。我们选择更简单的 Caddy。

安装Caddy

echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" \
    | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
sudo apt update
sudo apt install caddy

确认caddy版本

caddy version
v2.0.0 h1:pQSaIJGFluFvu8KDGDODV8u4/QRED/OPyIR+MWYYse8=

配置Caddy

新建一个Caddyfile,添加如下内容:

yourdomain.com:443 {
    log /home/ubuntu/caddy/access.log
    tls test@abc.com
    reverse_proxy /ray localhost:8888 {
        header_up Host {http.request.host}
        header_up X-Real-IP {http.request.remote}
        header_up X-Forwarded-For {http.request.remote}
        header_up X-Forwarded-Port {http.request.port}
        header_up X-Forwarded-Proto {http.request.scheme}
    }
}
  • Caddy v1.x 和 v2.x 的配置文件是不兼容的,这里我们采用的是最新的v2
  • Caddy监听 443 端口(可以是其他端口)
  • Caddy处理 TLS 之后,将流量转发到 V2Ray 的 WebSocket 所监听的内网端口,本例是8888
  • V2Ray收到请求后依然 按 Vmess 处理,V2ray服务器端不需要配置 TLS

启动Caddy

sudo caddy run --config &

检查证书

直接用浏览器访问这个地址,这里示例域名: yourdomain.com

https://crt.sh/?q=yourdomain.com

更新客户端配置

{
  "inbounds": [
    {
      "port": 1080, // 监听端口
      "protocol": "socks", // 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "settings": {
        "auth": "noauth" //socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess", // 出口协议
      "settings": {
        "vnext": [
          {
            "address": "yourdomain.com", // 服务器地址,请修改为你自己的服务器域名
            "port": 443, // 服务器端口 443是https使用的端口
            "users": [
              {
                "id": "b831381d-6324-4d53-ad4f-8cda48b30811", // 用户 ID,必须与服务器端配置相同
                "alterId": 64 // 此处的值也应当与服务器相同
              }
            ]
          }
        ],
        "streamSettings": {
          "network": "ws",
          "security": "tls", // 客户端的 security 要设置为 tls
          "wsSettings": {
            "path": "/ray" // 注意:对于 V2Ray,/ray 和 /ray/ 是不一样的
          }
        }
      }
    }
  ]
}

新的配置修改了3个地方:

  • address:ip -> your_domain,把ip修改为你的域名,tls需要使用域名
  • port:8888 -> 443,443是https使用的端口,也是Caddy监听的端口
  • streamSettings添加 "security": "tls";服务端不用配,是因为tls交给Caddy处理了

注意:

  • 我们的客户端现在对接的是caddy了,端口啥的都要和caddy配置文件对应
  • 开启了 TLS 之后 path 参数是被加密的,WALL看不到
  • 主动探测一个 path 产生 Bad request 不能证明是 V2Ray
  • 使用 Header 分流并不比 path 安全,不要迷信 (不懂,反正教程里这么说的)

然后重启V2ray客户端,这样访问代理的流量就跟访问普通网站一样,比较难以被WALL检查出来了。

本文由 络壳 原创或整理,转载请注明出处