在飞牛 FnOS 上部署雷池 SafeLine WAF:给自建网站加一道"语义级"防火墙

关键词:雷池 WAF、SafeLine、飞牛 FnOS、Docker、反向代理、语义分析、Web 应用防火墙

很多人在飞牛(FnOS)、群晖或者其他 NAS 上自建了博客、面板、小工具,并通过路由器端口映射或内网穿透把服务暴露到公网。一旦暴露,SQL 注入、XSS、路径遍历、爆破、CC 攻击就会找上门来。

本文以 飞牛 FnOS + Docker 为例,手把手教你部署开源免费的 雷池 SafeLine WAF(社区版),把它作为反向代理挡在你的真实站点前面,用"语义分析"而非传统规则库来拦截 Web 攻击。文中命令与配置均可直接复用,只需把示例 IP / 端口替换成你自己的即可。


目录

  1. 为什么要在 NAS 上放一个 WAF
  2. 雷池 SafeLine 是什么
  3. 适用场景与前置条件
  4. 安装部署(一键脚本 / 手动 compose)
  5. 核心配置:接入你的网站
  6. 把外部流量导到雷池(三种接入方式)
  7. HTTPS 与证书
  8. 进阶防护能力
  9. 验证防护效果
  10. 日常运维(状态 / 升级 / 备份 / 日志)
  11. 常见问题与排查
  12. 安全与性能建议
  13. 结语

一、为什么要在 NAS 上放一个 WAF

把服务暴露到公网后,你面对的不是"有没有人攻击",而是"什么时候被盯上"。常见的风险:

  • Web 应用漏洞:SQL 注入、命令注入、路径遍历、反序列化……即使你用的是成熟程序,版本一旧就有洞。
  • 资源被刷:CC 攻击、爬虫滥用、接口被恶意高频调用。
  • 账户爆破:后台登录、API 鉴权接口被暴力破解。

传统的"改端口、关公网"只是降低暴露面,并不能解决应用层攻击。一个位于 站点与公网之间 的 WAF,能在请求真正到达你的程序之前就完成检测与拦截。


二、雷池 SafeLine 是什么

雷池 SafeLine 是长亭科技开源的社区版 Web 应用防火墙,核心特点:

  • 基于语义分析的检测引擎:不是靠正则规则库堆砌,而是"理解" HTTP 请求的真实语义。对 0day 类攻击有更好的泛化能力,误报率也更低。
  • 反向代理架构:部署在源站前面,客户端先经过雷池,再由雷池转发给真实服务。
  • 开箱即用:Web 控制台配置,默认策略即可挡住绝大多数常见攻击;无需像 ModSecurity 那样手写大量规则。
  • 容器化、易部署:官方提供一键脚本与 docker-compose,对 NAS / 树莓派 / 云主机都友好。

官方公布的能力数据(社区版):

指标 数值
累计装机量 超过 30 万台
日均处理请求 约 300 亿次
检出率(Strict 模式) 76.17%
误报率(Strict 模式) 0.22%

说明:不同测试集下数值会有差异,这里仅作能力参考。语义分析的核心优势在于"低误报 + 抗绕过",对业务型站点尤其友好。


三、适用场景与前置条件

3.1 适用场景

  • 在 NAS / 家用服务器上跑了 Web 服务,并对外提供访问。
  • 使用路由器端口映射、FRP、Lucky STUN、IPv6 等方式把内网服务暴露到公网。
  • 希望在不改造现有代码的前提下,给网站加一层应用层防护。

3.2 硬件 / 环境要求

项目 最低 推荐
CPU 1 核 2 核及以上
内存 1 GB 2 GB 及以上
系统 支持 Docker 的 Linux(FnOS / Debian / Ubuntu 等) 同左
Docker Docker Engine + Compose 插件 同左
磁盘 安装目录预留 2 GB+ 同左

飞牛 FnOS 在"应用中心"直接安装 Docker 即可,后续命令均在 NAS 的终端(SSH 或 FnOS 自带终端) 中执行。

3.3 端口规划(重要)

雷池会占用两类端口:

  • 管理控制台端口:固定 9443(Web UI,仅运维访问)。
  • 站点监听端口:你在控制台添加站点时自定义,由雷池的反向代理直接绑定宿主机(见下文 host 网络说明)。

