前言:在如今网络攻击日益频繁的背景下,家庭网络安全同样不容忽视。端口扫描、暴力破解、CC攻击等威胁无处不在。本文将手把手教你如何利用 ImmortalWrt (OpenWrt) 路由器作为第一道防线,配合运行在 飞牛NAS (FnOS) 上的 CrowdSec 智能分析引擎,构建一套低成本、高效率的自动化防御体系。当 CrowdSec 检测到恶意行为时,会自动通知路由器防火墙拉黑攻击者 IP,让你的家庭网络固若金汤。
此教程适用于有公网IP地址,并且NAS处于路由器之后,中间无再次NAT转发的。
对于使用 FN Connect 或其他代理的,不建议使用这种方式,如果能够获取代理的IP地址信息,建议通过白名单方式,仅允许“受信任的代理”进行访问。
1. 架构原理解析
本方案采用 "远端大脑 + 边缘执行" 的分布式架构:
- 🧠 大脑 (CrowdSec Agent):运行在飞牛NAS的Docker容器中。负责收集日志(可来自NAS自身、Docker容器或远程发送),利用行为分析引擎识别攻击模式(如SSH爆破、Web扫描),并生成封禁决策。
- 🛡️ 盾牌 (Firewall Bouncer):运行在ImmortalWrt路由器上。它是一个轻量级插件,定期向NAS上的CrowdSec询问“有哪些IP需要封禁?”,并根据返回的列表调用路由器的防火墙(iptables/nftables)进行实时拦截。
- 🔄 协同机制:路由器不消耗资源进行复杂的日志分析,只负责执行封禁指令;NAS承担计算任务,利用其更强的性能分析处理威胁信息。
2. 环境准备
- 路由器:刷入了 ImmortalWrt (推荐版本 24.10 或更新) 的设备。确保已开启 SSH 并可访问 LuCI 管理界面。
- NAS:一台运行 飞牛OS (FnOS) 的NAS设备,已安装 Docker 并配置好网络。
- 网络要求:路由器与NAS在同一局域网内,IP地址固定(建议为NAS和路由器LAN口设置静态IP,或通过DHCP设置分配固定IP,避免IP变动后crowdsec-firewall-bouncer调用失败)。
- 假设 NAS IP:
192.168.1.100
- 假设 路由器LAN IP:
192.168.1.1
3. 飞牛NAS部署CrowdSec核心服务
我们将使用 Docker Compose 在飞牛NAS上部署 CrowdSec。
3.1 创建配置文件
在飞牛NAS的文件管理器中,创建一个文件夹,例如 /docker/crowdsec。在该目录下创建 docker-compose.yml 文件:
我用的路径是[/vol1/1000/docker/crowdsec],请根据你的实际路径修改。
services:
crowdsec:
# 注意,版本建议选最新的
image: crowdsecurity/crowdsec:v1.7.6-debian
restart: always
container_name: crowdsec
network_mode: host
environment:
TZ: "Asia/Shanghai"
COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx crowdsecurity/sshd crowdsecurity/smb"
LOCAL_API_URL: "http://0.0.0.0:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /run/log/journal:/run/log/journal:ro
- /var/log/samba/:/var/log/samba/:ro
- /usr/trim/nginx/logs/:/var/log/nginx/:ro
# 注意,这里改你自己的实际路径
- /vol1/1000/docker/crowdsec/config:/etc/crowdsec/
# 注意,这里改你自己的实际路径
- /vol1/1000/docker/crowdsec/data:/var/lib/crowdsec/data/
💡 提示:network_mode: "host" 非常重要,否则 CrowdSec 获取到的将是网关IP而非真实攻击者IP。
3.2 启动服务
- 登录飞牛NAS Docker管理界面。
- 进入 Compose 选项卡,点击 新增项目。
- 选择刚才创建的
docker-compose.yml 文件路径,点击部署。
- 等待容器启动,日志显示
CrowdSec API ready 即表示成功。
先启动一下CrowdSec,等成功正常启动起来生成默认配置后,再做配置修改。
先启动一下CrowdSec,等成功正常启动起来生成默认配置后,再做配置修改。
先启动一下CrowdSec,等成功正常启动起来生成默认配置后,再做配置修改。
3.3 添加日志分析配置
我用的路径是[/vol1/1000/docker/crowdsec],请根据你的实际路径修改。
以下3份配置,是飞牛常用的日志分析,建议添加好。
这是/usr/trim/nginx/logs/的映射地址,是飞牛的nginx入口的日志,包含了飞牛官方的应用。
cat << EOF > /vol1/1000/docker/crowdsec/config/acquis.d/nas_nginx.yaml
filenames:
- /var/log/nginx/*.log
labels:
type: nginx
EOF
这是飞牛sshd的日志
cat << EOF > /vol1/1000/docker/crowdsec/config/acquis.d/nas_sshd.yaml
source: journalctl
journalctl_filter:
- SYSLOG_IDENTIFIER=sshd
labels:
type: syslog
EOF
这是飞牛samba共享服务的日志
cat << EOF > /vol1/1000/docker/crowdsec/config/acquis.d/nas_smb.yaml
filenames:
- /var/log/samba/log.*
labels:
type: smb
EOF
其他的日志请参考CrowdSec的文档,通过挂载日志文件或syslog方式接入,并于docker安装好对应类型的日志分析模版。
更多官方日志分析模板请参阅:https://app.crowdsec.net/hub
3.4 添加告警通知
添加通知模板
我这里用的Server酱3,其他通知类型请参考notifications目录的官方demo,或参考官方文档。
其中url的UID和sendkey需要填写为你自己的。
cat << EOF > /vol1/1000/docker/crowdsec/config/notifications/sc3.yaml
type: http
name: sc3
log_level: info
method: POST
url: "https://UID.push.ft07.com/send/sendKey.send"
headers:
Content-Type: "application/json; charset=utf-8"
format: |
{
"title": "【CrowdSec】封禁警报(共{{len .}}条)",
"desp": "
{{- range . -}}
{{- $decisions_len := len .Decisions -}}
{{- range $index, $element := .Decisions -}}
- IP地址: {{$element.Value}}\n\n- 封禁时长: {{$element.Duration}}\n\n- 封禁原因: {{$element.Scenario}}\n\n---
{{- end -}}
{{- end -}}
"
}
EOF
启用通知
主要是做如下添加,其他我保持的默认,如果你有需要请参考官方文档调整。
notifications:
- sc3
我的文件是在 /vol1/1000/docker/crowdsec/config/profiles.yaml,其中有两块默认配置,原有是注释掉的,去掉注释添加**添加的告警模版名称就可以。
3.4 获取 API Key
我们需要生成一个 API Key 供路由器连接。进入容器终端执行命令:
这里我用命令,你们也可以选择也web控制台选则终端进入
docker exec -it crowdsec bash
添加一个新的 bouncer (名字自定义,例如 openwrt-bouncer)
cscli bouncers add openwrt-bouncer
输出结果中会包含一行 API key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,请复制这个 Key,后续配置路由器要用。
4. ImmortalWrt安装配置防火墙组件
ImmortalWrt 的软件源通常比官方 OpenWrt 更丰富,可能直接包含 CrowdSec 相关插件。如果软件中心没有,可能需要手动上传 .ipk 包或通过 SSH 安装。
方案 A:通过 LuCI 软件中心安装 (推荐)
- 登录路由器 LuCI 界面 (
http://192.168.1.1)。
- 进入 系统 -> 软件包。
- 点击 更新列表。
- 搜索
crowdsec-firewall-bouncer 或 luci-app-crowdsec。
- 如果有
luci-app-crowdsec-firewall-bouncer,直接安装。
方案 B:手动安装 (如果源里没有)
如果软件源找不到,你需要去 ImmortalWrt (openWrt)的固件编译仓库或 GitHub Release 下载对应的 .ipk 文件(注意架构,如 x86_64, aarch64, mipsel 等),然后手动安装。
安装 BanIP (可选增强)
banip 是 OpenWrt 强大的封禁工具,支持自动更新黑名单。虽然 CrowdSec Bouncer 可以拉黑IP,不过结合 banip 可以拉黑更多,通过banip的策略预先拉黑掉风险IP,再配合CrowdSec Bouncer拉黑恶意IP,两套组合拳极大保护你的NAS服务。
opkg update
opkg install banip luci-app-banip luci-i18n-banip-zh-cn
banIP推荐除了默认带的黑名单源,再加上中科大的黑名单地址
https://blackip.ustc.edu.cn/list.php?txt
这个也没啥好说的,触发接口选则WAN口,然后选择要启用的黑名单源就可以,要用哪些源都可以问问豆包。
5. 联动配置:路由器对接CrowdSec API
这是最关键的一步,让路由器知道去哪里获取封禁名单。
5.1 配置 Firewall Bouncer
SSH 登录路由器,编辑 Bouncer 配置文件。通常位于 /etc/config/crowdsec
当然,你也可以选择web界面中配置,位于 [网络]-->[防火墙]-->[CrowdSec Bouncer]
api_url(本地API的URL)为docker启动的crowdsec服务地址,IP为你的NAS服务器IP地址,默认为8080端口。
api_key(API 密钥)填写为 3.4 中生成的API Key
vim /etc/config/crowdsec
config bouncer
option enabled '1'
option ipv4 '1'
option ipv6 '1'
option api_url 'http://192.168.1.100:8080/'
option update_frequency '10s'
option deny_action 'drop'
option deny_log '0'
option log_prefix 'crowdsec: '
option log_level 'info'
option filter_input '1'
option filter_forward '1'
option api_key 'xxxxxxxx'
list interface 'pppoe-wan'
5.2 启动服务
配置完成后,启动 Bouncer 服务:
# 重启防火墙以确保规则链加载
/etc/init.d/firewall restart
# 启动 crowdsec-bouncer 服务
/etc/init.d/crowdsec-firewall-bouncer enable
/etc/init.d/crowdsec-firewall-bouncer start
查看状态和日志:
/etc/init.d/crowdsec-firewall-bouncer status
logread | grep crowdsec
如果看到状态为 running 且无报错,说明连接成功。
当然,不能通过SSH连接的话,也可以通过web控制台 [系统]-->[启动项] 重启 firewall 和 crowdsec-firewall-bouncer
5.3 配置ImmortalWrt(openWrt)NAT规则转发真实IP
咱们的NAS都是在路由器后面挂着的,不可避免的需要NAT转发,但是转发后的源IP地址就会成网关的,那么就会导致crowdsec封不了正确的IP地址,于是我们需要配置NAT规则,防止路由器转发时重写IP地址。禁用 SNAT 后,内网设备将暴露于外网直连风险中,请确保防火墙其他规则足够严格(例如只开放必要端口)。
[防火墙]-->[NAT规则]
IP地址为你的NAS服务器IP地址

你也可以通过ssh连接后,于/etc/config/firewall添加如下配置。IP地址为你的NAS服务器IP地址
config nat
option name 'FnOS'
option src 'wan'
option dest_ip '192.168.1.100'
option target 'ACCEPT'
list proto 'all'
6. 策略优化与测试验证
6.1 配置 CrowdSec 场景 (Scenarios)
在飞牛NAS的 CrowdSec 配置目录 (/docker/crowdsec/config) 下,你可以启用或调整检测场景。默认已启用 SSH 爆破和 HTTP 常见攻击检测。
如果你想测试,可以手动模拟攻击:
-
SSH 测试:找另一台设备,尝试多次密码错误 SSH 连接路由器或 NAS。
-
Web 测试:使用工具对 NAS 的 Web 服务进行高频扫描。
-
手动添加拉黑ip地址
# cscli decisions add -i <IP地址或网段> -d <持续时间> --reason "封禁原因"
docker exec -it crowdsec cscli decisions add -i 123.123.123.123 -d 1h --reason "test"
6.2 验证封禁效果
-
查看 CrowdSec 决策:
在 NAS 上执行:
docker exec -it crowdsec cscli decisions list
-
你应该能看到被标记为 ban 的 IP 地址。
-
查看路由器防火墙规则:
SSH 登录路由器,执行:
nft list set crowdsec crowdsec-blacklists
如果告警通知配置的没问题的话,你同时还能收到通知信息。
🎉 结语
通过以上步骤,你已经成功搭建了一套企业级的家庭网络安全防御系统。飞牛NAS 充当了聪明的安全分析师,而 ImmortalWrt 则是忠诚的守卫。这套组合不仅能自动抵御常见的网络扫描和暴力破解,还能随着 CrowdSec 社区的**更新,不断进化防御能力。
下一步建议:
- 将家中其他重要设备(如摄像头、智能家居网关)的日志也接入 CrowdSec。
- 定期更新 ImmortalWrt 固件和 CrowdSec 规则库。
享受安全的网络生活吧!🚀