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

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

问题情景

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

192.168.1.2 上跑了一个服务:

192.168.1.3 上跑了两个服务:

下载 caddy

下载地址: https://caddyserver.com/download?package=github.com%2Fcaddy-dns%2Fcloudflare

选择合适的平台,顺便把 caddy-dns/cloudflare 勾选上。下载文件,并把二进制文件放到 192.168.1.2 服务器上。

2024012214590267.png

这里使用 caddy-dns/cloudflare 的原因是:我的域名是用 cloudflare 管理的。这个模块可以在 443 端口不可用的情况下,让 caddy 和 cloudflare 建立通信,从而自动申请 SSL 证书。参考: https://github.com/caddy-dns/cloudflare?tab=readme-ov-filehttps://caddyserver.com/docs/automatic-https

如果使用别的 DNS 服务商,caddy 也提供了很多选择,参考: https://caddyserver.com/docs/modules/

2024012215390886.png

如果有其他的申请 SSL 证书的办法,可以忽略 caddy-dns module。

配置 Caddyfile

打开默认的配置文件: /etc/caddy/Caddyfile,填入以下内容

(TLS) {
tls {
dns cloudflare tokenXX
}
}
 
movie.example.com {
import TLS
reverse_proxy 192.168.1.3:8001
}
 
music.example.com {
import TLS
reverse_proxy 192.168.1.3:8002
}

上述配置文件中的 tokenXX 需要替换为自己的。申请方法见: https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

如果有其他的申请 SSL 证书的办法,可以忽略此处的(TLS)。如何使用自定义证书: https://caddyserver.com/docs/caddyfile/directives/tls#examples

保存配置文件,运行命令: caddy run --config /etc/caddy/Caddyfile,启动 caddy。

为了方便,可以使用一些守护进程工具来启动 caddy,例如:Systemd、Supervisor、pm2 等。

配置域名解析

打开 DNS 提供商(此处是 cloudflare)后台,把 movie.example.com 和 music.example.com 两个域名解析到公网 ip 上。参考: https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/

为了方便,可以用 ddns(动态域名解析)工具来代替手动操作,例如:

设置端口映射

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

2024012215213788.png

如果公网的 443 端口可用,外部端口建议填写 443,这样就可以使用 https://movie.example.com 来访问服务了。否则需要加上端口号 https://movie.example.com:8080

访问流程

当打开 https://movie.example.com:8080 ,路由器会根据端口映射,把流量转发到 192.168.1.2(caddy https 服务)的 443 端口,caddy 又会根据反向代理规则去访问 http://192.168.1.3:8001 。