为了避免和已有服务冲突,先梳理你的端口占用。一个常见示例:

用途 端口 说明
雷池管理控制台 9443 默认,勿改冲突
雷池站点监听(WAF 入口) 80 / 4439000 见 5.3 说明
你的真实网站(源站) 8080 示例上游地址

建议:如果 NAS 上 80/443 空闲,WAF 直接监听 80/443 最省事(对外无需带端口);若已被其他反向代理占用,则给 WAF 选一个空闲端口(如 9000),并在外层转发时指向它。


四、安装部署

4.1 进入 NAS 终端

方式 A:SSH(推荐)

在飞牛后台「系统设置 → 远程访问」开启 SSH,然后从你的电脑连接:

ssh 你的飞牛账号@192.168.1.100     # 将 192.168.1.100 换成你 NAS 的局域网 IP

方式 B:FnOS 自带终端

部分 FnOS 版本在 Web 后台提供"终端"入口,打开即用,无需 SSH 客户端。

进入后先确认 Docker 就绪:

docker --version
docker compose version        # 若没有 compose 插件,用 docker-compose --version

只要其中一条返回版本号即可继续;若都缺失,请先在飞牛"应用中心"安装 Docker。

4.2 一键脚本安装(推荐)

官方一键脚本会自动拉取镜像、生成 docker-compose.yaml 并启动容器:

bash -c "$(curl -fsSL https://waf-ce.chaitin.cn/release/latest/setup.sh)"

脚本会交互式询问:

  • 安装目录:建议填数据盘路径,例如 /vol1/safeline(飞牛数据盘通常为 /vol1)。持久化到数据盘更安全;直接回车会用默认 /data/safeline
  • 管理端口:直接回车使用默认 9443

安装完成后,控制台地址会打印在终端,形如 https://<NAS_IP>:9443

4.3 手动 docker-compose 安装(备选 / 离线)

如果你需要完全掌控配置,或处于离线环境,可手动编排。下面是结构与关键参数示意(镜像标签以官方发布为准,建议优先用 4.2 的一键脚本,以下仅帮助理解):

version: "3"
services:
  safeline-mgt:
    image: chaitin/safeline-mgt:latest
    container_name: safeline-mgt
    restart: unless-stopped
    ports:
      - "9443:1443"            # 管理控制台
    environment:
      - MGT_PORT=9443
      - SUBNET_PREFIX=172.22.222
    networks:
      safeline-ce:
        ipv4_address: 172.22.222.4

  safeline-pg:
    image: chaitin/safeline-pg:latest
    container_name: safeline-pg
    restart: unless-stopped
    networks:
      safeline-ce:
        ipv4_address: 172.22.222.2

  safeline-detector:
    image: chaitin/safeline-detector:latest
    container_name: safeline-detector
    restart: unless-stopped
    networks:
      safeline-ce:
        ipv4_address: 172.22.222.5

  safeline-tengine:
    image: chaitin/safeline-tengine:latest
    container_name: safeline-tengine
    restart: unless-stopped
    network_mode: "host"      # 关键:直接共享宿主机网络

networks:
  safeline-ce:
    driver: bridge
    ipam:
      config:
        - subnet: 172.22.222.0/24
          gateway: 172.22.222.1

要点:

  • safeline-tengine 使用 network_mode: host。这是雷池的关键设计——反向代理引擎直接绑定宿主机网络,因此你在控制台"添加站点"时填写的监听端口会直接占用宿主机对应端口,无需再做 Docker 端口映射。
  • 其余组件(mgt / pg / detector 等)通过内部 bridge 网络 safeline-ce 通信,外界不可直连。

4.4 访问控制台并初始化

浏览器打开 https://<NAS_IP>:9443,首次访问会提示"证书不安全"(自签证书),点"高级 → 继续访问"即可。首次登录强制设置管理员账号密码。


五、核心配置:接入你的网站

5.1 添加站点

控制台 → 站点管理 → 添加站点,填写:

