nftables的链是绑定特定netfilter钩子的语义化规则集合:input链处理发往本机的流量(hook input),output链控制本机发出的流量(hook output),forward链专管转发流量(hook forward),均需指定协议族(如inet)以支持双栈。

入站链(input):只管发给本机的流量
input 链处理目标 IP 是本机的数据包,比如 SSH 登录请求、HTTP 服务监听、ping 回复等。它在路由决策之后触发,因此不涉及转发逻辑。
- 必须指定 type filter hook input,否则只是普通链,不会自动挂载到网络路径上
- 推荐优先级设为 0(数字越小越早执行),避免被其他高优先级链干扰
- 默认策略建议设为 drop,再显式放行必要端口(如 22/tcp、80/tcp、443/tcp)
- 常用匹配条件:
ip protocol tcp tcp dport 22、ct state established,related(允许已有连接回包)
出站链(output):控制本机主动发出的流量
output 链管的是本机进程发起的 outbound 请求,比如 curl 访问外部网站、定时同步时间、软件更新下载等。它在数据包离开本机前最后一道关卡。
- 钩子必须是 hook output,不能错用 input 或 forward
- 若服务器需严格管控外连(如容器宿主机或安全敏感环境),默认策略应设为 drop
- 放行时建议按最小权限原则:仅允许可信目标(如内网 DNS 的 53/udp、NTP 的 123/udp)、已建立连接(
ct state established)、本地回环(ip daddr 127.0.0.1) - 可配合地址集(set)封禁已知 C2 IP 段:
nft add rule inet filter output ip daddr @c2_blacklist drop
转发链(forward):专用于路由/桥接场景的中转流量
forward 链只对“非发往本机、也非由本机发起”的数据包生效,典型场景包括:物理机做路由器、Docker 容器通信、VM 网络桥接、防火墙双网卡透传等。
- 只有启用 IP 转发(
sysctl -w net.ipv4.ip_forward=1)后,该链才可能被触发 - Docker 默认会在 forward 链插入规则,但用户自定义策略应放在 DOCKER-USER 链(hook output,priority -1)更稳妥,因为它在 Docker 自动规则之前执行
- 常见做法:默认 drop,再按需放行特定容器网段互访、或宿主机到容器的管理流量
- 务必配合连接跟踪状态:
ct state established,related accept放回包,ct state invalid drop拦异常连接
协议族选择直接影响链的适用范围
别忽略表(table)的 family 声明——它决定了链能处理什么协议:
- ip:只处理 IPv4,适合纯 IPv4 环境
- ip6:只处理 IPv6
- inet:同时处理 IPv4 和 IPv6(推荐),一条规则覆盖双栈,避免重复配置
- 用
inet创建链时,hook input会自动兼容两类地址,无需分别建 ip/ip6 表











