使用caddy搭建反向代理

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

① 家庭宽带中通过docker部署

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

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

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

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

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

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

1
2
3
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为公网访问时所加端口,可在配置文件中修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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连接、反向代理静态网页
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
{
# 配置 cloudflare 的 DNS-01 挑战
email xxxxxx@qq.com # 替换为您的邮箱
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

1
2
3
4
5
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”,再使用下面命令覆盖原版文件

1
2
3
systemctl stop caddy
mv /root/caddy /usr/bin/caddy
chmod +x /usr/bin/caddy

修改配置文件

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

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

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

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

1
systemctl restart caddy

查看caddy运行状态

1
systemctl status caddy

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

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

③ vps中部署caddy

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

compose文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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内容如下

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