
飞牛安全访问与 Lucky 反代雷池防护
1 序言
1.1 为什么要安全防护?
众所周知,飞牛 OS 近期公开过安全风险,公开服务暴露在互联网上会增加被自动化扫描和异常请求利用的概率。本文记录一套临时加固方案,重点减少系统暴露面。
1.2 安全防护建议
-
关闭飞牛 FN Connect,也就是关闭飞牛自带的内网穿透
-
关闭飞牛 SSH 和修改默认 22 端口
-
推荐优先使用内网穿透访问飞牛,比如 Tailscale、星空组网等
-
次推荐使用公网访问飞牛
- 使用反向代理并避免公开宣传访问域名,可以明显减少被自动化扫描的概率
- 使用Lucky反代时候 web 增加一个账号密码验证,那么相当于在飞牛外面加上一道锁。
- 如果需要更好的防护就再加上一道锁雷池 WAF
-
如果增加 web 账号密码验证,那么飞牛 APP 不能使用,毕竟 APP 不能弹出这个账号密码验证,网页端是正常的。
-
反代时候增加 IP 白名单,我觉得没有必要,若想加也是可以的。
1.3 防护思路
-
雷池 WAF (Safeline):作为反向代理的下一跳,过滤异常请求,在官方修复发布前降低风险。
-
Lucky 反代 + Basic Auth:在入口处增加一层基础认证,把未授权请求直接拒绝。
-
架构思路: 外网请求 -> Lucky (SSL卸载+基础认证) -> 雷池 WAF (过滤异常请求) -> 飞牛 OS (业务)
2 准备工作
- 硬件:已安装飞牛 OS 的 NAS(或同局域网下的其他机器)。
- 软件:
- Docker 环境(飞牛自带)。
- Lucky:用于端口转发、SSL 证书管理和第一道认证。
- 雷池 (Safeline):用于 WAF 防护(只有 x86 免费)。
3 雷池 WAF
3.1 安装雷池 WAF
我这里采用 docker 安装雷池 WAF,以下是 docker-compose.yaml文件
# 官方文档# https://docs.waf-ce.chaitin.cn/# web 访问 https://IP:29443# 账号 admin 密码在 safeline-mgt 日志# 重置密码 docker exec safeline-mgt resetadmin
# ---
name: safeline# 最后编辑时间:2026-02-03services: # ----------------------- # 1. 数据库 # ----------------------- postgres: container_name: safeline-pg restart: always image: chaitin/safeline-postgres:15.2 volumes: - /mnt/docker/apps/safeline/resources/postgres/data:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro environment: - POSTGRES_USER=safeline-ce - POSTGRES_PASSWORD=safeline-pwd-change-me networks: - safeline-ce command: [postgres, -c, max_connections=600] healthcheck: test: pg_isready -U safeline-ce -d safeline-ce
# ----------------------- # 2. 管理后台 # ----------------------- mgt: container_name: safeline-mgt restart: always image: chaitin/safeline-mgt:latest volumes: - /etc/localtime:/etc/localtime:ro - /mnt/docker/apps/safeline/resources/mgt:/app/data - /mnt/docker/apps/safeline/logs/nginx:/app/log/nginx:z - /mnt/docker/apps/safeline/resources/sock:/app/sock - /var/run:/app/run ports: - 29443:1443 healthcheck: test: curl -k -f https://localhost:1443/api/open/health environment: - MGT_PG=postgres://safeline-ce:safeline-pwd-change-me@safeline-pg/safeline-ce?sslmode=disable depends_on: - postgres - fvm logging: driver: "json-file" options: max-size: "100m" max-file: "5" networks: - safeline-ce
# ----------------------- # 3. 检测引擎 # ----------------------- detect: container_name: safeline-detector restart: always image: chaitin/safeline-detector:latest volumes: - /mnt/docker/apps/safeline/resources/detector:/resources/detector - /mnt/docker/apps/safeline/logs/detector:/logs/detector - /etc/localtime:/etc/localtime:ro environment: - LOG_DIR=/logs/detector networks: - safeline-ce
# ----------------------- # 4. 流量转发 (Tengine) # ----------------------- tengine: container_name: safeline-tengine restart: always image: chaitin/safeline-tengine:latest volumes: - /etc/localtime:/etc/localtime:ro - /etc/resolv.conf:/etc/resolv.conf:ro - /mnt/docker/apps/safeline/resources/nginx:/etc/nginx - /mnt/docker/apps/safeline/resources/detector:/resources/detector - /mnt/docker/apps/safeline/resources/chaos:/resources/chaos - /mnt/docker/apps/safeline/logs/nginx:/var/log/nginx:z - /mnt/docker/apps/safeline/resources/cache:/usr/local/nginx/cache - /mnt/docker/apps/safeline/resources/sock:/app/sock environment: - TCD_MGT_API=https://safeline-mgt:1443/api/open/publish/server - TCD_SNSERVER=safeline-detector:8000 - CHAOS_ADDR=safeline-chaos ulimits: nofile: 131072 ports: - 29080:80 - 28443:443 networks: - safeline-ce
# ----------------------- # 5. 任务调度 # ----------------------- luigi: container_name: safeline-luigi restart: always image: chaitin/safeline-luigi:latest environment: - MGT_IP=safeline-mgt - LUIGI_PG=postgres://safeline-ce:safeline-pwd-change-me@safeline-pg/safeline-ce?sslmode=disable volumes: - /etc/localtime:/etc/localtime:ro - /mnt/docker/apps/safeline/resources/luigi:/app/data logging: driver: "json-file" options: max-size: "100m" max-file: "5" depends_on: - detect - mgt networks: - safeline-ce
# ----------------------- # 6. 威胁情报 # ----------------------- fvm: container_name: safeline-fvm restart: always image: chaitin/safeline-fvm:latest volumes: - /etc/localtime:/etc/localtime:ro logging: driver: "json-file" options: max-size: "100m" max-file: "5" networks: - safeline-ce
# ----------------------- # 7. 混沌测试 # ----------------------- chaos: container_name: safeline-chaos restart: always image: chaitin/safeline-chaos:latest logging: driver: "json-file" options: max-size: "100m" max-file: "10" environment: - DB_ADDR=postgres://safeline-ce:safeline-pwd-change-me@safeline-pg/safeline-ce?sslmode=disable volumes: - /mnt/docker/apps/safeline/resources/sock:/app/sock - /mnt/docker/apps/safeline/resources/chaos:/app/chaos networks: - safeline-ce
# 网络配置networks: safeline-ce: driver: bridge3.2 配置雷池 WAF
雷池不需要处理复杂的 HTTPS 证书,我们把它当做一个纯粹的 HTTP 过滤器。
-
登录雷池后台
http://192.168.x.x:29443,点击 【防护应用】 -> 【添加站点】。 -
配置关键点:
-
- 域名:填写你的公网域名(如
fnnas.example.com)
- 域名:填写你的公网域名(如
-
- 端口:填写
80(HTTP),把 443 那个关掉不然需要证书。注意:这里不要开启 SSL,证书交给 Lucky 管。
- 端口:填写
-
- 上游服务器:填写飞牛 NAS 的真实内网 IP + 端口(如
http://192.168.x.x:5666)。
- 上游服务器:填写飞牛 NAS 的真实内网 IP + 端口(如
-
提交保存。
此时,雷池已经准备好接收流量并转发给飞牛了。

进入站点详情 -> 【高级配置】:
- 获取客户端 IP 方式:选择 “从 HTTP Header 获取”。
- HTTP Header:填入
X-Forwarded-For。

验证方法:用手机流量访问一次 NAS,去雷池【防护日志】看一眼,如果源 IP 显示的是公网 IP,说明透传成功!
4 Lucky 反向代理
4.1 安装 Lucky
略,因为我前面文章详细说过了。
4.2 配置 Lucky 反向代理
这个我也详细说过了,关键接入雷池 WAF,我着重说一下。Lucky 是流量的入口,它负责把外网的 HTTPS 流量“剥皮”成 HTTP,然后扔给雷池。
-
在 Lucky 中添加一个子规则。
-
前端地址:填写你的反代域名(如
fnnas.example.com)。 -
后端设置 (关键):
-
- 后端地址:指向 雷池的 IP 和端口(如
http://192.168.x.x:29080),千万不要直接指飞牛。
- 后端地址:指向 雷池的 IP 和端口(如
-
SSL 证书:在 Lucky 里配置好你的 HTTPS 证书。
-
安全设置 -> 基本认证 -> 网页认证 -> 认证信息设置 ->
admin:admin123 -
账号:密码的格式,请注意中间有一个英文的冒号

5 效果验收与取舍
5.1 安全性验证
- 异常请求测试:访问一个不存在的敏感路径。
- 结果:首先需要在输入账号密码验证,雷池直接拦截并返回 403 Forbidden。
- 认证测试:在浏览器输入错误的 Basic Auth 密码。
- 结果:直接返回 401 Unauthorized,请求不会到达飞牛服务。
5.2 带来的副作用
- 手机 APP 无法使用:飞牛的手机 APP 无法处理 Basic Auth 弹窗,所以开启此功能后,手机 APP 将无法连接。
- 解决方案:
- 日常使用:电脑端网页访问(安全无忧)。
- 手机端:建议配合 Tailscale / WireGuard 等,走内网 IP 访问,不经过 Lucky 和雷池。
5.3 展示结果图
这是内网 oec-t 飞牛系统的相关截图

这是雷池 WAF 防护到了的图

这是 Lucky Auth 验证的图

6 总结
通过 Lucky (入口+认证) -> 雷池 (清洗) -> 飞牛 (业务) 的三层架构,我们实现了:
-
HTTPS 自动续期(Lucky 负责)。
-
WAF 虚拟补丁(拦截 SQL 注入、路径遍历等异常请求)。
-
真实 IP 限制(解决了反代 IP 丢失问题)。
- 强制身份锁(Basic Auth 隔离)。
在官方修复发布前,这套方案可以减少 NAS 服务的公开暴露面,并增加认证与请求过滤两层防护。安全配置需要持续复查,不能只依赖一次性设置。
Created with ❤️ by 张萌萌
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 267 天
部分内容可能已过时
评论