基本概念

IPtables

IPtables 的链是一个个检查节点,表是检查清单。当数据包经过某个链,系统就执行对应表上面的操作。一个链可以有多个表,根据优先级,系统会按照表的优先级,对数据包进行操作。一个链可以包含的表类型如下。

表 \ 链PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
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-300ip, ip6, inet所有
    mangle-150ip, ip6, inet所有
    dstnat-100ip, ip6, inetprerouting
    filter0ip, ip6, inet, arp, netdev所有
    security50ip, ip6, inet所有
    srcnat100ip, ip6, inetpostrouting
  • 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
文章目录