Linux 防火墙2025年3月17日 | 阅读11分钟 Linux 防火墙简介防火墙可以定义为一种网络安全系统,它根据预设的规则集来控制和过滤流量。它是互联网和设备之间的中间系统。 Linux 的 内核 包含一个子系统,即 **Netfilter。** 它用于决定或操作穿过或进入我们服务器的网络流量的去向。所有最新的 Linux 防火墙解决方案都使用此系统进行一个称为 **“数据包过滤”** 的过程。 如果没有用于管理它的用户空间接口,内核的数据包过滤系统过程对许多管理员来说作用微乎其微。iptables 的目标是:如果一个数据包到达我们的服务器,它将被根据 iptables 通过用户空间提供给它的各种规则,交给拒绝、接受或修改 Netfilter 子系统处理。 因此,如果我们熟悉 iptables,这就是我们管理防火墙所需要的。但是,有许多前端可以简化此任务。 注意:如果我们已经了解防火墙的工作原理,只想了解命令,那么可以跳过防火墙工作原理部分,直接跳转到教程末尾。以下是我们需要了解的关于 **Linux 防火墙** 的一些 **关键点:** - 防火墙是一组规则。
- 当数据包进出受保护区域时,会检查其内容(关于其目标、协议和计划使用的来源的信息)是否符合防火墙的规则,以确定是否允许通过。
- 此外,iptables 是另一个 CLI 工具,用于管理任何 Linux 机器上的防火墙规则。
- 此外,Firewalld 是一个用于管理任何 Linux 机器上防火墙规则的工具。
- Linux 防火墙也可以描述为一个检查网络流量(出站/入站连接)并决定放行或阻止流量的设备。
- 在当今时代,网络安全源于各种不同的 Linux 防火墙。
- 传统的包过滤防火墙处理过滤和路由数据包,而下一代防火墙(NGFW)则处理 OSI 层的其他一些功能。
firewalldfirewalld 可以定义为一种保护机器免受外部不受欢迎流量侵害的方式。它允许所有用户通过指定防火墙规则集来管理主机上的(入站)网络流量。这些规则可用于对流量进行分类,并允许或阻止其通过。 - **firewalld** 应用 **服务和区域** 的概念来简化流量管理。
- **区域** 是 **一组预定义的规则。**
- 网络源和接口被分配到 **区域。**
- 允许的流量取决于计算机连接到的网络以及该网络选择的安全级别。
- **防火墙服务** 可以定义为一些预定义的规则,这些规则包含允许特定服务流量的每个必要设置,并在区域内使用。
- 服务使用多个 **地址** 或 **端口** 进行网络通信。
- 防火墙的 **过滤通信** 基于 **端口。**
- 要允许任何服务的网络流量,其端口必须 **打开。**
- **firewalld** 可以阻止所有未显式设置为打开的端口上的流量。
- 默认情况下,一些区域,如 **trusted**(信任),允许所有流量。
- **firewalld** 可用于根据用户确定的对该网络中的流量和接口的安全信任级别,将网络分隔到不同的 **区域。**
Linux 防火墙的工作原理大多数 Linux 发行版都附带许多默认的防火墙工具,可用于进行配置。我们将使用 Linux 中提供的 **“IPTables”**(默认工具)来创建防火墙。Iptables 用于设置、检查和维护 Linux 内核中 IPv6 和 IPv4 表的数据包过滤器规则。 **重要:** 本文中的所有命令都需要 sudo 权限。 Iptables 工作原理**网络流量** 由 **数据包** 组成。数据被分成多个小块(称为 **数据包**),在网络上传输,然后重新组合。具体来说,**iptables** 识别接收到的数据包,并应用一组规则来决定我们可以对它们做什么。 Ipatables 是一个命令行界面应用程序,它允许管理员配置特定规则,这些规则将强制 Linux 内核执行操作,例如丢弃、修改或检查网络数据包。 在 Linux 设备或机器上,启用 iptables 将充当 **路由器** 和/或 **网络防火墙。** 不同的内核程序和模块用于不同的协议,例如 iptables 应用于 IPv4,arp tables 应用于 ARP,ip6tables 应用于 IPv6,ebtables 应用于以太网帧。 后来,**Netfilter** 项目开发了 Nftables,以提高可伸缩性和性能。它是一个用于数据包过滤过程的框架,其功能与 Iptables 类似。 **Iptables** 用于根据以下内容过滤数据包: - **表:** 这些文件可以组合相同的操作。一个表由多个 **链** 组成。
- **链:** 链是规则的字符串。当接收到任何数据包时,Ipatales 会找到一个合适的表,然后从规则的链中执行,直到找到匹配项。
- **规则:** 规则是告知系统如何处理数据包的语句。它们可以阻止一种数据包类型,或转发其他类型的数据包。数据包被转发的结果称为 **目标。**
- **目标:** 目标是决定如何处理数据包。通常是接受它、拒绝它或丢弃它(将错误消息返回给发送者)。
链链是一组为特定任务定义的规则。 有三种类型的链可用于处理流量: - FORWARD 链
- OUTPUT 链
- INPUT 链
**1. FORWARD 链:** 源自网络(外部)并去往其他网络的数据流量需要通过 forward 链。如果连接了两个或多个系统,并且我们希望在它们之间传输数据,则可以使用此链。 **2. OUTPUT 链:** 我们的本地机器向互联网发送的数据流量需要通过这些 output 链。 **3. INPUT 链:** 源自网络(内部)并到达我们本地机器的数据流量将通过 input 链。这意味着它们需要通过 input 链中已设置的每个规则。 表Linux 防火墙的 iptables 默认包含四个表。我们将列出所有四个表。 1. Filter(过滤)这个表被广泛使用。它充当门卫,决定谁可以进出我们的网络。它包含一些默认链,如 forward、input 和 output 链。 2. Network Address Translation (NAT)(网络地址转换)它包含网络地址转换(NAT)规则,用于将数据包路由到无法直接访问的网络。如果数据包的源或目标需要修改,则会使用 NAT 表。它包含一些链,如下所述: - **Prerouting:** 它在服务器收到数据包时立即用于分配数据包。
- **Output:** 此链的作用与我们上面解释的 output 链类似。
- **Postrouting:** 它允许在数据包离开 output 链后对其进行修改。
3. Mangle(修改)此表用于调整数据包的 IP 头部属性。它包含我们上面解释的所有链: - 远期合约
- 输入
- 输出
- Postrouting
- Prerouting
4. Raw(原始)此表用于豁免数据包进行连接跟踪。它包含两个链: 5. 安全性此表是可选的。一些 Linux 版本使用 Security 表来管理唯一的访问规则。它包含 forward、input 和 output 链。 目标当数据包匹配任何规则条件后,就会发生目标操作。许多目标(非终止目标)即使在数据包匹配一条规则后,也会继续匹配链中的其他规则。 终止目标会立即评估数据包,而不会与其他链进行匹配。 不同类型的策略iptables 可以对流量执行三种不同的操作: - ACCEPT(接受)
- REJECT(拒绝)
- DROP
- RETURN
**1. ACCEPT:** 当流量通过指定链中的某些规则时,iptables 将接受该流量。这意味着它打开了许多通道,并允许用户访问规则和规定。 **2. REJECT:** 此操作与 drop 操作相同。但是,它会将一条消息发送给流量的发送者,说明数据传输失败。 当我们希望另一方了解端口不可用时,可以将 **REJECT** 操作用作正常规则。 **3. DROP:** 当 iptables 无法通过指定链中的规则时,它可以阻止任何流量。这意味着防火墙已关闭。 注意:我们需要记住一个通用规则: 在 iptables 中,我们设置的规则是从上往下检查的。当数据包通过任何顶部规则时,它就被允许通过防火墙。较低的规则不会被检查。因此,我们在设置规则时必须小心。**4. RETURN:** 它将数据包返回到生成它的链,以便我们可以将其与其他规则进行匹配。 在 Ubuntu 中配置和安装 iptables 防火墙默认情况下,iptables 已安装在大多数 Linux 发行版上。我们可以使用以下命令来确保我们的系统上可用 iptable:
 iptables 的语法和选项 iptables 的命令通常如下所示: 以下是一些常用的 iptables 选项: - **--append, -A:** 用于将规则添加到链的末尾。
