通过 Nginx 二次转发解决 SafeLine(雷池)免费版限制最多 10 个应用的问题

意外富翁 · 2小时前 · 技术 · 14 · 0

在开始之前需要说明:SafeLine WAF 本身是一个成熟的安全产品,很多能力是需要长期投入维护的。本文的方案更多是从架构设计角度出发,适用于学习、实验或特定约束场景,不建议作为对抗产品策略的通用手段。本质上是从架构层面提升系统扩展能力,而非鼓励规避产品限制。对于核心生产系统,仍建议使用 SafeLine WAF 官方授权版本,以确保安全能力、稳定性以及后续技术支持。


背景

长亭雷池(SafeLine)是一款优秀的语义分析 WAF,但其社区版/个人版通常有 10 个防护站点的数量限制。对于拥有几十个自建服务的开发者或 NAS 玩家来说,直接在雷池中逐个添加站点通常额度不够。

采用“二次转发(WAF 网关模式)”架构可以解决以下痛点:

  1. 突破限制:雷池仅需占用 1 个额度(配置泛域名),后端即可支持无限个子站点。
  2. 简化证书管理:在雷池统一配置一张泛域名 SSL 证书,后端业务全部走内部 HTTP,无需重复配置证书。
  3. 架构解耦:雷池专注于“安全清洗”,Nginx 专注于“业务路由”,互不干扰。
  4. 零停机运维:增加新站点只需秒级热加载 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)需要上线时:

  1. 新建配置:在 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;
        }
    }
    
  2. 热加载生效(无需重启容器,业务不中断):
    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 自动切割压缩。

  1. 创建任务sudo vi /etc/logrotate.d/nginx-gateway
  2. 写入配置
    /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 侧的最后配置

  1. 登录雷池后台 -> 防护站点 -> 添加站点
  2. 域名:填写泛域名 *.yourdomain.com(仅占用 1 个额度)。
  3. 端口:勾选 80443(配置好泛域名 SSL 证书)。
  4. 上游服务器:填写 http://172.17.0.1:5000

至此,你已成功搭建了一套既拥有雷池专业级安全防护,又拥有 Nginx 灵活路由能力的“无限站点”架构!

已复制到剪贴板

评论 0 条

暂无评论,来种下第一颗种子。