家庭宽带环境下使用 caddy 反代内网中的服务

在家庭宽带环境下,如果拥有一个公网 ip 地址,可以使用 caddy 反代内网中的服务,并绑定不同的域名,暴露在公网上。

此处使用的是 caddy 和 CloudFlare,如果使用 nginx 或者其他 DNS 服务商,可以参考原理。

问题情景

假设内网里有两台服务器,ip 分别是 192.168.1.2 和 192.168.1.3。

配置 caddy 反向代理

caddy 的配置文件通常在 /etc/caddy/Caddyfile,需要增加如下配置:

movie.example.com {
reverse_proxy 192.168.1.3:8001
}
 
music.example.com {
reverse_proxy 192.168.1.3:8002
}

配置 SSL 证书

如果已有 SSl 证书,caddy 和 nginx 都提供了自定义证书的功能。此处使用的是 caddy 自动申请 SSL 证书

caddy 使用 Let’s Encrypt 或 ZeroSSL 来申请免费的证书,需要 443 端口能够正常访问。如果 443 端口不能访问,就需要用 API 的方式。需要在安装 caddy 的时候,附加上 caddy-dns/cloudflare 模块。

配置域名解析

在域名服务商管理面板中,设置两个 A 记录,把 movie.example.com 和 music.example.com 都解析到家庭公网 ip。

配置路由器端口转发

由于家庭宽带公网 ip 通常被绑定在路由器上,所以需要做一个端口映射。打开路由器的管理页面(以电信天翼的为例),找到高级设置→端口映射。

2024012215213788.png

https://movie.example.com:8080 或者 https://music.example.com:8080 被访问时(本质访问的是路由器),路由器会把流量转发到 192.168.1.2(caddy 服务器)上,由 caddy 统一接管流量。由于 caddy 服务器中配置了反向代理规则,caddy 会根据不同的域名找到对应的服务,即 https://movie.example.com:8080 对应 http://192.168.1.3:8001https://music.example.com:8080 对应 http://192.168.1.3:8002

到此为止,流程已经结束。


额外事项

安装带有 cloudflare-dns 的 caddy

有些步骤需要用户具备一定的 linux 知识,涉及 linux 相关的内容,不一一赘述。

方法一,官网下载

打开 caddy 下载页面,搜索 dns,并勾选 caddy-dns/cluodflare 模块(如果使用的是其他 DNS 服务商,则需要选择别的模块),点击下载即可

2024060313341750.png

方法二,使用 xcaddy 构建

此步骤参考:https://caddyserver.com/docs/build#xcaddy

把得到的二进制文件放到服务器上,并赋予可执行的权限,执行 caddy 即可。也可以使用 systemdpm2 或者 supervisor 等,来管理 caddy 服务。

caddy-dns/cluodflare 模块的作用

默认情况下,caddy 自带的 Let’s Encrypt 或 ZeroSSL 申请证书,需要 caddy web 服务器的 443 端口能够正常访问。此模块可以在 443 端口不可用的情况下,让 caddy 自带的 Let’s Encrypt 或 ZeroSSL 与 CloudFlare 建立通信,从而能够成功申请 SSL 证书。

如果使用自定义证书,则可以忽略 addy-dns/cluodflare 模块

caddy 配置文件

在配置文件中增加 TLS 配置,参考:https://caddyserver.com/docs/caddyfile/directives/tls#examples

movie.example.com {
reverse_proxy 192.168.1.3:8001
tls {
dns cloudflare {{token}}
}
}
 
music.example.com {
reverse_proxy 192.168.1.3:8002
tls {
dns cloudflare {{token}}
}
}

{{token}} 需要替换为真实的 token,如何申请 token,参考 CloudFlare 官方文档。在使用 acme.sh 给群晖申请 SSL 证书笔记中,也提到了如何使用 CloudFlare 的 token 申请证书。

如何重启 caddy

动态 dns

市面上的 ddns 工具比较多,也可以自己写个脚本来处理。此处推荐几个: