201 lines
4.4 KiB
Markdown
201 lines
4.4 KiB
Markdown
# 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)
|