在开始之前需要说明:SafeLine WAF 本身是一个成熟的安全产品,很多能力是需要长期投入维护的。本文的方案更多是从架构设计角度出发,适用于学习、实验或特定约束场景,不建议作为对抗产品策略的通用手段。本质上是从架构层面提升系统扩展能力,而非鼓励规避产品限制。对于核心生产系统,仍建议使用 SafeLine WAF 官方授权版本,以确保安全能力、稳定性以及后续技术支持。
背景
长亭雷池(SafeLine)是一款优秀的语义分析 WAF,但其社区版/个人版通常有 10 个防护站点的数量限制。对于拥有几十个自建服务的开发者或 NAS 玩家来说,直接在雷池中逐个添加站点通常额度不够。
采用“二次转发(WAF 网关模式)”架构可以解决以下痛点:
- 突破限制:雷池仅需占用 1 个额度(配置泛域名),后端即可支持无限个子站点。
- 简化证书管理:在雷池统一配置一张泛域名 SSL 证书,后端业务全部走内部 HTTP,无需重复配置证书。
- 架构解耦:雷池专注于“安全清洗”,Nginx 专注于“业务路由”,互不干扰。
- 零停机运维:增加新站点只需秒级热加载 Nginx,无需重启服务或动雷池配置。
部署架构
访客请求 -> 雷池 WAF (80/443端口,安全过滤) -> Nginx 路由层 (内网 8080,业务分发) -> 具体应用容器/服务
准备工作:目录与网络
在服务器上创建存放 Nginx 配置的独立目录:
mkdir -p /data/nginx-gateway/conf.d
mkdir -p /data/nginx-gateway/logs
cd /data/nginx-gateway
确认雷池网络名称:
运行 docker network ls,通常雷池的网络名为 safeline-ce。我们将让 Nginx 加入这个网络,实现容器间通过名称通信。
编写 Nginx 核心配置
1. 主配置文件 nginx.conf
创建 /data/nginx-gateway/nginx.conf,重点在于获取雷池传递的访客真实 IP:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 信任来自雷池容器网段的 Header,还原真实访客 IP
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
# 包含所有子站点配置
include /etc/nginx/conf.d/*.conf;
}
2. Docker Compose 部署文件
创建 /data/nginx-gateway/docker-compose.yml。注意:此处加入了 Docker 日志大小限制,防止撑爆磁盘。
version: '3'
services:
nginx-router:
image: nginx:stable-alpine
container_name: nginx-router
restart: always
ports:
- "5000:80" # 把容器的 80 映射到宿主机的 5000
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf.d:/etc/nginx/conf.d:ro
- ./logs:/var/log/nginx
logging:
driver: "json-file"
options:
max-size: "10m" # 每个日志文件最大 10MB
max-file: "3" # 最多保留 3 个旧日志文件
networks:
- safeline-ce # 必须加入雷池的网络
networks:
safeline-ce:
external: true # 声明使用已存在的雷池网络
启动服务: docker compose up -d
后期:如何不影响运行增加站点?
当你有新业务(如 blog.example.com)需要上线时:
- 新建配置:在
conf.d/目录下创建一个blog.conf:server { listen 80; server_name blog.example.com; location / { proxy_pass http://172.17.0.1:8081; # 你的具体业务地址(172.17.0.1 是 Docker 宿主机的默认内部 IP) proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } - 热加载生效(无需重启容器,业务不中断):
docker exec nginx-router nginx -t # 检查语法 docker exec nginx-router nginx -s reload # 毫秒级重载配置
Nginx 日志管理(按需选择)
Nginx 的访问日志增长极快。您可以根据业务需求选择以下两种方案之一:
方案 A:极致省内存 —— 只保留错误日志
如果你认为雷池已经记录了详细的访问记录,不需要 Nginx 重复记录,可以直接关闭访问日志。
修改 conf.d/ 下的站点配置:
server {
listen 80;
server_name blog.example.com;
access_log off; # 关闭正常访问日志
error_log /var/log/nginx/error.log warn; # 仅保留错误日志
location / { ... }
}
方案 B:专业管理 —— 配置 logrotate 自动切割
如果你需要保留最近几天的 Nginx 日志用于审计,建议使用 Linux 自带的 logrotate 自动切割压缩。
- 创建任务:
sudo vi /etc/logrotate.d/nginx-gateway - 写入配置:
/data/nginx-gateway/logs/*.log { daily rotate 7 # 保留 7 天 missingok compress # 压缩旧日志 delaycompress notifempty create 0640 nginx nginx sharedscripts postrotate docker exec nginx-router nginx -s reopen # 通知 Nginx 重新打开新日志文件 endscript }
雷池 WAF 侧的最后配置
- 登录雷池后台 -> 防护站点 -> 添加站点。
- 域名:填写泛域名
*.yourdomain.com(仅占用 1 个额度)。 - 端口:勾选
80和443(配置好泛域名 SSL 证书)。 - 上游服务器:填写
http://172.17.0.1:5000。
至此,你已成功搭建了一套既拥有雷池专业级安全防护,又拥有 Nginx 灵活路由能力的“无限站点”架构!
评论 0 条
暂无评论,来种下第一颗种子。