收起左侧

打造家庭网络安全堡垒:ImmortalWrt + CrowdSec + 飞牛NAS 联动自动封禁恶意IP实战指

0
回复
103
查看
[ 复制链接 ]

1

主题

25

回帖

0

牛值

江湖小虾

前言:在如今网络攻击日益频繁的背景下,家庭网络安全同样不容忽视。端口扫描、暴力破解、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 启动服务

  1. 登录飞牛NAS Docker管理界面。
  2. 进入 Compose 选项卡,点击 新增项目
  3. 选择刚才创建的 docker-compose.yml 文件路径,点击部署。
  4. 等待容器启动,日志显示 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 软件中心安装 (推荐)

  1. 登录路由器 LuCI 界面 (http://192.168.1.1)。
  2. 进入 系统 -> 软件包
  3. 点击 更新列表
  4. 搜索 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地址

image.png

你也可以通过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 常见攻击检测。

如果你想测试,可以手动模拟攻击:

  1. SSH 测试:找另一台设备,尝试多次密码错误 SSH 连接路由器或 NAS。

  2. Web 测试:使用工具对 NAS 的 Web 服务进行高频扫描。

  3. 手动添加拉黑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 验证封禁效果

  1. 查看 CrowdSec 决策
    在 NAS 上执行:

    docker exec -it crowdsec cscli decisions list
    
  2. 你应该能看到被标记为 ban 的 IP 地址。

  3. 查看路由器防火墙规则
    SSH 登录路由器,执行:

    nft list set crowdsec crowdsec-blacklists
    

如果告警通知配置的没问题的话,你同时还能收到通知信息。

🎉 结语

通过以上步骤,你已经成功搭建了一套企业级的家庭网络安全防御系统。飞牛NAS 充当了聪明的安全分析师,而 ImmortalWrt 则是忠诚的守卫。这套组合不仅能自动抵御常见的网络扫描和暴力破解,还能随着 CrowdSec 社区的**更新,不断进化防御能力。

下一步建议

  • 将家中其他重要设备(如摄像头、智能家居网关)的日志也接入 CrowdSec。
  • 定期更新 ImmortalWrt 固件和 CrowdSec 规则库。

享受安全的网络生活吧!🚀

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则