通过nftables log动作加prefix标记、rsyslog过滤转发至独立日志服务器,实现拦截日志隔离备份;需配置客户端过滤nf-drop-前缀日志tcp转发,服务端专模存储并禁用混写,最后三步验证链路可靠性。

直接用 nftables 的 log 动作把拦截记录写进内核日志,再靠 rsyslog 把这部分日志实时转发到独立日志服务器,就能实现“拦截行为可追溯、本地删不掉”的隔离备份效果。关键不在功能有没有,而在日志路径是否绕开了攻击者能碰的环节。
让nftables把拦截动作明确打上标记
nftables 的 log 不是简单记一条“被拦了”,而是往内核日志(kmsg)里写带前缀的原始包信息。必须加 prefix,否则在海量日志里根本分不清哪条是防火墙拦的。
- 例如,在 INPUT 链里加一条记录 SSH 暴力尝试的规则:
nft add rule ip filter INPUT tcp dport 22 ct state invalid counter log prefix "NF-REJECT-SSH: " drop -
prefix值建议统一风格,比如NF-BLOCK-或NF-DROP-开头,后续方便用 rsyslog 过滤 - 务必搭配
counter,既能验证规则是否真在生效,也能避免因日志满载导致规则静默失效
用rsyslog精准捕获并分流这些拦截日志
默认情况下,nftables 的 log 会混在 /var/log/kern.log 或 /var/log/syslog 里,和内核消息搅在一起。要远程备份,就得先把它单独捞出来。
- 在客户端(即运行 nftables 的服务器)新建配置文件:
/etc/rsyslog.d/60-nf-log.conf - 写入过滤+转发规则:
:msg, contains, "NF-DROP-" @@192.168.10.50:514;RSYSLOG_ForwardFormat
(其中@@表示 TCP 转发,192.168.10.50替换为你的日志服务器 IP) - 如果想更严谨,可加设施过滤:
if $syslogfacility-text == 'kern' and $msg contains 'NF-DROP-' then @@192.168.10.50:514 - 重启 rsyslog:
systemctl restart rsyslog
服务端只收这类日志,不存本地、不混其他内容
日志服务器不能只是“多收几条”,而要确保:收到的全是 nftables 拦截日志,且不落地到本机磁盘(防篡改),也不和其他日志掺杂。
- 服务端 rsyslog 配置中禁用默认的
*.* /var/log/syslog类规则,避免混写 - 专设模板,按来源 IP + 时间分离存储:
$template NFLogTemplate,"/var/log/nf-remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log":msg, contains, "NF-DROP-" ?NFLogTemplate - 目录权限设为
root:adm,且/var/log/nf-remote/不开放写权限给普通用户 - 如需更高保障,可配合 TLS 加密传输(需生成证书、启用
gtls模块)
验证链路是否真正可靠
别等出事才测。三步快速确认整条链没断:
- 手动触发一条拦截:比如从另一台机器 telnet 一个关闭的端口,或用
nft add rule ... drop临时加一条必拦规则 - 在客户端执行:
journalctl -k | grep "NF-DROP-",看内核日志里有没有输出 - 立刻去服务端查:
tail -f /var/log/nf-remote/192.168.10.20/$(date +%Y-%m-%d).log,看是否实时出现










