Skip to content
チャ屋
Go back

利用 Caddy + IPv6 配置 HTTPS 反向代理

前言

最近在 NAS 上折腾 vaultwarden,由于服务端部署后必须通过 HTTPS 访问,反向代理肯定是最优解。但是中国大陆的 IPv6 一般封锁了 80/443 端口,所以可以采用 DNS-01 来申请证书,以实现 HTTPS 反向代理访问,这才有了下文~

准备

DNS 配置

配置 DDNS 或者手动让域名的 AAAA 记录指向 NAS 的 IPv6 地址。

创建 Cloudflare API Token

DNS-01 验证的原理是让 Caddy 自动调用 Cloudflare API,在域名下临时创建并删除用于验证所有权的 _acme-challenge TXT 记录,所以需要 Cloudflare 的 API Token。

在 Cloudflare 的 用户 API 令牌 页面使用模板 编辑区域 DNS 创建 API Token,如下图所示:

001

确保拥有编辑 DNS 的权限,然后建议把区域资源限制到反代的域名,如下图所示:

002

然后找个地方保存好你的 Token。

Caddy 配置

文件准备

Docker Hub 上的官方 caddy:latest 不包含第三方 DNS 服务商插件,所以需要手动将 caddy-dns/cloudflare 编译进镜像中。

在你的 compose 目录执行以下命令:

mkdir -p caddy_config caddy_data
touch Dockerfile docker-compose.yaml Caddyfile .env

编辑 Dockerfile:

FROM caddy:builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy:latest

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

编辑 docker-compose.yaml:

services:
  caddy:
    image: caddy-cloudflare:local
    build:
      context: .
      dockerfile: Dockerfile
    container_name: caddy
    restart: always
    network_mode: host

    environment:
      - TZ=Asia/Shanghai
      - CF_API_TOKEN=${CF_API_TOKEN}

    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy_data:/data
      - ./caddy_config:/config

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

编辑 .env,填入上面创建的 API Token:

CF_API_TOKEN=<替换为你的Cloudflare_API_Token>

编辑 Caddyfile:

{
    auto_https disable_redirects
    acme_dns cloudflare {env.CF_API_TOKEN}
}

<NAME>.cya.moe:8443 {
    reverse_proxy [::1]:<服务端口>
}

8443 可以任意替换为你想要的端口,如果需要开小橙云的话可以替换为2053, 2083, 2087, 2096;后面需要添加其他服务的话,在下面继续追加站点块即可。

启动容器

在 compose 目录执行以下命令构建镜像:

docker compose build

构建完之后验证是否成功编译插件:

docker run --rm caddy-cloudflare:local caddy list-modules | grep cloudflare

启动前可以通过 Compose 验证刚刚的 Caddyfile:

docker compose run --rm caddy caddy validate --config /etc/caddy/Caddyfile

一切正常的话就可以启动 Caddy 容器了:

docker compose up -d
docker logs -f caddy

logs 里面如果显示证书签发成功就 OK 了~

日常运维

以后在 Caddyfile 中新增或修改了其他服务的反向代理规则时,运行以下命令即可:

docker exec caddy caddy validate --config /etc/caddy/Caddyfile
docker exec caddy caddy reload --config /etc/caddy/Caddyfile

利用 CF Origin Rules 去掉端口访问

如果每次访问都需要加 8443 这种非标准口显然不够优雅,可以使用 Cloudflare Origin Rules 实现浏览器免端口访问。

首先需要把反代的 AAAA 记录改为小橙云,即 Proxied,然后SSL/TLS 模式为严格模式:

003

在域名左侧的 规则 → 概述 中找到 Origin Rules,如下图所示:

004

然后如下图所示填写规则,端口填你自己配置的就行了:

005

点击部署之后后就可以去掉后面的端口直接访问啦~但是注意用这种方法会让 Cloudflare 代理你的流量,如果不是特别想去掉后面的端口的话,建议还是不要配置,因为在国内肯定直连更快嘛。


Share this post:

Next Post
如何在声谱图中嵌入图像