iptables 与 nftables

iptables 基于 netfilter。主要用于网络防火墙的场景。

从内核详解 iptables 原理

firewalld

https://firewalld.org/

使用它的系统: RHEL 7, CentOS 7, Fedora 18 and newer

从Cent7以后,iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。在RHEL7里,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables。firewalld是iptables的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面。

firewalld 与 iptables (链接备份)

nftables

nftables 是新式的数据包过滤框架,旨在替代现用的 iptables 框架。nftables 诞生于 2008 年,2013 年底合并到 Linux 内核,从 Linux 内核 3.13 版本开始可用。

nftables 是取代 iptables、ip6tables、arptables 和 ebtables 的新的包过滤框架。nftables 旨在解决现有{ip/ip6}tables 工具存在的诸多限制。相对于旧的 iptables,nftables 最引人注目的功能包括改进性能如支持查询表;事务型规则更新,所有规则自动应用;等等。 nftables 实现了一组被称为表达式的指令,可通过在寄存器中储存和加载来交换数据。也就是说,nftables 的核心可视为一个虚拟机,nftables 的前端工具 nft 可以利用内核提供的表达式去模拟旧的 iptables 匹配,维持兼容性的同时获得更大的灵活性。

nft list ruleset 输出空白

这是因为 nftables 和 iptables 不共享规则数据。如果 nft list ruleset 输出了 iptables 里的规则,那是因为你用的 nft 命令其实是 iptables-nft。

详见下面两篇文章

iptables 版本

iptables -V 如果显示 iptables vX.Y.Z (legacy),说明用的是原生的 iptables。 如果是 iptables vX.Y.Z (nf_tables),则用的是 iptables-nft。

也可以从软链接看出,

ls -al $(which iptables)

/usr/bin/iptables -> xtables-legacy-multi  # legacy iptables
/usr/bin/iptables-nft -> xtables-nft-multi # nft iptables
+--------------+     +--------------+     +--------------+
|   iptables   |     |   iptables   |     |     nft      |   USER
|    legacy    |     |     nft      |     |  (nftables)  |   SPACE
+--------------+     +--------------+     +--------------+
       |                          |         |
====== | ===== KERNEL API ======= | ======= | =====================
       |                          |         |
+--------------+               +--------------+
|   iptables   |               |   nftables   |              KERNEL
|      API     |               |     API      |              SPACE
+--------------+               +--------------+
             |                    |         |
             |                    |         |
          +--------------+        |         |     +--------------+
          |   xtables    |--------+         +-----|   nftables   |
          |    match     |                        |    match     |
          +--------------+                        +--------------+

iptables-nft

iptables-nft 只是 iptables 过渡到 nftables 的中间产物,让用户用 iptables 的命令行交互操作 nftables api。 然而 iptables-nft 并不完全等价于 nftables。

把 iptables 转换成 nftables 规则

# 先导出 iptables 规则
sudo iptables-save > iptables.dump
sudo ip6tables-save > ip6tables.dump
# 转换成 nftasbles 规则,并写入 nftables 启动配置
iptables-restore-translate -f iptables.dump > /etc/nftables/ruleset-from-iptables.nft
ip6tables-restore-translate -f ip6tables.dump > /etc/nftables/ruleset-from-ip6tables.nft

详见 https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables

UFW

UFW - Uncomplicated Firewall

The default firewall configuration tool for Ubuntu is ufw. Developed to ease iptables firewall configuration, ufw provides a user friendly way to create an IPv4 or IPv6 host-based firewall.

iptables-save/iptables-restore

  • 将 iptables 规则保存到文件: iptables-save > /etc/iptables/rules.v4
  • 系统加载 iptables 规则: iptables-restore /etc/iptables/rules.v4

Linux 系统启动默认不会加载 iptables 规则,需要在 systemd service 里使用 iptables-restore 来加载规则。

[Unit]
Description=Packet Filtering Framework

[Service]
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecReload=/sbin/iptables-restore /etc/iptables/rules.v4
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

nft -f /etc/nftables.conf

nft 不使用 iptables-saveiptables-restore

  • 将 nftables 规则保存到文件: nft list ruleset > /etc/nftables.conf
  • 系统加载 nftables 规则: nft -f /etc/nftables.conf

Linux 系统启动默认不会加载 /etc/nftables.conf 文件,需要在 systemd service 里使用 nft -f 来加载规则。

[Unit]
Description=NFT ruleset
After=network.target

[Service]
ExecStart=/usr/sbin/nft -f /etc/nftables.conf
ExecReload=/usr/sbin/nft -f /etc/nftables.conf
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

其他

iptables 的可读性和执行效率不如 nftables,强烈推荐 nftables。

ip6tables 是 IPv6 版本的 iptables。

MacOS 没有 iptables,使用的是 pfctl。

Iptables 技巧/指南