nftables拦截日志需加prefix并通过rsyslog的imkmsg模块转发至远程服务器,服务端按IP和前缀分离存储并设权限与轮转,最后验证全链路有效性。

直接把 nftables 的拦截日志发到远程 rsyslog 服务器,是实现安全审计和事件溯源的关键一步。本地日志可能被攻击者清除,但只要远程日志服务独立、可信、权限可控,就能保留完整证据链。
nftables 日志规则要带明确前缀
nftables 本身不写磁盘,它只把日志发给内核的 netlink 接口,再由内核转给 rsyslog(通过 imkmsg 模块)。所以必须用 log 语句加 prefix,否则日志混在 kern.log 里难以区分:
- 正确写法示例(记录所有被 DROP 的入向 TCP):
nft add rule inet filter input tcp counter log prefix "nft-DROP-INPUT: " drop - 前缀建议包含协议、方向、动作、链名,比如
"nft-DROP-TCP-INPUT: "或"nft-REJECT-SSH-FORWARD: " - 避免只写
log不加prefix,否则在远程日志里无法快速过滤定位
rsyslog 客户端需启用内核消息采集
默认 rsyslog 不自动接收内核日志(包括 nftables log),需手动加载 imkmsg 模块并配置过滤规则:
- 编辑
/etc/rsyslog.conf,取消以下两行注释:module(load="imkmsg")input(type="imkmsg" Ruleset="kmsg") - 添加过滤规则,把带 nft 前缀的日志单独转发:
:msg, contains, "nft-" @192.168.10.50:514(TCP)
或:msg, contains, "nft-" @@192.168.10.50:514(TLS 加密,需额外配证书) - 重启生效:
sudo systemctl restart rsyslog
远程 rsyslog 服务端要隔离存储
日志服务器不能和业务服务器共用,且需限制访问权限。服务端配置重点在“分源、分类、防篡改”:
- 用模板按客户端 IP 和日志前缀分离路径:
$template NftLogPath,"/var/log/nft-remote/%FROMHOST-IP%/firewall-%$YEAR%%$MONTH%%$DAY%.log":msg, contains, "nft-" ?NftLogPath - 确保
/var/log/nft-remote/目录属主为syslog:adm,权限750,禁止普通用户读写 - 配合
logrotate设置轮转策略(如每日切分、保留 180 天、压缩归档),防止磁盘打满
验证与日常检查要点
配置完成后不能只看“服务是否运行”,要确认整条链路真实有效:
- 在客户端触发一条测试拦截(如临时封自己 SSH IP):
nft add rule inet filter input ip saddr 192.168.1.100 drop,然后尝试连接 - 立刻在客户端执行:
sudo dmesg -T | tail -5,应看到带 prefix 的 log 行 - 在远程日志服务器上查:
sudo tail -f /var/log/nft-remote/192.168.1.100/firewall-*.log - 定期检查 rsyslog 转发成功率:
sudo journalctl -u rsyslog | grep -i "fail\|drop\|failover"

















