使用 caddy 搭建反向代理

使用 caddy 搭建反向代理原文备份。

本文介绍家庭宽带及VPS中部署caddy,实现反向代理、自动申请并续签证书、http自动跳转https等功能,可通过docker或裸跑二进制的方式部署

① 家庭宽带中通过docker部署

由于家庭宽带80 443端口被封,无法通过DNS验证的方式申请证书,需配合cloudflare DNS token申请证书,故只推荐通过docker安装

使用docker官方脚本一键安装docker,已安装docker的跳过

curl -fsSL https://get.docker.com | bash -s docker

可选用阿里镜像仓库加速安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

创建好容器所需文件夹及文件

mkdir -p /root/docker/caddy/data
touch /root/docker/caddy/data/caddyfile.txt
touch /root/docker/caddy/compose.yml

compose.yml内容如下,使用host模式会自动占用8080和55443端口(55443为公网访问时所加端口,可在配置文件中修改)

version: '3'
services:
  caddy:
    pull_policy: always
    image: sliamb/caddy:latest
    container_name: caddy
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - DNS=223.5.5.5,8.8.8.8
    volumes:
      - ./data:/data
      - ./cert:/root/.local/share/caddy/certificates   # 证书路径
    network_mode: "host"

修改caddyfile.txt配置文件

以下为配置示例,根据情况自行调整

  • 格式参考如下,修改对应邮箱、dns_token、域名及服务地址
  • 将caddy监听的https端口修改为55443,相对应的公网端口(即之后访问域名时候加的端口)也是55443,主路由做好wan端口55443到caddy 55443的映射。该端口根据自己需求修改即可。
  • 配置模板内容依次为:反向代理pve等https连接、反向代理普通http连接、反向代理静态网页
{
    # 配置 cloudflare 的 DNS-01 挑战
    email [email protected]  # 替换为您的邮箱
    acme_dns cloudflare xxxxxxxxxxxxxxxxxxxxxxx  # 替换为 cloudflare 的 token
    # 以上两条是基于let‘s encrypt的格式,如果是zerossl,参考下面,(zerossl博主没试过,仅供参考,以上两条基于let‘s encrypt的已测试成功)
    #acme_ca https://acme.zerossl.com/v2/DV90       #切换证书发行商为ZeroSSL
    #acme_eab {
        #key_id  XXXXXXXXXXXXXXXXXX             #ZeroSSL网站上api的ID
        #mac_key XXXXXXXXXXXX                   #ZeroSSL网站上api的KEY
    #}

    auto_https disable_redirects                   #关闭caddy默认的自动https,因为它是基于标准端口的

    http_port 8080   # 修改默认 HTTP 端口为 8080 ,用不到,无需在主路由做端口映射
    https_port 55443 # 修改默认 HTTPS 端口为 55443,需在主路由做好端口映射,建议外部端口和caddy使用同一端口,不同端口自行测试
    servers {               #这一串代码块就是实现非标端口的http重定向https
        listener_wrappers {
            http_redirect
            tls
        }
    }
}

XXXXXX.com:55443 {        #增加一个主域名,不代理任何网站,只是为了申请一张证书,可以导出给其他设备使用
}

# 泛域名配置
*.xxxxxxxxx.com:55443 {

    # 根据子域名配置反向代理
    @pve host pve.xxxxxxxxx.com
    handle @pve {
        reverse_proxy 10.10.10.2:8006 {
            transport http {                       #跳过本地的证书验证,由caddy加密,适用于pve等局域网内https://10.10.10.2:5667等https连接
                tls_insecure_skip_verify
            }
        }
    }

    @ikuai host i.xxxxxxxxx.com                   #简单反代
    handle @ikuai {
        reverse_proxy 10.10.10.31
    }

    @ikuai host i.xxxxxxxxx.com                   # 添加头部,传输客户端IP等信息
    handle @ikuai {
        reverse_proxy 10.10.10.32 {
        header_up Host {upstream_hostport}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }
    }

    @password host password.xxxxxxxxx.com                   #带密码认证的反代,用户名为rainbow,密码为123456,其中写入配置的密码需用caddy hash-password --plaintext 123456命令生成,若用docker版本无法运行命令,可google搜索“Bcrypt密码生成工具”生成密钥
    handle @password {
        basicauth / {
           # 以下设置代表用户名为rainbow, 密码为123456
	    rainbow $2a$14$ZTwlgDTKk38.53Z0QhkuJ.iwmOwnK1ggYs2O8M6eT0ivTwTeVXxVS
	}
        reverse_proxy 10.10.10.33
    }

@www host chatgpt.你的域名.com   #静态网页
handle @www chatgpt.你的域名.com {
root * /usr/share/caddy
file_server
encode gzip
}

    handle {                            #兜底规则,匹配不上以上任何网址,则返回404
        respond 404
    }
}

启动caddy

进入compose所在文件夹,使用“docker compose up -d”命令启动caddy

② 家庭宽带中通过官方二进制文件部署

自行安装好lxc,推荐ubutun22.04,建议换好国内源

安装带模块的caddy

由于家庭带宽中443端口被封,原版caddy无法申请证书,需使用附带cloudflare模块的caddy,通过配置dns token的方式申请证书,详细信息可参考官方文档

https://caddy2.dengxiaolong.com/docs/install

前往以下地址下载官方编译好带DNS模块的二进制文件(以cloudflare为例,若使用alidns、dnspod均有对应模块,自行勾选即可)

<https://caddyserver.com/download?

选择对应系统,勾选cloudflare模块,点击下载

参考官方文档,使用以下命令安装原版caddy

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

先将下载的caddy二进制文件上传到 /root 目录,重命名为“caddy”,再使用下面命令覆盖原版文件

systemctl stop caddy
mv /root/caddy /usr/bin/caddy
chmod +x /usr/bin/caddy

修改配置文件

配置文件位于 /etc/caddy/Caddyfile

vim /etc/caddy/Caddyfile
输入 dG 清空内容(注意G是大写)
粘贴修改好的配置文件
按esc
输入:wq 保存退出

** 配置文件内容参考docker部分 **

修改完配置后重启caddy(每次修改配置后均需重启caddy)

systemctl restart caddy

查看caddy运行状态

systemctl status caddy

caddy证书存放目录,可查看证书是否申请成功

"/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/"

③ vps中部署caddy

依然建议使用docker部署caddy,vps环境下(80、443端口可用)使用官方原版即可正常申请证书

compose文件如下

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    networks:
      - caddy_docker_bridge
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile  # Caddyfile位配置文件,通常使用绑定挂载方便编辑
      - ./html:/var/www/html              # 静态网页绑定挂载
      - ./data:/data                  # **使用命名卷**来存储Caddy的持久化数据(如证书、缓存)
      - ./config:/config              # **使用命名卷**来存储Caddy的运行时配置
volumes:
  caddy_data:
  caddy_config:

networks:
  caddy_docker_bridge:

配置文件Caddyfile内容如下

pve.你的域名.com {
    reverse_proxy https://172.16.0.254:8006 {
        transport http {
            tls_insecure_skip_verify
        }
    }
}

omv.你的域名.com {
    reverse_proxy http://172.16.0.8:80
}

静态网页.你的域名.com {
    root * /var/www/html
    file_server
    encode gzip
    }