- **--check, -C:** 它会查找与链要求匹配的规则。
- **--delete, -D:** 它会从链中删除指定的规则。
- **--flush, -F:** 它会从链中删除所有规则。
- **--insert, -I:** 用于将规则添加到链的指定位置。
- **--list, -L:** 此选项用于显示链中的所有规则。
- **--new-chain, -N:** 它会创建一个新链。
- **--verbose, -V:** 使用此选项时,它会显示更多详细信息。
- **--delete-chain, -X:** 它会删除给定的链。
注意:请确保我们使用的是正确的选项,因为 iptables 是区分大小写的。iptables 的基本命令1. 列出 iptables 当前规则我们可以使用以下命令列出 iptables 当前的规则:
 如我们所见,有三个可用链(FORWARD、INPUT、OUTPUT)。我们还可以查看列标题。但是,它们不是原始规则。这是因为几乎所有 Linux 发行版都没有预定义规则。 让我们来解释一下所有列的含义: 目标 它指定了需要对数据包执行什么操作(ACCEPT、REJECT、DROP)。 prot(协议) 它指定了数据包的协议(IP、TCP)。 source 它定义了数据包的源地址。 destination(目标) 它指定了数据包的目标地址。 2. 清除规则如果我们想刷新或清除所有现有规则,可以执行以下命令:
 这将重置 iptables。 3. 修改默认链策略语法如下 在上面的截图中,所有链的默认策略都是 ACCEPT。 例如: 如果我们查看 forward 链,会看到“Chain FORWARD (policy ACCEPT)”。这意味着我们的计算机允许流量转发到另一台计算机。 我们可以使用以下命令将转发策略修改为 drop:
 这将停止从我们的计算机转发流量。这意味着没有其他计算机可以访问我们的计算机作为中转来传递数据。 创建我们的第一条规则1. DROP 规则现在,我们将开始构建防火墙策略。首先,我们将处理 input 链,入站流量将通过该链。 语法 我们将举一个例子来理解这个主题: 假设我们想阻止来自 192.168.1.3 IP 地址的任何流量。可以使用以下命令:
 这看起来可能有些普通,但如果我们仔细分析各个部分,就会明白: -A INPUT -A 标志用于将规则附加到链的末尾。命令的这部分定义了我们要将一条规则附加到 INPUT 链的末尾。 -I INPUT 使用此标志会将规则添加到链的顶部。 -s 192.168.1.3 -s 标志用于指定数据包源。它告诉 iptable 检查来自 192.168.1.3 源的数据包。 -j DROP 它描述了 iptable 应该如何处理数据包。命令会将规则添加到上面提到的 INPUT 链。它表示如果收到一个 IP 地址为 192.168.1.3 的数据包,则丢弃该数据包,这意味着不允许该数据包到达系统。 运行命令后,我们可以使用以下命令查看修改:
 2. ACCEPT 规则如果我们想将规则添加到我们网络的特定端口,可以使用以下命令: 其中, -p protocol_name(协议名称) 它用于匹配遵循 protocol_name 协议的数据包。 -dport port_number(目标端口号) 只有当我们提供选项,即 **-p protocol_name** 时,此选项才可用。它用于检查许多正在发送到 **“port_number”** 端口的数据包。 例如: 假设我们希望在上面阻止的 192.168.1.3 网络上保持 SSH 端口开放。也就是说,我们只希望允许来自 192.168.1.3 IP 地址且目标是 22 端口的数据包。 我们该怎么做? 让我们尝试以下命令:
 此命令定义了查找来自 192.168.1.3 IP 地址、使用 TCP 协议并希望发送内容到我们计算机 22 端口的数据包。如果我们找到这些类型的数据包,则接受它们。 正如我们之前解释的,在 iptables 中,我们设置的规则是从上到下检查的。当数据包被任何顶部规则处理后,就不会再与任何较低的规则进行匹配。 但在我们的例子中,数据包被顶部的规则检查。它定义了 iptable 应该丢弃来自 192.168.1.3 IP 地址的数据包。 因此,一旦数据包被这个允许到达 22 端口的规则处理,它就没有继续进行下一个规则的检查。所以它失败了。 怎么办? 我们可以将规则添加到链的顶部。我们所要做的就是将 -A 选项切换到 -I 选项。 执行此操作的命令如下:
 现在,我们将使用 -L 选项检查 iptable 配置。 因此,来自 192.168.1.3 IP 地址的数据包首先被检查是否要发送到 22 端口,如果不是,它将由链中的下一个规则处理。 否则,它将被允许通过防火墙。 我们现在已经理解了如何接受和阻止流量。让我们看看如何删除规则。 3. 通过 iptable 删除规则语法
 4. 保存我们的配置如果不是在服务器上进行操作,这一步是不必要的。但是,如果我们要在服务器上实现任何防火墙,那么很有可能我们的服务器会损坏,我们可能会丢失所有数据。因此,最好保存我们的配置。 有很多方法可以做到这一点,但我们在 iptables 中发现的有效方法是使用 **persistent** 包。我们可以从 Ubuntu 的默认存储库下载此包:
 安装过程完成后,我们可以使用以下命令保存我们的配置:

|