nftables 命令示例
基本概念
IPtables
IPtables 的链是一个个检查节点,表是检查清单。当数据包经过某个链,系统就执行对应表上面的操作。一个链可以有多个表,根据优先级,系统会按照表的优先级,对数据包进行操作。一个链可以包含的表类型如下。
| 表 \ 链 | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
|---|---|---|---|---|---|
| Raw | ✅ | ✅ | |||
| Mangle | ✅ | ✅ | ✅ | ✅ | ✅ |
| NAT | ✅ | ✅ | ✅ | ||
| Filter | ✅ | ✅ | ✅ |
IPtables的链和表关系固定。
表的优先级顺序,从高到低:Raw, Mangle, NAT, Filter。
NFTables
表,现在不再是操作清单,而是一套规则组合。
链,变成了挂载点。
操作清单现在由链类型和优先级来定义。
检查点(链,挂载点)和检查清单(表,链类型,优先级)分离,可以自由组合了。
命令解释
创建表
sudo nft add table inet filter
- table,创建一个表,还可以创建 chain, rule, set, map
inet,同时处理 IPv4 和 IPv6。还可以替换为以下协议。
协议族 说明 ip 仅处理 IPv4 数据包 ip6 仅处理 IPv6 数据包 inet 同时处理 IPv4 和 IPv6(推荐,简化配置) arp 处理 ARP 协议数据包(局域网设备通信) bridge 处理桥接设备(如交换机)的数据包 netdev 在网络设备层面非常早的阶段处理数据包(Linux kernel 4.2+) - filter 自定义表名,可以替换为其他名称比如 my_table
创建链
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy accept \; }
- filter 表名,替换成上面创建表命令中的名称,比如 my_table
- input 链名,可以自定义,可以替换成 my_chain
- type filter, 链类型
hook input, 挂载点,可以替换为以下值
值 说明 prerouting 路由决策之前(入站) input 发往本机的数据包 forward 需要转发的数据包 output 本机发出的数据包 postrouting 路由决策之后(出站) priority,可以写整数,也可以写名称,名称对应的优先级如下:
名称 数值 适用 family 适用 hook raw -300 ip, ip6, inet 所有 mangle -150 ip, ip6, inet 所有 dstnat -100 ip, ip6, inet prerouting filter 0 ip, ip6, inet, arp, netdev 所有 security 50 ip, ip6, inet 所有 srcnat 100 ip, ip6, inet postrouting - policy accept,所有规则都不匹配的默认行为,可以替换为 drop
创建规则
分别是放行本机连本机,放行有状态的数据包,丢弃异常数据包。
sudo nft add rule inet filter input iifname "lo" accept
sudo nft add rule inet filter input ct state related,established accept
sudo nft add rule inet filter input ct state invalid drop开放ssh端口,备注ssh
sudo nft add rule inet filter input tcp dport 22 accept comment "ssh"调整默认规则为drop。另起一个会话,看看能不能登录ssh,确认可以登录后,再关闭当前会话,免得把自己关在门外。
如果不能登录,把 drop 改成 accept
sudo nft chain inet filter input { policy drop \; }保存规则
sudo nft list ruleset | sudo tee /etc/nftables.conf前半命令是显示当前规则,后半命令是把显示的内容保存到配置文件。修改规则后输入此命令保存到硬盘,否则重启后规则丢失。
开启 NFTables 服务开机自启,这样才会加载保存的规则。
sudo systemctl enable nftables
sudo systemctl start nftables一键汇总
# 1. 如果还没有表和链,先创建
sudo nft add table inet filter 2>/dev/null || true
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy accept \; } 2>/dev/null || true
# 2. 添加规则
sudo nft add rule inet filter input iifname "lo" accept
sudo nft add rule inet filter input ct state related,established accept
sudo nft add rule inet filter input ct state invalid drop
sudo nft add rule inet filter input tcp dport 22 accept comment "ssh"
sudo nft add rule inet filter input ip saddr 14.19.0.0/16 accept comment "GD Telecom"
# 3. 查看规则
sudo nft list ruleset
# 4. 确认无误后,修改默认策略为 drop
# sudo nft chain inet filter input { policy drop \; }
# 5. 保存规则
sudo nft list ruleset | sudo tee /etc/nftables.conf
# 6. 启动 nftables 服务用于开机自动加载规则
sudo systemctl enable nftables
sudo systemctl start nftables
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
