nftables filter类型链通过input链实现基础入站策略,先放行established/related连接和lo接口,再开放业务端口,最后设policy drop默认拒绝;需指定type filter hook input priority 0,规则顺序与状态跟踪至关重要。

用 nftables 的 filter 类型链配置基础入站策略,核心是控制哪些流量能到达本机——不是简单“开几个端口”,而是建立一套有顺序、有状态、可扩展的过滤逻辑。关键在于:先放行可信流量(如已建立连接、本地回环),再按需开放业务端口,最后默认拒绝。
明确链的作用与钩子位置
入站策略主要靠 input 链实现,它挂载在内核的 input hook 上,处理所有目的地为本机的数据包。必须指定 type filter hook input 才能生效,否则规则不会被触发。
- input 链:只管“发给本机”的包,不处理转发或出站流量
- priority 0 是常见起始优先级,数值越小越早执行;同一优先级内按添加顺序匹配
- 链的 policy 是兜底动作,设为
drop才真正实现“默认拒绝”
构建最小可用的入站规则集
以下命令组合可立即启用基础防护,适用于大多数 Web 或 API 服务器:
- 创建表和 input 链:
nft add table ip filter && nft add chain ip filter input { type filter hook input priority 0; policy drop; } - 放行已建立/相关连接:
nft add rule ip filter input ct state established,related accept - 放行本地回环:
nft add rule ip filter input iifname "lo" accept - 放行 SSH(22):
nft add rule ip filter input tcp dport 22 accept - 放行 HTTP/HTTPS(80/443):
nft add rule ip filter input tcp dport { 80, 443 } accept
注意:规则顺序很重要——必须把 ct state 和 lo 放在业务端口之前,否则新连接可能被提前丢弃。
避免常见配置陷阱
很多初学者配完发现 SSH 连不上,问题往往出在细节上:
-
没设默认策略为 drop:仅加 accept 规则不够,必须显式设置
policy drop,否则链默认是 accept -
忽略连接跟踪状态:不加
ct state established,related,会导致响应包被拦,SSH 登录卡在密码输入后 -
混用协议族:
ip表只管 IPv4;若需同时支持 IPv6,改用inet表(自动兼容双栈) -
未持久化规则:重启后规则消失,需保存到
/etc/nftables.conf并启用 systemd 服务:systemctl enable nftables
后续可扩展的方向
基础策略跑稳后,可逐步叠加更精细的控制:
- 限制 SSH 源 IP:
nft add rule ip filter input ip saddr 192.168.1.0/24 tcp dport 22 accept - 防暴力破解:用
limit限制新建连接速率,例如每分钟最多 5 次 SSH 新建请求 - 屏蔽恶意 IP:用
ip saddr @blacklist引用地址集,动态管理封禁列表 - 记录可疑流量:在拒绝规则前加
log prefix "DROPPED: ",配合dmesg或 journald 分析











