简介
设置防火墙是保护任何现代操作系统的必要步骤。大多数 Linux 发行版都附带了几种不同的防火墙工具,您可以使用这些工具来配置防火墙。在本指南中,我们将介绍 iptables
防火墙。
Iptables 是大多数 Linux 发行版默认包含的标准防火墙。它是一个命令行接口,用于操作 Linux 网络堆栈的内核级 netfilter 钩子。它通过将通过网络接口的每个数据包与一组规则进行匹配来决定要执行的操作。
在本指南中,您将了解 Iptables 的工作原理。如果需要更深入的了解,您可以阅读《深入理解 Iptables 和 Netfilter 架构》。
Iptables 的工作原理
首先,让我们回顾一些术语,并讨论 iptables 的工作原理。
Iptables 防火墙通过将网络流量与一组规则进行比较来运行。这些规则定义了网络数据包需要具备的特征以进行匹配,以及匹配数据包时应采取的操作。
有许多选项可以确定哪些数据包与特定规则匹配。您可以匹配数据包的协议类型、源地址或目标地址或端口、正在使用的接口、与先前数据包的关系等。
当定义的模式匹配时,所发生的操作称为目标。目标可以是数据包的最终策略决定,例如 ACCEPT
或 DROP
。它还可以将数据包移动到另一个链进行处理,或记录遇到的情况。有许多选项可供选择。
这些规则被组织成称为链的组。链是数据包按顺序检查的一组规则。当数据包匹配其中一条规则时,它执行相关的操作并跳过链中剩余的规则。
用户可以根据需要创建链。默认情况下定义了三个链。它们是:
- INPUT:处理发送到您的服务器的所有数据包的链。
- OUTPUT:包含您的服务器生成的流量的规则的链。
- FORWARD:用于处理发送到未在您的服务器上创建的其他服务器的流量的链。这是一种配置服务器以将请求路由到其他机器的方式。
每个链可以包含零个或多个规则,并具有默认的策略。策略确定当数据包通过链中的所有规则并且不匹配任何规则时会发生什么。您可以丢弃数据包,或者如果没有匹配任何规则,则接受数据包。
Iptables 还可以跟踪连接。这意味着您可以创建根据数据包与先前数据包的关系定义的规则。这种能力称为“状态跟踪”、“连接跟踪”或配置“状态机”。
IPv4 与 IPv6
Linux 内核中包含的 netfilter 防火墙将 IPv4 和 IPv6 流量完全分开。用于操作包含防火墙规则集的表的 Iptables 工具也是不同的。如果您的服务器启用了 IPv6,您将需要配置这两个表以处理服务器上的流量。
常规的 iptables
命令用于操作包含管理 IPv4 流量规则的表。对于 IPv6 流量,使用一个名为 ip6tables
的配套命令。您使用 iptables
设置的任何规则将仅影响使用 IPv4 寻址的数据包,但这些命令的语法是相同的。iptables
命令将创建适用于 IPv4 流量的规则,而 ip6tables
命令将创建适用于 IPv6 流量的规则。不要忘记使用您服务器的 IPv6 地址来制定 ip6tables
规则。
需要牢记的事项
现在您知道 iptables 如何引导通过其接口的数据包 - 将数据包定向到适当的链,检查它是否与每个规则匹配,如果找不到匹配项,则执行链的默认策略 - 您可以开始创建规则。
首先,您需要确保如果实施默认丢弃策略,有规则来保持当前连接处于活动状态。如果您通过 SSH 连接到服务器,这一点尤为重要。如果意外实施了一个会中断当前连接的规则或策略,您可能需要使用基于浏览器的恢复控制台登录到服务器。
另一点需要牢记的是每个链中规则的顺序很重要。如果数据包应该匹配更具体的规则,则不应该遇到更一般的规则。
因此,链中靠近顶部的规则应比底部的规则具有更高的特定性。您应该首先匹配特定情况,然后提供更一般的规则以匹配更广泛的模式。如果数据包通过整个链(如果它不匹配任何规则),它将遵循最一般的规则,即默认策略。
因此,链的默认策略强烈决定了链中将包含哪些类型的规则。默认策略为 ACCEPT
的链将包含明确拒绝数据包的规则。默认为 DROP
的链将包含特定接受数据包的例外规则。
结论
到这一步,你已经准备好实现自己的防火墙了。为此,你应该阅读《如何在 Ubuntu 22.04 上使用 Nftables 设置防火墙》。或者,如果你更倾向于采用更高级的方法,可以阅读《如何在 Ubuntu 22.04 上使用 UFW 设置防火墙》。如果你更愿意将防火墙作为托管服务层来运行,你也可以尝试 DigitalOcean 的 Cloud Firewalls。