字段 填写示例 说明
域名 blog.example.com 你的站点域名,多个域名逐个添加
上游服务器(源站) http://192.168.1.100:8080 真实 Web 服务的内网地址
监听端口 80(或 9000 雷池对外接收流量的端口
防护状态 先选「观察」 记录攻击但不拦截,验证后再切「拦截」

源站地址用局域网 IP(如 192.168.1.100),不要用 127.0.0.1:雷池的检测/转发组件在独立容器内,通过宿主机 LAN IP 才能稳定路由到本机服务。

5.2 验证链路是否接通

浏览器直接访问雷池监听地址,例如 http://192.168.1.100:9000,应能正常看到你的站点页面。能看到 = 链路已通(请求走了 雷池 → 源站);看不到 = 检查源站地址/端口,或查看控制台"防护日志"。

5.3 监听端口的选择

  • 选 80 / 443:对外访问最干净(无需带端口、可配合证书走 HTTPS)。前提是 NAS 上 80/443 未被占用。
  • 选自定义端口(如 9000):当 80/443 已被其他反向代理(Nginx / Caddy / 面板)占用时使用。此时公网入口应转发到 9000,由雷池在内部转发到源站 8080
  • 无论哪种,雷池都通过 host 网络直接绑定该端口,无需额外映射。

六、把外部流量导到雷池(三种接入方式)

雷池只负责"收到流量后检测并转发"。外部用户怎么到达雷池的监听端口,取决于你原来的暴露方式。下面给出三种常见场景。

场景 A:路由器 / 光猫端口映射

最普通的家庭宽带方案。在路由器后台做端口映射:

外部端口 80/443  →  192.168.1.100:80/443(雷池监听口)

如果是自定义端口(如 9000):

外部端口 9000  →  192.168.1.100:9000(雷池监听口)

原来的"外部端口 → 源站 8080"映射应改为指向雷池。

场景 B:内网穿透(FRP / Lucky STUN 等)

如果你用 FRP、Lucky 的 STUN 打洞等方式把内网服务暴露到公网,把穿透规则的**目标地址从"源站"改为"雷池监听口"**即可。

以"某内网穿透工具"为例,原规则:

公网 :9000  →  192.168.1.100:8080   # 源站(改之前)

改为:

公网 :9000  →  192.168.1.100:9000   # 雷池监听口(改之后)

流量路径变为:公网用户 → 穿透隧道 → 雷池(9000) → 源站(8080)。改完后记得让穿透规则重新握手/生效。

场景 C:已有反向代理(Nginx / 1Panel / Caddy)

如果你前面已经有一层反向代理,有两种接法:

  • 雷池在前:反向代理的目标改为雷池监听口(推荐,防护最完整)。
  • 雷池在后:反向代理继续对外,把需要防护的 location 反代到雷池监听口。

一般建议"雷池在前",让所有公网请求先过检测。


七、HTTPS 与证书

Web 服务建议全程 HTTPS。雷池支持自动申请 Let's Encrypt 证书,也可上传自有证书。

两种 TLS 终止位置:

  1. 在雷池终止 TLS(推荐):站点监听 443,在雷池里配置证书。客户端 →(HTTPS)→ 雷池(解密+检测) →(HTTP)→ 源站。检测最充分,因为雷池能看到完整明文请求。
  2. 前置代理终止 TLS:外层(如路由器/穿透工具)做 HTTPS,向内转发 HTTP 到雷池监听口。配置更简单,但雷池收到的是解密后的 HTTP,防护能力不受影响。

新手建议先用"前置终止 + 雷池收 HTTP"跑通,确认防护无误后,再到雷池站点里开启 HTTPS(监听 443 + 自动签发证书),把 TLS 收归雷池统一管。


八、进阶防护能力

基础部署只能挡常规注入/XSS。雷池还提供一系列进阶能力,建议按需开启:

  • 人机验证(Bot 防护):对可疑客户端弹验证码,拦住爬虫、扫描器和低级 bot。登录页、申请/提交类接口强烈建议开启。
  • CC 防护 / 频率限制:按 IP、URL、Header 等维度做访问频率限制,防刷、防应用层 DDoS。可配置"触发后返回 503 / 跳转等候室"。
  • 动态防护:对 HTML / JS 做每次访问动态加密,增加逆向与自动化攻击成本。
  • 身份认证:给站点或指定路径加基础认证(密码),未授权直接拦截。适合后台、管理面板上线前的临时防护。
  • 威胁情报 IP 拦截:对接长亭社区恶意 IP 情报,自动封禁已知攻击源。
  • 自定义规则:当内置策略不够时,可按条件(IP、路径、参数、Header)写放行/拦截规则。

实践建议:先用「观察」模式收集 1~2 天日志,确认无正常流量被误判,再逐步开启「拦截」与进阶能力,避免误伤真实用户。


九、验证防护效果

部署完成后,用攻击特征试探,确认雷池确实在拦截。

9.1 手动测试

通过浏览器或 curl 访问带注入特征的 URL:

# SQL 注入特征
curl "https://blog.example.com/?id=1' OR '1'='1"

# XSS 特征
curl "https://blog.example.com/?name=<script>alert(1)</script>"

正常应返回雷池的拦截页面(而非源站的正常响应)。同时到控制台「防护日志 / 统计」查看是否记录到这条拦截。

9.2 自动化测试(可选)

官方提供 BlazeHTTP 等工具可做批量攻击模拟与效果评估。新手用 9.1 的手动方式已足够验证。


十、日常运维

以下命令在 NAS 终端执行(假设安装目录为 /vol1/safeline)。

# 查看容器运行状态
docker ps | grep safeline

# 重启所有组件
cd /vol1/safeline && docker compose restart

# 升级到最新版本(在部署目录执行)
cd /vol1/safeline && docker compose pull && docker compose up -d

# 重置管理员密码(忘记后台密码时)
docker exec safeline-mgt /app/mgt-cli reset-admin --once

10.1 数据备份

雷池的配置与日志主要存放在 Postgres 中,数据落在安装目录内(如 /vol1/safeline 下的数据卷/子目录)。定期备份整个安装目录即可保留站点配置与策略;升级前建议先备份一次。

10.2 日志与监控

控制台提供「防护日志」「访问统计」「流量分析」等视图,可观察攻击类型、来源 IP、拦截趋势。建议初期每天看一眼,确认策略符合预期。


十一、常见问题与排查

Q1:能在 Windows 上部署吗? 可以,用 Docker Desktop 跑官方 compose 即可。但生产/长期运行更推荐 Linux / NAS 环境,资源占用与稳定性更好。

Q2:加了站点但访问不通? 按链路逐段排查:① 源站 192.168.1.100:8080 本身能否访问;② 雷池监听口能否直接访问(见 5.2);③ 外层端口映射/穿透是否指向了雷池监听口。

Q3:端口被占用,容器起不来?tengine 是 host 网络,会直接绑定你配置的监听端口。若该端口已被其他服务占用,换一个空闲端口(如 9000)即可。

Q4:会不会拖慢网站? 雷池采用线性检测算法,官方数据平均检测延迟 < 1ms,单核即可处理 2000+ TPS,对绝大多数个人/中小企业站点几乎无感。

Q5:能防 DDoS 吗? WAF 主要防应用层攻击。CC 防护 / 频率限制可缓解应用层 DDoS;网络层大流量攻击需要机房/运营商层面的防护。

Q6:多个域名 / 多个站点? 控制台可添加多个站点,每个站点独立配置上游、监听端口与防护策略。

Q7:忘记后台密码? 执行 10 节的 reset-admin 命令重置。


十二、安全与性能建议

  • 最小暴露面:管理控制台 9443 只对内网开放,不要直接映射到公网;如需远程管理,走 VPN / 内网穿透的受控通道。
  • 先观察后拦截:新站点务必从「观察」起步,确认无误再切「拦截」,降低误杀风险。
  • 分层防护:WAF 不是银弹。源站本身应及时升级、做好鉴权与输入校验,雷池作为"最后一道应用层防线"。
  • 资源预留:给 NAS 预留足够内存(≥2GB 更稳),避免容器因 OOM 被反复重启。
  • 定期升级:雷池更新频繁,包含检测引擎与漏洞修复,建议定期 docker compose pull && up -d

十三、结语

在家庭 NAS 或自建服务器上跑公网服务,WAF 不该是"可选项"而是"标配"。雷池 SafeLine 凭借语义分析引擎和开箱即用的体验,让非安全专业的用户也能在十几分钟内给网站加上一道可靠的应用层防护。

本文以飞牛 FnOS + Docker 为例,覆盖了从安装、接入、HTTPS、进阶能力到运维排查的完整链路。按步骤走完,你的站点就多了一层"不让黑客越雷池一步"的屏障。

本文基于雷池 WAF 社区版撰写,功能与界面可能随版本更新而变化,实际以官方文档与控制台为准。

(本文首发于个人博客,转载请注明出处。)