PassNAT LogoPassNAT

SafeLine 雷池 WAF:NAS 上 Docker 部署,给家里的服务加一层 Web 防护

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

SafeLine(中文名雷池)是长亭科技开源的 Web 应用防火墙。它站在你的网站或 NAS 服务前面,把进来的 HTTP 请求先过一遍:正常的放行,命中注入、XSS、命令注入、路径穿越等规则的直接拦下,并在控制台留下攻击日志。

它不是单个容器,而是一组服务一起跑:管理端负责控制台和配置,检测引擎做规则匹配,反向代理把请求转发给被保护的服务,另外还有数据库和几个辅助服务。下面这份编排把这些都写好了。

项目地址:点我跳转

部署安装

只要能跑 Docker 的 NAS 都能装,下面用飞牛 NAS 演示:先部署 SafeLine,再用 帕斯内网穿透 拿到一个公网地址,人在外面也能打开管理页。

一、新建 Compose 项目

打开飞牛的「Docker」应用,切到「Compose」标签,点右上角的新增项目。项目名称填 safeline,路径在「我的文件」下面挑一个空文件夹,来源选「创建 docker-compose.yml」,把下面这段整个贴进去:

1networks:
2 safeline-ce:
3 name: safeline-ce
4 driver: bridge
5
6services:
7 postgres:
8 image: chaitin/safeline-postgres:15.2
9 restart: always
10 environment:
11 POSTGRES_USER: safeline-ce
12 POSTGRES_PASSWORD: change-me-2026
13 volumes:
14 - ./data/postgres:/var/lib/postgresql/data
15 healthcheck:
16 test: pg_isready -U safeline-ce -d safeline-ce
17 networks:
18 safeline-ce:
19 aliases: [safeline-pg]
20
21 mgt:
22 image: chaitin/safeline-mgt:9.2.7
23 restart: always
24 ports:
25 - "9443:1443"
26 environment:
27 MGT_PG: postgres://safeline-ce:change-me-2026@safeline-pg/safeline-ce?sslmode=disable
28 volumes:
29 - ./data/mgt:/app/data
30 - ./logs/nginx:/app/log/nginx
31 - ./data/sock:/app/sock
32 - /var/run:/app/run
33 depends_on:
34 - postgres
35 - fvm
36 healthcheck:
37 test: curl -k -f https://localhost:1443/api/open/health
38 networks:
39 safeline-ce:
40 aliases: [safeline-mgt]
41
42 detector:
43 image: chaitin/safeline-detector:9.2.7
44 restart: always
45 environment:
46 LOG_DIR: /logs/detector
47 volumes:
48 - ./data/detector:/resources/detector
49 - ./logs/detector:/logs/detector
50 networks:
51 safeline-ce:
52 aliases: [safeline-detector]
53
54 tengine:
55 image: chaitin/safeline-tengine:9.2.7
56 restart: always
57 ports:
58 - "8080:80"
59 - "8443:443"
60 environment:
61 TCD_MGT_API: https://safeline-mgt:1443/api/open/publish/server
62 TCD_SNSERVER: safeline-detector:8000
63 SNSERVER_ADDR: safeline-detector:8000
64 CHAOS_ADDR: safeline-chaos
65 volumes:
66 - ./data/nginx:/etc/nginx
67 - ./data/detector:/resources/detector
68 - ./data/chaos:/resources/chaos
69 - ./logs/nginx:/var/log/nginx
70 - ./data/cache:/usr/local/nginx/cache
71 - ./data/sock:/app/sock
72 networks:
73 safeline-ce:
74 aliases: [safeline-tengine]
75
76 luigi:
77 image: chaitin/safeline-luigi:9.2.7
78 restart: always
79 environment:
80 MGT_IP: safeline-mgt
81 LUIGI_PG: postgres://safeline-ce:change-me-2026@safeline-pg/safeline-ce?sslmode=disable
82 volumes:
83 - ./data/luigi:/app/data
84 depends_on:
85 - detector
86 - mgt
87 networks:
88 safeline-ce:
89 aliases: [safeline-luigi]
90
91 fvm:
92 image: chaitin/safeline-fvm:9.2.7
93 restart: always
94 networks:
95 safeline-ce:
96 aliases: [safeline-fvm]
97
98 chaos:
99 image: chaitin/safeline-chaos:9.2.7
100 restart: always
101 environment:
102 DB_ADDR: postgres://safeline-ce:change-me-2026@safeline-pg/safeline-ce?sslmode=disable
103 volumes:
104 - ./data/sock:/app/sock
105 - ./data/chaos:/app/chaos
106 networks:
107 safeline-ce:
108 aliases: [safeline-chaos]

整段编排里只有几处需要留意:

数据库口令:把 change-me-2026 换成自己的口令,POSTGRES_PASSWORD、MGT_PG、LUIGI_PG、DB_ADDR 四处要一致。

管理端口 9443:控制台的入口。浏览器打开 https://NAS地址:9443,自签证书会提示不安全,继续访问就行。

反向代理端口:tengine 在容器里监听 80 和 443;NAS 自己的管理页面通常占着这两个端口,所以编排里发布成 8080 和 8443。被占用就换成空闲端口,后面添加应用时按这个端口访问。

勾上「创建项目后立即启动」。第一次起来以后,在安装目录的终端里执行 docker compose exec mgt /app/mgt-cli reset-admin --once,会生成管理员口令;用 admin 和新口令登录控制台。

二、用帕斯内网穿透拿公网地址

飞牛的「应用中心」里搜 PassNAT,装上这个穿透插件,打开它,点「创建隧道」。隧道名字随便起,本地地址留默认的 127.0.0.1,本地端口填 9443(就是控制台端口)。

建好之后点开这条隧道,按一下电源,状态变成运行中,详情里就能看到分配好的公网地址,先记下来。

不是飞牛的系统,PassNAT 文档的「连接使用」里有其他系统的连接教程:点我跳转。

三、添加要保护的应用

登录控制台,点「防护应用」→「添加应用」:

域名:填你访问这个服务用的域名;没有域名可以先填一个占位,比如 nas.local,访问时带上对应的 Host。

端口:SafeLine 上监听的端口,默认 80;要用 HTTPS 就在旁边配上证书。

上游服务器:填被保护服务的地址和端口,比如 http://你的服务:8080,不支持带路径。

防护模式先用默认,点提交。之后把访问入口换成 SafeLine 的地址(比如 http://NAS地址:8080),请求就先经过 WAF,再到你的服务。

四、看拦截结果

正常请求照常返回 200;带注入、XSS 等特征的请求会被直接拦下,返回 403。攻击日志里能看到时间、来源 IP、攻击类型和请求地址,统计报表里请求次数、拦截次数、拦截率都会跟着变。

注意: 测试时只对自己的测试站点发测试请求,不要对别人的站点发。

几点说明

数据在哪。 配置和日志在安装目录的 data 下:postgres 存配置和日志索引,mgt、detector、nginx 等各有自己的目录。备份整个安装目录就够。

管理页的证书。 默认是自签证书,公网访问时浏览器会提示不安全,继续即可;在意的话可以给管理页配自己的证书。

为什么改成端口映射。 官方编排为了让反向代理拿到真实客户端 IP,用的是 host 网络。这里为了不和 NAS 自己的 80/443 冲突,改成 bridge 加端口映射,家用够用;如果要上线到正式环境,按官方方式调整。

升级。 换镜像 tag 后重新拉取、重启项目即可;升级前先备份 data 目录。

资源。 检测引擎比较吃内存,NAS 内存小于 4GB 的话,先看一眼剩余内存再装。