nftables 在动态 IP 环境中可通过连接跟踪、接口绑定、动态黑名单和行为日志实现稳定防御:优先用 ct state established/related 替代源 IP 匹配;以 iifname/oifname 代替 IP 限控;用带超时的 ip saddr @dynban 实现自动封禁;结合 nftrace 与计数规则提升可观测性。

nftables 本身不自动识别 IP 变更,但在动态 IP 环境(如 DHCP 客户端、云主机弹性公网 IP 变更、家庭宽带拨号重连)下,仍可通过结构化设计实现稳定、可响应的安全防御。关键不是“等待 IP 更新”,而是绕过对固定 IP 的依赖,转而基于连接状态、行为特征与外部信号做决策。
用连接跟踪替代源地址硬匹配
动态 IP 下,靠 ip saddr 192.168.1.100 这类规则极易失效。应优先信任内核 conntrack 记录的真实连接上下文:
- 所有允许回连的逻辑都基于
ct state established, related,无需知道对方当前 IP 是多少 - 拦截伪造连接(如无 SYN 的 ACK、FIN 混合包)用
ct status invalid drop,与地址无关 - 对本机发起的出向连接,用
oifname+ct state new限速,例如防内网失陷主机外连:nft add rule inet filter output oifname "eth0" ct state new limit rate 5/minute burst 10 counter drop
基于接口而非 IP 的访问控制
当公网 IP 频繁变动,但网卡名和网络角色稳定时,直接绑定接口更可靠:
- 允许来自可信局域网的管理访问(无论其 DHCP 分配到哪个 IP):
nft add rule inet filter input iifname "br-lan" tcp dport 22 accept
- 阻断所有来自广域网接口的新连接(防止暴露服务):
nft add rule inet filter input iifname "ppp0" ct state new drop
- 区分物理口与虚拟口:
iifname "enp3s0"(WAN)、iifname "br0"(LAN)、iifname "docker0"(容器),策略解耦于地址。
动态黑名单:IP 集合 + 外部触发更新
即使本机 IP 不固定,你仍可实时封禁恶意远端 IP:
- 创建带超时的 IPv4 黑名单集合:
nft add set inet filter dynban { type ipv4_addr\; flags timeout\; } nft add rule inet filter input ip saddr @dynban drop - 使用
dhcpcd、NetworkManager或systemd-networkd的 hook 脚本,在每次获取新 IP 后主动刷新关联策略(如重载白名单或清理旧日志缓存) - 更实用的是由
faillog、journalctl -u sshd或nginx错误日志触发封禁:检测到 3 次失败登录即执行nft add element inet filter dynban { 203.0.113.45 timeout 30m }超时自动清理,不需人工干预。
日志与可观测性:聚焦行为,而非静态地址
动态环境下,日志中看到的 src_ip 可能已变更,但连接元数据依然有效:
- 记录被拒绝连接时带上
ct id和meta nftrace on,后续用nft monitor trace关联原始会话 - 用
log prefix "dyn-wan-drop: "+limit rate 2/minute控制日志量,避免拨号重连时大量arp,dhcp包刷屏 - 在
input链开头加一条通用拒绝规则并计数,配合nft list chain inet filter input实时观察命中趋势,比查 IP 更快定位异常流量模式
不复杂但容易忽略

















