Files
2026-06-09 23:08:10 +08:00

201 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Caddy L4 Proxy Server
一个基于 Caddy 2.11.4 和 caddy-l4 模块的容器化反向代理服务器,支持 HTTP/HTTPS 应用层反代和 TCP/UDP 四层转发。
## 特性
- **Layer 4 代理**:通过 `caddy-l4` 模块支持 TCP/UDP 四层转发,适合 SSH、MySQL、Redis 等非 HTTP 服务
- **自动 HTTPS**Caddy 自动申请和续期 Let's Encrypt 证书,无需手动配置
- **国内优化**:构建阶段配置了国内 Go 代理源 (`goproxy.cn`),加速镜像构建
- **容器化部署**:使用 Docker 和 Docker Compose 快速部署,支持数据和配置持久化
- **管理 API**Caddy 管理 API 监听在 2019 端口
## 系统要求
- Docker 20.10+ 或 Docker Desktop
- Docker Compose 2.0+(如使用 Compose 启动)
- Linux 主机(推荐)或 macOS/Windows with Docker Desktop
## 快速开始
### 1. 构建镜像
```bash
docker build -t caddy-l4:local .
```
### 2. 使用 Docker Compose 运行
```bash
docker compose up -d
```
### 3. 使用 Docker 直接运行
```bash
docker run -d \
-p 80:80 \
-p 443:443 \
-p 2222:2222 \
-v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
-v caddy_data:/data \
-v caddy_config:/config \
-e ACME_AGREE=true \
--restart unless-stopped \
--name caddy_l4 \
caddy-l4:local
```
## 配置
### Caddyfile 示例
#### HTTPS 反向代理(应用层)
```caddyfile
git.example.com {
reverse_proxy 10.8.0.15:3000
}
```
Caddy 会自动:
- 申请 Let's Encrypt 证书
- 监听 443 (HTTPS)
- 将 HTTP 流量重定向到 HTTPS
- 反代请求到 10.8.0.15:3000
#### TCP 四层转发(Layer 4
```caddyfile
{
layer4 {
:2222 {
route {
proxy 127.0.0.1:22
}
}
}
}
```
监听 2222 端口,直接转发 TCP 流量到本地 22 端口(SSH)
### 环境变量
- `ACME_AGREE=true`:同意 Let's Encrypt 服务条款,启用自动 HTTPS
### 持久化存储
- `caddy_data:/data`:存储 ACME 证书和其他数据
- `caddy_config:/config`:存储 Caddy 运行时配置
## 常见命令
### 查看容器日志
```bash
docker compose logs -f caddy
```
### 重启服务
```bash
docker compose restart caddy
```
### 停止服务
```bash
docker compose down
```
### 验证 Caddyfile 语法
```bash
docker run --rm -v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" caddy-l4:local \
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
```
### 查看 Caddy 版本和模块
```bash
docker run --rm caddy-l4:local caddy version
```
## 网络配置
### Docker Compose 中的 host 网络模式
当前 `docker-compose.yml` 使用 `network_mode: host`,这意味着:
- 容器直接使用宿主机网络栈
- 无需进行 -p 端口映射
- 容器内 `127.0.0.1` 指向宿主机本地地址
- 适合需要访问宿主机服务的场景
如果使用桥接网络(默认),需要修改配置:
```yaml
ports:
- "80:80"
- "443:443"
- "2222:2222"
- "2019:2019"
```
## 云服务器部署
### 镜像推送到 Docker Hub
```bash
docker build -t yourusername/caddy-l4:latest .
docker push yourusername/caddy-l4:latest
```
### 服务器端拉取和运行
```bash
docker pull yourusername/caddy-l4:latest
docker compose up -d
```
### 重要提示
- **防火墙**:云服务器需要开放相应端口(80、443、2222 等)
- **域名 DNS**:HTTPS 反代的域名需要提前解析到云服务器 IP
- **证书申请**:首次启动会自动从 Let's Encrypt 申请证书,需要互联网连接和正确的 DNS 解析
## 故障排查
### 证书无法申请
- 检查域名 DNS 是否正确解析到服务器 IP:`ndig yourdomain.com`
- 检查 80 和 443 端口是否对外开放
- 查看日志:`docker compose logs caddy`
### 反代无法连接
- 确认目标服务地址是否正确(特别是 host 网络模式下的 localhost 问题)
- 使用 `docker exec caddy_l4 curl http://target:port` 在容器内测试连通性
### L4 转发无法工作
- 确认 TCP 转发目标服务已启动
- 测试:`telnet localhost 2222``ssh user@localhost -p 2222`
## 文件说明
- `Dockerfile`:基于 caddy:2.11.4 镜像,集成 caddy-l4 模块
- `docker-compose.yml`:一键启动配置
- `Caddyfile`:Caddy 配置文件(需自行编写或修改)
- `README.md`:本文件
## 许可
Caddy 采用 Apache 2.0 许可,详见 [Caddy 官方文档](https://caddyserver.com)
## 参考资源
- [Caddy 官方文档](https://caddyserver.com/docs/)
- [caddy-l4 模块](https://github.com/mholt/caddy-l4)