配置防火墙和数据包过滤器
大约 94 分钟
配置防火墙和数据包过滤器
来源:官方文档 原始多页入口:配置防火墙和数据包过滤器 内容规模:约 85,242 字符,124 个章节标题,254 个命令/代码块,27 条提示框
阅读提要
- 副标题:管理 firewalld 服务、nftables 框架和 XDP 数据包过滤功能
- 摘要:数据包过滤器(如防火墙)使用规则来控制传入、传出和转发网络流量。在 Red Hat Enterprise Linux (RHEL)中,您可以使用 firewalld服务和 nftables框架过滤网络流量并构建性能关键的防火墙。您还可以使用内核的 Express Data Path (XDP)功能以非常高的速度处理或丢弃网络接口上的网络数据包。
- 主要章节:管理 firewalld 服务、nftables 框架和 XDP 数据包过滤功能;对红帽文档提供反馈;第 1 章 使用和配置 firewalld;第 2 章 nftables 入门;第 3 章 XDP 和 eBPF 入门
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
管理 firewalld 服务、nftables 框架和 XDP 数据包过滤功能
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 使用和配置 firewalld
- 要点:防火墙是保护机器不受来自外部的、不需要的网络数据影响的一种方式。管理员通过定义一组防火墙规则,使用防火墙 来控制主机上的入站网络流量。这些规则用于对传入流量进行排序,并阻止它或允许它通过。
- 要点:firewalld 是一个防火墙服务守护进程,它提供带有 D-Bus 接口的动态的、可自定义的防火墙。此动态架构允许管理员在每次修改后在不重启服务的情况下创建、更改和删除规则。
1.1. 防火墙区域
- 要点:您可以根据您与该网络中的接口和流量的信任级别,使用 firewalld 工具将网络划分为不同的区域。连接只能是区域的一部分,但您可以对许多网络连接使用这个区域。
- 要点:firewalld 在区域方面遵循严格的原则:
- 列表:流量只流入一个区域。
- 列表:流量只流出一个区域。
- 列表:一个区域定义一个信任级别。
- 列表:默认允许区域内流量(在同一区域内)。
- 列表:默认拒绝区域内流量(从区域到区域)。
- 列表:NetworkManager
- 注意:注意 使网络区域名称一目了然,以帮助用户快速理解它们。
1.2. 防火墙策略
- 要点:防火墙策略指定网络所需的安全状态。它们概述了对不同类型的流量要采取的规则和操作。
- 要点:通常,策略包含以下类型流量的规则:
- 列表:传入流量
- 列表:传出流量
- 列表:转发流量
- 列表:特定服务和应用程序
- 列表:网络地址转换(NAT)
1.3. 防火墙规则
- 要点:您可以使用防火墙规则实现特定的配置,以允许或阻止网络流量。因此,您可以控制网络流量的流动,以防止系统受到安全威胁。
- 要点:防火墙规则通常根据各种属性定义某些标准。属性可以是:
- 列表:源 IP 地址
- 列表:目标 IP 地址
- 列表:传输协议(TCP、UDP、…)
- 列表:端口
- 列表:网络接口
1.4. 防火墙直接规则
- 要点:firewalld 服务提供多种配置规则的方法,包括常规规则和直接规则。
- 要点:两者之间的区别在于,每个方法如何与底层数据包过滤框架(iptables 或 nftables)进行交互。
- 列表:如何使用 nftables 替换 firewalld 直接规则?(红帽知识库)
- 列表:在区域间过滤转发的流量
1.5. 预定义的 firewalld 服务
- 要点:预定义的 firewalld 服务为低级防火墙规则提供抽象层。它们使用命名服务而不是手动配置,将常见的网络服务(如 SSH 或 HTTP)映射到其特定端口和协议,从而简化防火墙管理并减少错误。
- 要点:要查看可用的预定义服务:
- 列表:要查看可用的预定义服务: # firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter…
- 列表:要进一步检查特定的预定义服务: # sudo firewall-cmd --info-service=RH-Satellite-6 RH-Satellite-6 ports: 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp protocols: source-ports: modules: destination: includes: foreman helpers: 示例输出显示 RH-Satellite-6 预定义服务侦听端口 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp。…
- 命令/配置摘录:
# firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds...
# sudo firewall-cmd --info-service=RH-Satellite-6 RH-Satellite-6 ports: 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp protocols: source-ports: modules: destination: includes: foreman helpers:1.6. 使用 firewalld 区域
- 要点:zones 代表一种更透明管理传入流量的概念。网络接口和源地址被分配给区域。您可以独立管理每个区的防火墙规则,可让您定义复杂的防火墙设置并将其应用到流量。
1.6.1. 更改默认区
- 要点:如果接口没有被分配给指定区,它将被分配给默认区。每次重启 firewalld 服务后,firewalld 会加载默认区的设置,并使其处于活动状态。所有其他区域的设置将被保留并可供使用。
- 要点:通常,区域会被 NetworkManager 按照 NetworkManager 连接配置文件中的 connection.zone 设置分配给接口。另外,重启后,NetworkManager 会管理“激活”这些区域的分配。
- 列表:firewalld 服务在运行。
- 列表:显示当前的默认区: # firewall-cmd --get-default-zone
- 列表:设置新的默认区: # firewall-cmd --set-default-zone <zone_name> 注意 按照此流程,设置是一个永久设置,即使没有 --permanent 选项。
- 命令/配置摘录:
# firewall-cmd --get-default-zone
# firewall-cmd --set-default-zone <zone_name>- 注意:注意 按照此流程,设置是一个永久设置,即使没有 --permanent 选项。
1.6.2. 创建一个新区
- 要点:要使用自定义区,创建一个新的区并使用它像预定义区一样。新区需要 --permanent 选项,否则命令无法工作。
- 要点:先决条件
- 列表:firewalld 服务在运行。
- 列表:创建一个新区: # firewall-cmd --permanent --new-zone=zone-name
- 列表:使新区域可用: # firewall-cmd --reload 命令将最新的更改应用到防火墙配置,而不中断已在运行的网络服务。
- 列表:检查是否在您的永久设置中添加了新的区: # firewall-cmd --get-zones --permanent
- 命令/配置摘录:
# firewall-cmd --permanent --new-zone=zone-name
# firewall-cmd --reload1.6.3. 将网络接口分配给区
- 要点:可以为不同区定义不同的规则集,然后通过更改所使用的接口的区来快速改变设置。使用多个接口,可以为每个具体区设置一个区来区分通过它们的网络流量。
- 要点:流程
- 列表:列出活跃区以及分配给它们的接口: # firewall-cmd --get-active-zones
- 列表:为不同的区分配接口: # firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
- 命令/配置摘录:
# firewall-cmd --get-active-zones
# firewall-cmd --zone=zone_name --change-interface=interface_name --permanent1.6.4. 添加源
- 要点:要将传入的流量路由到特定区,请将源添加到那个区。源可以是一个使用 CIDR 格式的 IP 地址或 IP 掩码。
- 要点:在当前区中设置源:
- 列表:在当前区中设置源: # firewall-cmd --add-source=<source>
- 列表:要为特定区设置源 IP 地址: # firewall-cmd --zone=zone-name --add-source=<source>
- 列表:列出所有可用区: # firewall-cmd --get-zones
- 列表:将源 IP 添加到持久性模式的信任区中: # firewall-cmd --zone=trusted --add-source=192.168.2.15
- 列表:使新设置具有持久性: # firewall-cmd --runtime-to-permanent
- 命令/配置摘录:
# firewall-cmd --add-source=<source>
# firewall-cmd --zone=zone-name --add-source=<source>- 注意:注意 如果您添加多个带有重叠网络范围的区域,则根据区名称排序,且只考虑第一个区。
1.6.5. 删除源
- 要点:当您从 firewalld 区域中删除源时,其流量不再由该源的规则定向。相反,它会回退到接口区或默认区域的规则。
- 要点:流程
- 列表:列出所需区的允许源: # firewall-cmd --zone=zone-name --list-sources
- 列表:从区永久删除源: # firewall-cmd --zone=zone-name --remove-source=<source>
- 列表:使新设置具有持久性: # firewall-cmd --runtime-to-permanent
- 命令/配置摘录:
# firewall-cmd --zone=zone-name --list-sources
# firewall-cmd --zone=zone-name --remove-source=<source>1.6.6. 使用 nmcli为连接分配区域
- 要点:您可以使用 nmcli 工具将 firewalld 区域添加到 NetworkManager 连接。
- 要点:流程
- 列表:将区分配给 NetworkManager 连接配置文件: # nmcli connection modify profile connection.zone zone_name
- 列表:激活连接: # nmcli connection up profile
- 命令/配置摘录:
# nmcli connection modify profile connection.zone zone_name
# nmcli connection up profile1.6.7. 使用区目标设定传入流量的默认行为
- 要点:对于每个区,您可以设置一种处理尚未进一步指定的传入流量的默认行为。此行为是通过设置区的目标来定义的。
- 要点:您可以设置以下默认行为:
- 列表:ACCEPT :接受所有传入的数据包,除了特定规则禁止的。
- 列表:REJECT :拒绝所有传入的数据包,除了特定规则允许的。当 firewalld 拒绝数据包时,会告知源机器有关拒绝的信息。
- 列表:DROP :丢弃所有传入的数据包,除了特定规则允许的。当 firewalld 丢弃数据包时,不会告知源机器有关丢弃数据包的信息。
- 列表:default :与 REJECT 相同,但隐式允许 Internet 控制消息协议(ICMP)。
- 列表:firewalld 服务在运行。
- 列表:列出特定区的信息以查看默认目标: # firewall-cmd --zone=zone-name --list-all
- 命令/配置摘录:
# firewall-cmd --zone=zone-name --list-all
# firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>1.6.8. 为特定区域自定义防火墙设置来增强安全性
- 要点:要增强网络安全性,请通过将特定的网络接口或连接到特定防火墙区来修改 firewalld 设置。通过为区域定义粒度规则,您可以根据安全需求控制入站和出站流量。
- 要点:例如,您可以取得以下好处:
- 列表:保护敏感数据
- 列表:防止未授权访问
- 列表:缓解潜在的网络威胁
- 列表:firewalld 服务在运行。
- 列表:列出可用的防火墙区域: # firewall-cmd --get-zones firewall-cmd --get-zones 命令显示系统上所有可用的区,但不显示特定区的详情。要查看所有区域的详情,请使用 firewall-cmd --list-all-zones 命令。
- 列表:选择您要用于此配置的区域。
- 命令/配置摘录:
# firewall-cmd --get-zones
# firewall-cmd --add-service=ssh --zone=<your_chosen_zone> # firewall-cmd --remove-service=ftp --zone=<same_chosen_zone>1.6.9. 使用 IP 集为允许列表配置动态更新
- 要点:您可以进行接近实时的更新,来灵活地允许 IP 集中特定的 IP 地址或范围,即使在无法预计的情况下也是如此。
- 要点:这些更新可以被各种事件触发,如检测安全威胁或更改网络行为。通常,此类解决方案利用自动化来减少手工工作,并通过快速响应情况来提高安全性。
- 列表:firewalld 服务在运行。
- 列表:创建一个有有意义名称的 IP 集: # firewall-cmd --permanent --new-ipset=allowlist --type=hash:ip 名为 allowlist 的新 IP 集包含您希望防火墙允许的 IP 地址。
- 列表:向 IP 集添加动态更新: # firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.10 此配置使用新添加的 IP 地址更新防火墙允许传输网络流量的allowlist IP 集。
- 列表:创建一个引用之前创建的 IP 集的防火墙规则: # firewall-cmd --permanent --zone=public --add-source=ipset:allowlist 如果没有此规则,IP 集不会影响网络流量,默认的防火墙策略则具有优先权。
- 列表:重新载入防火墙配置以应用更改: # firewall-cmd --reload
- 列表:列出所有 IP 集: # firewall-cmd --get-ipsets allowlist
- 命令/配置摘录:
# firewall-cmd --permanent --new-ipset=allowlist --type=hash:ip
# firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.101.6.10. 使用 Web 控制台启用区域
- 要点:您可以通过 RHEL 10 web 控制台对特定接口或 IP 地址范围应用预定义和现有防火墙区域。
- 要点:先决条件
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:您在 web 控制台中启用了 Administrative 访问权限。
- 列表:firewalld 服务在运行。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点 Networking。
- 列表:点 Edit rules and zones 按钮。
1.6.11. 使用 Web 控制台禁用区域
- 要点:您可以使用 Web 控制台从防火墙配置中删除防火墙区。
- 要点:先决条件
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:您在 web 控制台中启用了 Administrative 访问权限。
- 列表:firewalld 服务在运行。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点 Networking。
- 列表:点 Edit rules and zones 按钮。
1.7. 使用 firewalld控制网络流量
- 要点:firewalld 软件包安装了大量预定义的服务文件,您可以添加更多或自定义它们。然后,您可以使用这些服务定义为服务打开或关闭端口,而无需了解协议及它们使用的端口号。
1.7.1. 使用 CLI 控制预定义服务的流量
- 要点:控制流量的最简单的方法是在 firewalld 中添加预定义的服务。这会打开所有必需的端口并根据 服务定义文件 修改其他设置。
- 要点:先决条件
- 列表:firewalld 服务在运行。
- 列表:检查 firewalld 中的服务是否还没有被允许: # firewall-cmd --list-services ssh dhcpv6-client 命令列出在默认区域中启用的服务。
- 列表:列出 firewalld 中所有预定义的服务: # firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ... 命令显示默认区域的可用服务的列表。
- 列表:将服务添加到 firewalld 允许的服务的列表中: # firewall-cmd --add-service=<service_name> 命令将指定的服务添加到默认区域中。
- 列表:使新设置具有持久性: # firewall-cmd --runtime-to-permanent 命令将这些运行时更改应用到防火墙的永久配置中。默认情况下,它将这些更改应用到默认区域的配置中。
- 列表:列出所有永久的防火墙规则: # firewall-cmd --list-all --permanent public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 命令显示默认防火墙区域(public)的永久防火墙规则的完整配置。
- 命令/配置摘录:
# firewall-cmd --list-services ssh dhcpv6-client
# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...1.7.2. 使用 Web 控制台在防火墙上启用服务
- 要点:默认情况下,服务添加到默认防火墙区域。如果您在多个网络接口中使用更多防火墙区,您必须首先选择一个区,然后使用对应的端口添加服务。
- 要点:RHEL 10 web 控制台显示预定义的 firewalld 服务,您可以将其添加到活跃的防火墙区中。
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:您在 web 控制台中启用了 Administrative 访问权限。
- 列表:firewalld 服务在运行。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点 Networking。
- 列表:点 Edit rules and zones 按钮。
- 注意:重要 RHEL 10 web 控制台配置 firewalld 服务。 Web 控制台不允许没有在 web 控制台中列出的通用 firewalld 规则。
1.7.3. 使用 Web 控制台配置自定义端口
- 要点:您可以通过 RHEL web 控制台为服务添加自定义端口。
- 要点:先决条件
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:在 web 控制台中启用了 管理访问权限。
- 列表:firewalld 服务在运行。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点 Networking。
- 列表:点 Edit rules and zones 按钮。 如果没有看到 Edit rules and zones 按钮,使用管理员权限登录到 web 控制台。
- 注意:注意 您可以在每个字段中添加多个值。您必须使用逗号分隔的值,且没有空格,例如: 8080、8081、http
1.8. 在区域间过滤转发的流量
- 要点:您可以控制不同 firewalld 区域之间的网络数据流。通过定义规则和策略,您可以管理流量在这些区域之间移动时是如何被允许或被拒绝的。
- 要点:策略对象功能在 firewalld 中提供转发和输出过滤。您可以使用 firewalld 过滤不同区域之间的流量,以允许访问本地托管的虚拟机来连接主机。
1.8.1. 策略对象和区域之间的关系
- 要点:通过使用策略对象,您可以将 firewalld 的原语(如服务、端口和丰富的规则)附加到策略。您可以将策略对象应用到以有状态和单向的方式在区域间传输的流量上。
- 要点:HOST 和 ANY 是 ingress 和 egress 区域列表中使用的符号区域。
- 列表:HOST 符号区域对于来自运行 firewalld 的主机的流量,或具有到运行 firewalld 的主机的流量允许策略。
- 列表:ANY 符号区对所有当前和将来的区域应用策略。ANY 符号区域充当所有区域的通配符。
- 命令/配置摘录:
# firewall-cmd --permanent --new-policy myOutputPolicy # firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST # firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY1.8.2. 使用优先级对策略进行排序
- 要点:多个策略可应用到同一组流量。因此,使用优先级为可能应用的策略创建优先级顺序。
- 要点:流程
- 列表:设置优先级以对策略进行排序:
- 命令/配置摘录:
# *firewall-cmd --permanent --policy _mypolicy_ --set-priority _-500_*1.8.3. 使用策略对象过滤本地托管的容器和物理连接到主机的网络之间的流量
- 要点:您可以使用策略对象功能过滤 Podman 和 firewalld 区域之间的流量。
- 要点:流程
- 列表:创建一个新的防火墙策略: # firewall-cmd --permanent --new-policy podmanToAny
- 列表:阻止从 Podman 到其它区域的所有流量,并只允许 Podman 上必要的服务: # firewall-cmd --permanent --policy podmanToAny --set-target REJECT # firewall-cmd --permanent --policy podmanToAny --add-service dhcp # firewall-cmd --permanent --policy podmanToAny --add-service dns # firewall-cmd --permanent --policy podmanToAny --add-service https
- 列表:创建一个新的 Podman 区域: # firewall-cmd --permanent --new-zone=podman
- 列表:为策略定义 ingress 区域: # firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
- 列表:为所有其他区域定义 egress 区域: # firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY 将 egress 区域设置为 ANY 意味着您可以从 Podman 过滤到其他区域。如果要过滤到主机,请将 egress 区域设置为 HOST。
- 列表:重启 firewalld 服务: # systemctl restart firewalld
- 命令/配置摘录:
# firewall-cmd --permanent --new-policy podmanToAny
# firewall-cmd --permanent --policy podmanToAny --set-target REJECT # firewall-cmd --permanent --policy podmanToAny --add-service dhcp # firewall-cmd --permanent --policy podmanToAny --add-service dns # firewall-cmd --permanent --policy podmanToAny --add-service https- 注意:注意 红帽建议默认阻止所有流量,并打开 Podman 工具所需的可选择的服务。
1.8.4. 使用 firewalld 策略集配置路由器
- 要点:策略集合是可用于开始配置特定用例(如家路由器)的策略集合。然后,您可以对环境的配置进行微调。
- 要点:网关 策略集是一组配置,可启用伪装、连接跟踪帮助程序和区域之间的转发。
- 列表:将网络接口添加到区域。例如: 将连接到您的内部网络的接口添加到 internal 区: # firewall-cmd --permanent --zone internal --add-interface <internal_interface> 添加连接到外部网络的接口到 external 区: # firewall-cmd --permanent --zone external --add-interface <external_interface>
- 列表:将连接到您的内部网络的接口添加到 internal 区: # firewall-cmd --permanent --zone internal --add-interface <internal_interface>
- 列表:添加连接到外部网络的接口到 external 区: # firewall-cmd --permanent --zone external --add-interface <external_interface>
- 列表:启用 网关 策略集: # firewall-cmd --policy-set gateway --remove-disable
- 列表:使用策略集中的策略来配置区域之间的访问。例如,允许从互联网访问远程 SSH 到内部主机: # firewall-cmd --permanent --policy gateway-world-to-HOST --add-forward-port=port=2222:proto=tcp:toport=22:toaddr=192.0.2.1 网关 策略集提供以下策略: gateway-dmz-to-HOST 允许 dmz 区域中的主机访问网关上的某些服务,如 DHCP 和 DNS。 gateway-lan-to-work 允许来自 内部、主页 和 可信区域的所有流量,到 work 区域。另外,此策略启用了伪装和常见连接跟踪帮助程序。 g…
- 列表:激活 firewalld 配置: # firewall-cmd --reload
- 命令/配置摘录:
# firewall-cmd --permanent --zone internal --add-interface <internal_interface>
# firewall-cmd --permanent --zone external --add-interface <external_interface>1.8.5. 设置策略对象的默认目标
- 要点:您可以为策略指定 --set-target 选项。
- 要点:可用的目标如下:
- 列表:ACCEPT - 接受数据包
- 列表:DROP - 丢弃不需要的数据包
- 列表:REJECT - 拒绝不需要的数据包,并带有 ICMP 回复
- 列表:CONTINUE (默认)- 数据包遵循以下策略和区域中的规则。
- 列表:设置默认目标: # firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
- 列表:验证有关策略的信息 # firewall-cmd --info-policy mypolicy
- 命令/配置摘录:
# firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
# firewall-cmd --info-policy mypolicy1.9. 使用 firewalld配置 NAT
- 要点:使用 firewalld,您可以配置伪装、目标 NAT (DNAT)和重定向 NAT 类型。使用 NAT,您可以修改源或目标 IP 地址。
1.9.1. 网络地址转换类型
- 要点:如果您的网络中需要网络地址转换(NAT),了解 NAT 类型非常重要。
- 要点:这些是不同的 NAT 类型:
1.9.2. 配置 IP 地址伪装
- 要点:您可以在系统上启用 IP 伪装。在访问互联网时,IP 伪装会隐藏网关后面的单个机器。
- 要点:流程
- 列表:要检查是否启用了 IP 伪装(例如,对于 external 区),以 root 用户身份输入以下命令: # firewall-cmd --zone=external --query-masquerade 如果已启用,命令将会打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1。如果省略了 zone,firewalld 将使用默认区。
- 列表:要启用 IP 伪装,请以 root 用户身份输入以下命令: # firewall-cmd --zone=external --add-masquerade
- 列表:要使此设置持久,请将 --permanent 选项传给命令。
- 列表:要禁用 IP 伪装,请以 root 身份输入以下命令: # firewall-cmd --zone=external --remove-masquerade 要使此设置永久生效,请将 --permanent 选项传给命令。
- 命令/配置摘录:
# firewall-cmd --zone=external --query-masquerade
# firewall-cmd --zone=external --add-masquerade1.9.3. 使用 DNAT 转发传入的 HTTP 流量
- 要点:您可以使用目标网络地址转换(DNAT)将传入的流量从一个目标地址和端口定向到另一个目标地址和端口。通常,这对于将来自外部网络接口的传入请求重定向到特定的内部服务器或服务非常有用。
- 要点:先决条件
- 列表:firewalld 服务在运行。
- 列表:转发传入的 HTTP 流量: # firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent 之前的命令使用以下设置定义 DNAT 规则: --zone=public - 您为其配置 DNAT 规则的防火墙区域。您可以将其调整到您需要的任何区域。 --add-forward-port - 指示您正在添加端口转发规则的选项。 port=80 - 外部目标端口。 proto=tcp - 表示您转发 TCP 流量的协议。 toaddr=198.51.100.10 - 目标 IP 地…
- 列表:--zone=public - 您为其配置 DNAT 规则的防火墙区域。您可以将其调整到您需要的任何区域。
- 列表:--add-forward-port - 指示您正在添加端口转发规则的选项。
- 列表:port=80 - 外部目标端口。
- 列表:proto=tcp - 表示您转发 TCP 流量的协议。
- 命令/配置摘录:
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent
# firewall-cmd --reload1.9.4. 将来自非标准端口的流量重定向,以使 Web 服务在标准端口上可访问
- 要点:您可以使用重定向机制使在非标准端口上内部运行的 Web 服务可访问,而无需用户在 URL 中指定端口。
- 要点:如果您使用重定向,则 URL 更为简单,并提供更好的浏览体验,而非标准端口仍在内部或满足特定要求。
- 列表:firewalld 服务在运行。
- 列表:创建 NAT 重定向规则: # firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent 之前的命令使用以下设置定义 NAT 重定向规则: --zone=public - 您为其配置规则的防火墙区域。您可以将其调整到您需要的任何区域。 --add-forward-port=port=<non_standard_port> - 指示您正在使用最初接收传入流量的源端口添加端口转发(重定向)规则。 proto=tcp - 表示您重定向 TCP 流量的协议。 topo…
- 列表:--zone=public - 您为其配置规则的防火墙区域。您可以将其调整到您需要的任何区域。
- 列表:--add-forward-port=port=<non_standard_port> - 指示您正在使用最初接收传入流量的源端口添加端口转发(重定向)规则。
- 列表:proto=tcp - 表示您重定向 TCP 流量的协议。
- 列表:toport=<standard_port> - 目标端口,在源端口上收到传入流量后,应将其重定向到的端口。
- 命令/配置摘录:
# firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent
# firewall-cmd --reload1.10. 丰富规则的优先级
- 要点:富规则提供了一种更高级且更灵活的方法来定义防火墙规则。当服务、端口等服务不足以表达复杂的防火墙规则时,富规则特别有用。
- 要点:富规则背后的概念:
- 命令/配置摘录:
rule family="ipv4|ipv6" [conditions] [actions]1.10.1. priority 参数如何将规则组织到不同的链
- 要点:您可以在富规则中将 priority 参数设置为 -32768 和 32767 之间的任意数,较低的数值具有较高的优先级。
- 要点:firewalld 服务根据优先级值将规则组织到不同的链中:
- 列表:优先级低于 0:规则被重定向到带有 _pre 后缀的链中。
- 列表:优先级高于 0:规则被重定向到带有 _post 后缀的链中。
- 列表:优先级等于 0:根据操作,规则会被重定向到带有 _log、_deny 或 _allow 操作的链中。
1.10.2. 设置丰富的规则的优先级
- 要点:您可以使用 priority 参数记录其他规则不允许或拒绝的所有流量。例如,您可以使用此功能标记意外流量。
- 要点:流程
- 列表:添加一个带有非常低优先级的丰富规则来记录未由其他规则匹配的所有流量: # firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"' 这个命令还将日志条目数量限制为每分钟 5 条。详情请查看您系统上的"firewalld.richlanguage (5)手册页。
- 列表:显示命令在上一步中创建的 nftables 规则: # nft list chain inet firewalld filter_IN_public_post table inet firewalld { chain filter_IN_public_post { log prefix "UNEXPECTED: " limit rate 5/minute } }
- 命令/配置摘录:
# firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'
# nft list chain inet firewalld filter_IN_public_post table inet firewalld { chain filter_IN_public_post { log prefix "UNEXPECTED: " limit rate 5/minute } }1.11. 启用 firewalld 区域中不同接口或源之间的流量转发
- 要点:区域内转发是一个 firewalld 功能,它允许流量在 firewalld 区域内的接口或源间转发。
1.11.1. 区域内转发和默认目标设置为 ACCEPT 的区域间的区别
- 要点:启用区域内转发后,单个 firewalld 区域中的流量可以从一个接口或源流到另一个接口或源。区指定接口和源的信任级别。如果信任级别相同,流量会保持在同一区域内。
- 要点:firewalld 使用不同的区域管理传入和传出流量。每个区域都有自己的一组规则和行为。例如,可信 区域默认允许所有转发的流量。
- 注意:注意 在 firewalld 的默认区域中启用区域内转发仅适用于添加到当前默认区域的接口和源。
1.11.2. 使用区内转发来在以太网和 Wi-Fi 网络间转发流量
- 要点:您可以使用区内转发来在同一 firewalld 区内的接口和源之间转发流量。
- 要点:区内转发具有以下优点:
- 列表:有线设备和无线设备间的无缝连接(您可以在连接到 enp1s0 的以太网网络和连接到 wlp0s20 的 Wi-Fi 网络之间转发流量)
- 列表:支持灵活的工作环境
- 列表:可被网络中的多个设备或用户访问和使用的共享资源(如打印机、数据库、网络连接的存储等)
- 列表:高效的内部网络(如顺畅通信、减少的延迟、资源可访问性等)
- 列表:在内核中启用数据包转发: # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
- 列表:确保您要在其间启用区域内转发的接口只分配到 internal 区域: # firewall-cmd --get-active-zones
- 命令/配置摘录:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# firewall-cmd --get-active-zones1.12. 使用 RHEL 系统角色配置 firewalld
- 要点:RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供一个一致的配置接口,来一次远程管理多个系统。
- 要点:rhel-system-roles 软件包包含 rhel-system-roles.firewall RHEL 系统角色。此角色是为了自动化 firewalld 服务的配置而引入的。
- 列表:区域
- 列表:允许接收数据包的特定服务
- 列表:授予、拒绝或丢弃到端口的流量访问
- 列表:区域的端口或端口范围的转发
1.12.1. 使用 firewall RHEL 系统角色重置 firewalld 设置
- 要点:firewall RHEL 系统角色支持将 firewalld 设置重置为默认值。这会有效地删除不安全或非预期的防火墙规则,并简化管理。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replaced 示例 playbook 中指定的设置包括如下: previous: replaced 删除所有现有的用户定义的设置,并…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replaced
$ ansible-playbook --syntax-check ~/playbook.yml1.12.2. 使用 firewall RHEL 系统角色,将 firewalld 中的传入流量从一个本地端口转发到另一个本地端口
- 要点:您可以使用 firewall RHEL 系统角色远程配置将传入流量从一个本地端口转发到另一个本地端口。
- 要点:例如,如果您有一个环境,其中多个服务在同一台机器上共存,且需要同样的默认端口,则可能会出现端口冲突。这些冲突可能会破坏服务并导致停机。使用 firewall RHEL 系统角色,您可以高效地将流量转发到替代端口,以确保您的服务可以同时运行,而无需修改其配置。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime:…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime: true permanent: true
$ ansible-playbook --syntax-check ~/playbook.yml1.12.3. 使用 firewall RHEL 系统角色配置 firewalld DMZ 区域
- 要点:您可以使用 firewall RHEL 系统角色配置区来允许某些流量。例如,您可以使用 enp1s0 接口配置 dmz 区域,允许 HTTPS 流量让外部用户访问您的 web 服务器。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: e…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: true
$ ansible-playbook --syntax-check ~/playbook.yml1.12.4. 使用 firewall RHEL 系统角色创建自定义 firewalld 服务
- 要点:在 firewalld 中,服务是允许特定应用程序流量的规则集合。除了手动管理单个端口和协议外,管理员也可以使用服务名称打开流量。
- 要点:您可以使用 firewall RHEL 系统角色自动创建自定义服务文件,从而使防火墙配置更简单且更易于重复使用。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Create a firewalld service ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: service: custom_service short: A custom firewalld service description: …
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Create a firewalld service ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: service: custom_service short: A custom firewalld service description: >- A custom firewalld service that opens port 2222/tcp and the ports opened by the http and https firewalld services. port: 2222/tcp includes: - http - https state: present permanent: true
$ ansible-playbook --syntax-check ~/playbook.yml1.13. 加速 firewalld 转发流量
- 要点:firewalld 服务支持流性功能,这可以提高转发流量的性能。机制使用内核连接跟踪来绕过大多数网络堆栈。因此,您可以获得已建立连接的加速数据包。
- 要点:flowtable 机制有以下功能:
- 列表:使用连接跟踪来绕过典型的数据包转发路径。
- 列表:避免通过绕过经典数据包处理来重新访问路由表。
- 列表:只适用于 TCP 和 UDP 协议。
- 列表:硬件独立软件快速路径。
- 列表:启用流表功能: # sed -i 's/^NftablesFlowtable=.*/NftablesFlowtable=enp1s0 enp2s0/' /etc/firewalld/firewalld.conf 命令在 /etc/firewalld/firewalld.conf 文件中将 NftablesFlowtable 选项(默认为 off)设置为您要启用的流表的网络接口的列表。在本例中,NftablesFlowtable=enp1s0 enp2s0。
- 列表:重新载入防火墙配置,以使更改生效: # firewall-cmd --reload
- 命令/配置摘录:
# sed -i 's/^NftablesFlowtable=.*/NftablesFlowtable=enp1s0 enp2s0/' /etc/firewalld/firewalld.conf
# firewall-cmd --reload1.14. 使用 firewalld为流量分类配置区优先级
- 要点:使用区域优先级,您可以通过为 ingress 和 egress 流量指定优先级来控制数据包分类顺序。好处在于您可以在区域中指定流量分类顺序。
- 要点:无论源地址或接口是什么,区域 A 都可以在区域 B 之前考虑。具有较低优先级值的区域优先于具有更高优先级值的区域。此分类具有一个 ingress 优先级值和 egress 优先级值对。
1.14.1. 为区域中的两个流量类型设置相同的优先级值
- 要点:通过使用 --set-priority 选项,您可以在没有明确说明的情况下为 ingress 和 egress 流量分类设置一个通用值。
- 要点:流程
- 列表:创建一个新区: # firewall-cmd --permanent --new-zone=example-zone
- 列表:为具有 --set-priority 的 example-zone 区域设置一个通用区域优先级值: # firewall-cmd --permanent --zone example-zone --set-priority -10 通过设置较低的值来确保较高的优先级。这样可确保此区中两个流量类型配置的所有操作都优先于来自其他区的操作。
- 列表:将永久配置应用到运行时: # firewall-cmd --reload
- 列表:显示两个流量类型的优先级值: # firewall-cmd --permanent --info-zone example-zone example-zone target: default ingress-priority: -10 egress-priority: -10 ... icmp-block-inversion: no ... services: dhcpv6-client mdns samba-client ssh ... forward: yes masquerade: no ... 此设置可确保流量在其他区域之前分类到 example-zone 中。
- 命令/配置摘录:
# firewall-cmd --permanent --new-zone=example-zone
# firewall-cmd --permanent --zone example-zone --set-priority -101.14.2. 为区域中的每个流量类型设置不同的优先级值
- 要点:通过为 ingress 和 egress 流量设置不同的值,您可以为区域中流量分类设置优先级。
- 要点:流程
- 列表:创建一个新区: # firewall-cmd --permanent --new-zone=example-zone
- 列表:为具有 --set-ingress-priority 的 example-zone 区域中的 ingress 流量设置区域优先级值: # firewall-cmd --permanent --zone example-zone --set-ingress-priority -10
- 列表:为具有 --set-egress-priority 的 example-zone 中的 egress 流量设置区域优先级值: # firewall-cmd --permanent --zone example-zone --set-egress-priority 100
- 列表:将永久配置应用到运行时: # firewall-cmd --reload
- 列表:显示两个流量类型的优先级值: # firewall-cmd --permanent --info-zone example-zone example-zone (active) target: default ingress-priority: -10 egress-priority: 100 icmp-block-inversion: no interfaces: eth0 ... services: dhcpv6-client mdns samba-client ssh ... forward: yes masquerade: no ... 这些值表示在其它区域之前,ingress 流量在 example…
- 命令/配置摘录:
# firewall-cmd --permanent --new-zone=example-zone
# firewall-cmd --permanent --zone example-zone --set-ingress-priority -10第 2 章 nftables 入门
- 要点:如果您的场景不在 firewalld 涵盖的典型数据包过滤情况中,或者您希望完全控制规则,您可以使用 nftables 框架。
2.1. 什么是 nftables
- 要点:nftables 框架对数据包进行分类,它是 iptables、ip6tables、arptables、ebtables 和 ipset 工具的继承者。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
- 要点:nftables 框架使用表来存储链。链包含执行动作的独立规则。nft 工具替换了之前数据包过滤框架中的所有工具。您可以使用 libnftables 库,通过 libnftnl 库与 nftables Netlink API 进行低级交互。
- 列表:内置查找表而不是线性处理
- 列表:IPv4 和 IPv6 协议的单一框架
- 列表:通过事务,而不是获取、更新和存储整个规则集来更新内核规则集
- 列表:支持在规则集(nftrace)和监控追踪事件(nft)中调试和追踪
- 列表:更加一致和压缩的语法,没有特定协议的扩展
- 列表:用于第三方应用程序的 Netlink API
2.2. 何时使用 firewalld 或 nftables
- 要点:RHEL 提供 nftables 框架和 firewalld 服务来配置防火墙。
- 要点:在 Red Hat Enterprise Linux 上,您可以根据您的场景使用以下数据包过滤工具:
- 列表:firewalld :firewalld 工具简化了常见用例的防火墙配置。
- 列表:nftables: 使用 nftables 工具来配置复杂和性能关键的防火墙,如为整个网络配置。
- 注意:重要 要防止不同的与防火墙相关的服务(firewalld 或 nftables)相互影响,请在 RHEL 主机上只运行一个,并禁用其他服务。
2.3. nftables 框架中的概念
- 要点:nftables 框架是 iptables 的现代、高效且灵活的替代方案。它简化了规则管理并提高性能,使其成为复杂、高性能网络环境的更好的选择。
- 要点:nftables 中的基本链是数据包处理管道中高度可配置的入口点,允许用户指定以下内容:
- 列表:链的类型,如 "filter"
- 列表:数据包处理路径中的钩子点,例如 "input", "output", "forward"
- 列表:链的优先级
- 列表:iptables 之后是什么?当然,它的继任者是:nftables
- 列表:Firewalld:未来是 nftables
2.4. 创建和管理 nftables 表、链和规则
- 要点:您可以显示 nftables 规则集并管理它们。
2.4.1. nftables 表的基础知识
- 要点:nftables 中的表是一个包含链、规则、集合和其他对象集合的名字空间。
- 要点:每个表都必须分配一个地址系列。地址系列定义此表处理的数据包类型。在创建表时,您可以设置以下地址系列之一:
- 列表:ip :仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。
- 列表:ip6 :仅匹配 IPv6 数据包。
- 列表:inet :匹配 IPv4 和 IPv6 数据包。
- 列表:arp:匹配 IPv4 地址解析协议(ARP)数据包。
- 列表:bridge :匹配通过网桥设备的数据包。
- 列表:netdev :匹配来自入口的数据包。
- 命令/配置摘录:
table <table_address_family> <table_name> { }
nft add table <table_address_family> <table_name>2.4.2. nftables 链的基础知识
- 要点:表包含链,而链又是规则的容器。存在以下两种链类型:
- 要点:如果要向表中添加基本链,所使用的格式取决于您的防火墙脚本:
- 列表:Base chain :基本链充当来自网络堆栈的数据包的入口点。
- 列表:Regular chain :您可以使用常规链作为 jump 目标,来更好地组织规则。
- 列表:在原生语法的脚本中,使用: table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> policy <policy> ; } }
- 列表:在 shell 脚本中,使用: nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; } 为了避免 shell 将分号解释为命令的结尾,请将 \ 转义字符放在分号前面。
- 列表:accept (默认)
- 列表:drop
- 命令/配置摘录:
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> policy <policy> ; } }
nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }- 表格样本(共 4 行):
- 类型 | 地址系列 | 钩子 | 描述
- filter | all | all | 标准链类型
- nat | ip,ip6,inet | prerouting、input、output、postrouting | 这个类型的链根据连接跟踪条目执行原生地址转换。只有连接的第一个数据包会通过。
- route | ip,ip6 | output | 如果 IP 头的相关部分已更改,则接受的遍历此链类型的数据包会导致新的路由查找。
2.4.3. nftables 规则的基础知识
- 要点:规则定义对通过包含此规则的链的数据包执行的操作。如果规则还包含匹配表达式,则 nftables 仅在所有之前的表达式都应用时才执行操作。
- 要点:如果要在链中添加一条规则,所使用的格式取决于您的防火墙脚本:
- 列表:在原生语法的脚本中,使用: table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; <rule> } }
- 列表:在 shell 脚本中,使用: nft add rule <table_address_family> <table_name> <chain_name> <rule> 此 shell 命令在链的末尾附加新规则。如果要在链的开头添加一条规则,请使用 nft insert 命令而不是 nft add。
- 命令/配置摘录:
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; <rule> } }
nft add rule <table_address_family> <table_name> <chain_name> <rule>2.4.4. 使用 nft 命令管理表、链和规则
- 要点:要在命令行上或 shell 脚本中管理 nftables 防火墙,请使用 nft 工具。
- 要点:流程
- 列表:创建一个带有 inet 地址系列的名为 nftables_svc 的表,以便表可以处理 IPv4 和 IPv6 数据包: # nft add table inet nftables_svc
- 列表:将处理传入网络流量的、名为 INPUT 的基本链添加到 inet nftables_svc 表中: # nft add chain inet nftables_svc INPUT { type filter hook input priority filter ; policy accept ; } 为了避免 shell 将分号解释为命令的结尾,请使用 \ 字符转义分号。
- 列表:向 INPUT 链添加规则。例如,允许端口 22 和 443 上的传入 TCP 流量,并作为 INPUT 链的最后一条规则,拒绝其他传入的流量,并伴有互联网控制消息协议(ICMP)端口无法访问的消息: # nft add rule inet nftables_svc INPUT tcp dport 22 accept # nft add rule inet nftables_svc INPUT tcp dport 443 accept # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable 如果您输入 nft add rule 命…
- 列表:显示包括句柄的当前规则集: # nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 reject # handle 4 } }
- 列表:在句柄为 3 的现有规则前面插入一条规则。例如,要插入一个允许端口 636 上 TCP 流量的规则,请输入: # nft insert rule inet nftables_svc INPUT handle 3 tcp dport 636 accept
- 列表:在句柄为 3 的现有规则后面附加一条规则。例如,要插入一个允许端口 80 上 TCP 流量的规则,请输入: # nft add rule inet nftables_svc INPUT handle 3 tcp dport 80 accept
- 命令/配置摘录:
# nft add table inet nftables_svc
# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }- 注意:重要 此流程中的命令不代表典型的工作流,且没有被优化。此流程只演示了如何使用 nft 命令来管理表、链和规则。
- 注意:注意 要删除整个规则集,请使用 nft flush ruleset 命令,而不是在单独的命令中手动删除所有规则、链和表。
2.5. 使用 nftables 配置 NAT
- 要点:使用 nftables,您可以配置伪装、源(SNAT)、目标 NAT (DNAT)和重定向类型。使用 NAT,您可以修改源或目标 IP 地址。
2.5.1. NAT 类型
- 要点:nftables 框架支持不同的网络地址转换(NAT)类型。
- 要点:使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商(ISP)不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,用户应该能够访问互联网上的服务器,请将来自这些范围的数据包的源 IP 地址映射为公共 IP 地址。
- 列表:伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
- 列表:SNAT 将数据包的源 IP 地址设置为指定的 IP 地址,且不会动态查找传出接口的 IP 地址。因此,SNAT 要比伪装更快。如果传出接口使用了固定 IP 地址,则使用 SNAT。
2.5.2. 使用 nftables配置伪装
- 要点:伪装使路由器动态地更改通过接口到接口 IP 地址发送的数据包的源 IP。这意味着,如果接口被分配了一个新 IP,nftables 会在替换源 IP 时自动使用新的 IP。
- 要点:将通过 ens3 接口离开主机的数据包源 IP 替换为 ens3 上设置的 IP。
- 列表:创建一个表: # nft add table nat
- 列表:将 postrouting 链添加到表中: # nft add chain nat postrouting { type nat hook postrouting priority 100 ; }
- 列表:向 postrouting 链中添加一条规则,来匹配 ens3 接口上传出的数据包: # nft add rule nat postrouting oifname "ens3" masquerade 重要 您只能在 iifname 和 oifname 参数中使用实际的接口名称,不支持替代名称(altname)。
- 命令/配置摘录:
# nft add table nat
# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }- 注意:重要 您只能在 iifname 和 oifname 参数中使用实际的接口名称,不支持替代名称(altname)。
2.5.3. 使用 nftables 配置源 NAT
- 要点:在路由器上,您可以使用 Source NAT (SNAT)将通过接口发送的数据包 IP 更改为特定的 IP 地址。然后,路由器会替换传出数据包的源 IP。
- 要点:流程
- 列表:创建一个表: # nft add table nat
- 列表:将 postrouting 链添加到表中: # nft add chain nat postrouting { type nat hook postrouting priority 100 ; }
- 列表:向 postrouting 链中添加一条规则,该规则将使用 192.0.2.1 替换通过ens3 的传出数据包的源 IP : # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
- 命令/配置摘录:
# nft add table nat
# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }2.5.4. 使用 nftables 配置目标 NAT
- 要点:使用目标 NAT (DNAT)将路由器上的流量重定向到无法从互联网访问的主机。
- 要点:例如,有了 DNAT,路由器将发送给端口 80 和 443 的传入流量重定向到 IP 地址为 192.0.2.1 的 Web 服务器。
- 列表:创建一个表: # nft add table nat
- 列表:向表中添加 prerouting 和 postrouting 链: # nft -- add chain nat prerouting { type nat hook prerouting priority -100 ; } # nft add chain nat postrouting { type nat hook postrouting priority 100 ; } 请注意,您必须将 -- 选项传递给 nft 命令,以防止 shell 将负优先级值解释为 nft 命令的选项。
- 列表:向 prerouting 链中添加一条规则,该规则将路由器的 ens3 接口上端口 80 和 443 的传入流量重定向到 IP 地址为 192.0.2.1 的 web 服务器: # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
- 列表:根据您的环境,添加 SNAT 或伪装规则,将从 Web 服务器返回的数据包的源地址改为发送者: 如果 ens3 接口使用动态 IP 地址,请添加一条伪装规则: # nft add rule nat postrouting oifname "ens3" masquerade 如果 ens3 接口使用静态 IP 地址,请添加一条 SNAT 规则。例如,如果 ens3 使用 198.51.100.1 IP 地址: # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
- 列表:如果 ens3 接口使用动态 IP 地址,请添加一条伪装规则: # nft add rule nat postrouting oifname "ens3" masquerade
- 列表:如果 ens3 接口使用静态 IP 地址,请添加一条 SNAT 规则。例如,如果 ens3 使用 198.51.100.1 IP 地址: # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
- 命令/配置摘录:
# nft add table nat
# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }2.5.5. 使用 nftables 配置重定向
- 要点:重定向 功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。
- 要点:例如,您可以将发送到本地主机端口 22 的流量重定向到端口 2222。
- 列表:创建一个表: # nft add table nat
- 列表:向表中添加 prerouting 链: # nft -- add chain nat prerouting { type nat hook prerouting priority -100 ; } 请注意,您必须将 -- 选项传递给 nft 命令,以防止 shell 将负优先级值解释为 nft 命令的选项。
- 列表:向 prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222 : # nft add rule nat prerouting tcp dport 22 redirect to 2222
- 列表:NAT 类型
- 命令/配置摘录:
# nft add table nat
# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }2.6. 编写并运行 nftables 脚本
- 要点:使用 nftables 框架的主要优点是脚本的执行是原子的。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。
- 要点:另外,使用 nftables 脚本环境时,您可以:
- 列表:添加评论
- 列表:定义变量
- 列表:包含其他规则集文件
2.6.1. 支持的 nftables 脚本格式
- 要点:nftables 框架支持不同格式的脚本。
- 要点:您可以使用以下格式:
- 列表:与 nft list ruleset 命令相同的格式显示规则集: #!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connectio…
- 列表:与 nft 命令的语法相同: #!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; po…
- 命令/配置摘录:
#!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connections to port 22 (ssh) tcp dport ssh accept } }
#!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; } # Add a rule that accepts connections to port 22 (ssh) add rule inet example_table example_chain tcp dport ssh accept2.6.2. 运行 nftables 脚本
- 要点:您可以通过将脚本传递给 nft 实用程序或直接执行脚本来运行 nftables 脚本。
- 要点:流程
- 列表:要通过将其传给 nft 工具来运行 nftables 脚本,请输入: # nft -f /etc/nftables/<example_firewall_script>.nft
- 列表:要直接运行 nftables 脚本: 在进行这个时间时: 确保脚本以以下 shebang 序列开头: #!/usr/sbin/nft -f 重要 如果省略了 -f 参数,nft 工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。 可选:将脚本的所有者设为 root : # chown root /etc/nftables/<example_firewall_script>.nft 使脚本可以被其所有者执行: # chmod u+x /etc/nftables/<example_firewall_script>.nft 运行脚本: # /et…
- 列表:在进行这个时间时: 确保脚本以以下 shebang 序列开头: #!/usr/sbin/nft -f 重要 如果省略了 -f 参数,nft 工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。 可选:将脚本的所有者设为 root : # chown root /etc/nftables/<example_firewall_script>.nft 使脚本可以被其所有者执行: # chmod u+x /etc/nftables/<example_firewall_script>.nft
- 列表:确保脚本以以下 shebang 序列开头: #!/usr/sbin/nft -f 重要 如果省略了 -f 参数,nft 工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。
- 列表:可选:将脚本的所有者设为 root : # chown root /etc/nftables/<example_firewall_script>.nft
- 列表:使脚本可以被其所有者执行: # chmod u+x /etc/nftables/<example_firewall_script>.nft
- 命令/配置摘录:
# nft -f /etc/nftables/<example_firewall_script>.nft
#!/usr/sbin/nft -f- 注意:重要 如果省略了 -f 参数,nft 工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。
- 注意:重要 即使 nft 成功运行脚本,在脚本中错误放置的规则、缺失的参数或其他问题都可能导致防火墙的行为不如预期。
2.6.3. 使用 nftables 脚本中的注释
- 要点:nftables 脚本环境将 # 字符右侧的所有内容解释为行尾。
- 要点:注释可在行首或命令旁边开始:
- 命令/配置摘录:
... # Flush the rule set flush ruleset add table inet example_table # Create a table ...2.6.4. 使用 nftables 脚本中的变量
- 要点:要在 nftables 脚本中定义一个变量,请使用 define 关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用 set 或 verdict 映射。
- 要点:以下示例定义了一个名为 INET_DEV 的变量,其值为 enp1s0 :
- 列表:使用 nftables 命令中的设置
- 列表:在 nftables 命令中使用 verdict 映射
- 命令/配置摘录:
define INET_DEV = enp1s0
... add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept ...- 注意:注意 当您在规则中使用大括号时具有特殊的语义,因为它们表示变量代表一个集合。
2.6.5. 在 nftables 脚本中包含文件
- 要点:在 nftables 脚本环境中,您可以使用 include 语句包含其他脚本。
- 要点:如果您只指定一个没有绝对路径或相对路径的文件名,那么 nftables 将包含默认搜索路径中的文件,该搜索路径在 RHEL 上被设置为 /etc。
- 命令/配置摘录:
include "example.nft"
include "/etc/nftables/rulesets/*.nft"2.6.6. 系统引导时自动载入 nftables 规则
- 要点:nftables systemd 服务加载包含在 /etc/sysconfig/nftables.conf 文件中的防火墙脚本。
- 要点:先决条件
- 列表:nftables 脚本存储在 /etc/nftables/ 目录中。
- 列表:编辑 /etc/sysconfig/nftables.conf 文件。 如果您使用 nftables 软件包的安装修改了在 /etc/nftables/ 中创建的 *.nft 脚本,请取消对这些脚本的 include 语句的注释。 如果您编写了新脚本,请添加 include 语句以包含这些脚本。例如,要在 nftables 服务启动时加载 /etc/nftables/example.nft 脚本,请添加: include "/etc/nftables/example.nft"
- 列表:如果您使用 nftables 软件包的安装修改了在 /etc/nftables/ 中创建的 *.nft 脚本,请取消对这些脚本的 include 语句的注释。
- 列表:如果您编写了新脚本,请添加 include 语句以包含这些脚本。例如,要在 nftables 服务启动时加载 /etc/nftables/example.nft 脚本,请添加: include "/etc/nftables/example.nft"
- 列表:可选:启动 nftables 服务来加载防火墙规则,而无需重启系统: # systemctl start nftables
- 列表:启用 nftables 服务。 # systemctl enable nftables
- 命令/配置摘录:
include "/etc/nftables/example.nft"
# systemctl start nftables2.7. 使用 nftables 命令中的设置
- 要点:nftables 框架原生支持集合。例如,您可以使用集合匹配多个 IP 地址、端口号、接口或其他匹配标准。
2.7.1. 在 nftables 中使用匿名集合
- 要点:匿名集合包含用逗号分开的值,如 { 22、80、443 },它们直接在规则中使用。您还可以将匿名集合用于 IP 地址以及任何其他匹配标准。
- 要点:匿名集合的缺陷是,如果要更改集合,则需要替换规则。对于动态解决方案,使用命名集合,如 在 nftables 中使用命名集合 中所述。
- 列表:inet 系列中的 example_chain 链和 example_table 表存在。
- 列表:例如,要向 example_table 中的 example_chain 添加一条规则,其允许传入流量到端口 22、80 和 443 : # nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
- 列表:可选: 在 example_table 中显示所有链及其规则: # nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport { ssh, http, https } accept } }
- 命令/配置摘录:
# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport { ssh, http, https } accept } }2.7.2. 在 nftables 中使用命名集
- 要点:nftables 框架支持可变命名集合。命名集是您可以在表中的多个规则中使用的范围的一个列表。匿名集合的另外一个好处在于,您可以更新命名的集合而不必替换使用集合的规则。
- 要点:当您创建一个命名集时,必须指定集合包含的元素类型。您可以设置以下类型:
- 列表:包含 IPv4 地址或范围的集合的 ipv4_addr,如 192.0.2.1 或 192.0.2.0/24。
- 列表:包含 IPv6 地址或范围的集合的 ipv6_addr,如 2001:db8:1::1 或 2001:db8:1::/64。
- 列表:包含介质访问控制(MAC)地址列表的集合的 ether_addr ,如 52:54:00:6b:66:42。
- 列表:包含互联网协议类型列表的集合的 inet_proto,如 tcp。
- 列表:包含互联网服务列表的集合的 inet_service,如 ssh。
- 列表:包含数据包标记列表的集合的 mark。数据包标记可以是任意正 32 位整数值(0 到 2147483647)。
- 命令/配置摘录:
# nft add set inet example_table example_set { type ipv4_addr \; }
# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }- 注意:重要 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。
2.7.3. 使用动态集添加来自数据包路径的条目
- 要点:nftables 中的动态设置会自动添加元素,如来自数据包数据的 IP 地址、端口和 MAC 地址。这可让实时数据收集创建动态拒绝或禁止列表,立即响应安全威胁。
- 要点:先决条件
- 列表:inet 系列中的 example_chain 链和 example_table 表存在。
- 列表:创建一个空集。以下示例为 IPv4 地址创建了一个集合: 要创建可存储多个独立 IPv4 地址的集合: # nft add set inet example_table example_set { type ipv4_addr ; } 要创建可存储 IPv4 地址范围的集合: # nft add set inet example_table example_set { type ipv4_addr ; flags interval ; } 重要 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。
- 列表:要创建可存储多个独立 IPv4 地址的集合: # nft add set inet example_table example_set { type ipv4_addr ; }
- 列表:要创建可存储 IPv4 地址范围的集合: # nft add set inet example_table example_set { type ipv4_addr ; flags interval ; } 重要 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。
- 列表:创建一条规则,将传入数据包的源 IPv4 地址添加到 example_set 集中: # nft add rule inet example_table example_chain set add ip saddr @example_set 命令在 example_chain 规则链和 example_table 中创建了一个新规则,来将数据包的源 IPv4 地址动态添加到 example_set 中。
- 列表:确保规则已添加: # nft list ruleset ... table ip example_table { set example_set { type ipv4_addr elements = { 192.0.2.250, 192.0.2.251 } } chain example_chain { type filter hook input priority 0 add @example_set { ip saddr } } } 命令显示当前在 nftables 中加载的整个规则集。它显示 IP 正在主动触发规则,并且正在使用相关地址更新 example_set。
- 命令/配置摘录:
# nft add set inet example_table example_set { type ipv4_addr \; }
# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }- 注意:重要 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。
2.8. 在 nftables 命令中使用判决映射
- 要点:判决映射(也称为字典),使 nft 能够通过将匹配条件映射到某个操作来根据数据包信息执行操作。
2.8.1. 在 nftables 中使用匿名映射
- 要点:匿名映射是直接在规则中使用的 { match_criteria : action } 语句。这个语句可以包含多个用逗号分开的映射。
- 要点:匿名映射的缺点是,如果要修改映射,则必须替换规则。对于动态解决方案,请使用命名映射,如 在 nftables 中使用命名映射 中所述。
- 列表:创建新表: # nft add table inet example_table
- 列表:在 example_table 中创建 tcp_packets 链: # nft add chain inet example_table tcp_packets
- 列表:向统计此链中流量的 tcp_packets 中添加一条规则: # nft add rule inet example_table tcp_packets counter
- 列表:在 example_table 中创建 udp_packets 链 # nft add chain inet example_table udp_packets
- 列表:向统计此链中流量的 udp_packets 中添加一条规则: # nft add rule inet example_table udp_packets counter
- 列表:为传入的流量创建一个链。例如,要在过滤传入的流量的 example_table 中创建一个名为 incoming_traffic 的链: # nft add chain inet example_table incoming_traffic { type filter hook input priority 0 ; }
- 命令/配置摘录:
# nft add table inet example_table
# nft add chain inet example_table tcp_packets2.8.2. 在 nftables 中使用命名映射
- 要点:nftables 框架支持命名映射。您可以在表中的多个规则中使用这些映射。匿名映射的另一个好处在于,您可以更新命名映射而不比替换使用它的规则。
- 要点:在创建命名映射时,您必须指定元素的类型:
- 列表:匹配部分包含 IPv4 地址的映射的 ipv4_addr,如 192.0.2.1。
- 列表:匹配部分包含 IPv6 地址的映射的 ipv6_addr,如 2001:db8:1::1。
- 列表:匹配部分包含介质访问控制(MAC)地址的映射的ether_addr ,如 52:54:00:6b:66:42。
- 列表:匹配部分包含互联网协议类型的映射的 inet_proto,如 tcp。
- 列表:匹配部分包含互联网服务名称端口号的映射的 inet_service,如 ssh 或 22。
- 列表:匹配部分包含数据包的映射的 mark 。数据包标记可以是任意正 32 位整数值(0 到 2147483647)。
- 命令/配置摘录:
# nft add table ip example_table
# nft add chain ip example_table example_chain { type filter hook input priority 0 \; }- 注意:重要 要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。
2.9. 示例:使用 nftables 脚本保护 LAN 和 DMZ
- 要点:使用 RHEL 路由器上的 nftables 框架来编写和安装防火墙脚本,来保护内部 LAN 中的网络客户端和 DMZ 中的 Web 服务器免受来自互联网和其他网络的未授权访问。
- 注意:重要 这个示例仅用于演示目的,描述了一个具有特定要求的场景。 防火墙脚本高度依赖网络基础架构和安全要求。当您为自己的环境编写脚本时,请使用此示例了解 nftables 防火墙的概念。
2.9.1. 网络条件
- 要点:本例中的网络具有以下条件:
- 要点:路由器连接到以下网络:
- 列表:路由器连接到以下网络: 互联网通过接口 enp1s0 内部 LAN 通过接口 enp7s0 DMZ 通过 enp8s0
- 列表:互联网通过接口 enp1s0
- 列表:内部 LAN 通过接口 enp7s0
- 列表:DMZ 通过 enp8s0
- 列表:路由器的互联网接口分配了静态 IPv4 地址(203.0.113.1)和 IPv6 地址(2001:db8🅰️:1)。
- 列表:内部 LAN 中的客户端仅使用范围 10.0.0.0/24 中的专用 IPv4 地址。因此,从 LAN 到互联网的流量需要源网络地址转换(SNAT)。
2.9.2. 防火墙脚本的安全要求
- 要点:以下是示例网络中 nftables 防火墙的要求。
- 要点:路由器必须能够:
- 列表:路由器必须能够: 递归解析 DNS 查询。 在回环接口上执行所有连接。
- 列表:递归解析 DNS 查询。
- 列表:在回环接口上执行所有连接。
- 列表:内部 LAN 中的客户端必须能够: 查询运行在路由器上的缓存 DNS 服务器。 访问 DMZ 中的 HTTPS 服务器。 访问互联网上的任何 HTTPS 服务器。
- 列表:查询运行在路由器上的缓存 DNS 服务器。
- 列表:访问 DMZ 中的 HTTPS 服务器。
2.9.3. 配置将丢弃的数据包记录到文件
- 要点:默认情况下,systemd 会将内核消息如,丢弃的数据包,记录到日志中。另外,您可以配置 rsyslog 服务,来将此类条目记录到单独的文件中。为确保日志文件不会无限增长,请配置轮转策略。
- 要点:先决条件
- 列表:rsyslog 软件包已安装。
- 列表:rsyslog 服务正在运行。
- 列表:使用以下内容创建 /etc/rsyslog.d/nftables.conf 文件: :msg, startswith, "nft drop" -/var/log/nftables.log & stop 使用这个配置,rsyslog 服务会将丢弃的数据包记录到 /var/log/nftables.log 文件,而不是 /var/log/messages。
- 列表:重启 rsyslog 服务: # systemctl restart rsyslog
- 列表:使用以下内容创建 /etc/logrotate.d/nftables 文件,以便在大小超过 10 MB 时轮转 /var/log/nftables.log : /var/log/nftables.log { size +10M maxage 30 sharedscripts postrotate /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true endscript } maxage 30 设置定义了 logrotate 在下一次轮转操作过程中删除超过 30 天的轮转日志。
- 命令/配置摘录:
:msg, startswith, "nft drop" -/var/log/nftables.log & stop
# systemctl restart rsyslog2.9.4. 编写并激活 nftables 脚本
- 要点:本例是运行在 RHEL 路由器上的一个 nftables 防火墙脚本,其保护内部 LAN 中的客户端以及 DMZ 中的 Web 服务器。
- 要点:有关示例中使用的防火墙的网络和要求的详情,请参阅 网络条件 和 对防火墙脚本的安全要求 。
- 列表:网络已配置,如 网络条件 中所述。
- 列表:使用以下内容创建 /etc/nftables/firewall.nft 脚本: # Remove all rules flush ruleset # Table for both IPv4 and IPv6 rules table inet nftables_svc { # Define variables for the interface name define INET_DEV = enp1s0 define LAN_DEV = enp7s0 define DMZ_DEV = enp8s0 # Set with the IPv4 addresses of admin PCs set admin_pc_ipv4 {…
- 列表:在 /etc/sysconfig/nftables.conf 文件中包括 /etc/nftables/firewall.nft 脚本: include "/etc/nftables/firewall.nft"
- 列表:启用 IPv4 转发: # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
- 列表:启用并启动 nftables 服务: # systemctl enable --now nftables
- 列表:可选:验证 nftables 规则集: # nft list ruleset ...
- 命令/配置摘录:
# Remove all rules flush ruleset # Table for both IPv4 and IPv6 rules table inet nftables_svc { # Define variables for the interface name define INET_DEV = enp1s0 define LAN_DEV = enp7s0 define DMZ_DEV = enp8s0 # Set with the IPv4 addresses of admin PCs set admin_pc_ipv4 { type ipv4_addr elements = { 10.0.0.100, 10.0.0.200 } } # Chain for incoming traffic. Default policy: drop chain INPUT { type filter hook input priority filter policy drop # Accept packets in established and related state, drop invalid packets ct state vmap { established:accept, related:accept, invalid:drop } # Accept incoming traffic on loopback interface …
include "/etc/nftables/firewall.nft"- 注意:警告 此 nftables 防火墙脚本仅用于演示目的。不要在未经调整为适合您环境和安全要求的情况下使用它。
2.10. 使用 nftables 限制连接数量
- 要点:您可以使用 nftables 来限制连接数或限制到建立给定数量连接的块 IP 地址,以防止它们使用太多的系统资源。
2.10.1. 使用 nftables限制连接数量
- 要点:通过使用 nft 工具的 ct count 参数,您可以限制每个 IP 地址的同时连接的数量。例如,您可以使用此功能配置每个源 IP 地址只能建立两个到主机的并行 SSH 连接。
- 要点:流程
- 列表:创建带有 inet 地址系列的 filter 表: # nft add table inet filter
- 列表:将 input 链添加到 inet filter 表中: # nft add chain inet filter input { type filter hook input priority 0 ; }
- 列表:为 IPv4 地址创建动态集合: # nft add set inet filter limit-ssh { type ipv4_addr; flags dynamic ;}
- 列表:在 input 链中添加一条规则,该规则只允许从 IPv4 地址到 SSH 端口(22)的两个同时的传入连接,并拒绝来自同一 IP 的所有进一步的连接: # nft add rule inet filter input tcp dport ssh ct state new add @limit-ssh { ip saddr ct count over 2 } counter reject
- 列表:建立从同一 IP 地址到主机的两个以上的同时的 SSH 连接。如果已经建立了两个连接,则 nftables 会拒绝到 SSH 端口的连接。
- 列表:显示 limit-ssh 动态集: # nft list set inet filter limit-ssh table inet filter { set limit-ssh { type ipv4_addr size 65535 flags dynamic elements = { 192.0.2.1 ct count over 2 , 192.0.2.2 ct count over 2 } } } elements 条目显示当前与该规则匹配的地址。在本例中,elements 列出了与 SSH 端口有活动连接的 IP 地址。请注意,输出不会显示活跃连接的数量,或者连接是否被拒绝。
- 命令/配置摘录:
# nft add table inet filter
# nft add chain inet filter input { type filter hook input priority 0 \; }2.10.2. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址
- 要点:您可以临时阻止在一分钟内建立十个 IPv4 TCP 连接的主机。
- 要点:流程
- 列表:创建具有 ip 地址系列的 filter 表: # nft add table ip filter
- 列表:向 filter 表中添加 input 链: # nft add chain ip filter input { type filter hook input priority 0 ; }
- 列表:在 filter 表中添加一个名为 denylist 的集合: # nft add set ip filter denylist { type ipv4_addr ; flags dynamic, timeout ; timeout 5m ; } 这个命令为 IPv4 地址创建动态设置。timeout 5m 参数定义 nftables 在五分钟后自动删除条目,以防止集合被过时的条目填满。
- 列表:添加一条规则,该规则将在一分钟内试图建立十多个新 TCP 连接的主机源 IP 地址添加到 denylist 集中: # nft add rule ip filter input ip protocol tcp ct state new, untracked add @denylist { ip saddr limit rate over 10/minute } drop
- 列表:在 nftables 中使用命名集
- 命令/配置摘录:
# nft add table ip filter
# nft add chain ip filter input { type filter hook input priority 0 \; }2.11. 调试 nftables 规则
- 要点:nftables 框架为管理员提供了不同的选项来调试规则,以及数据包是否匹配。
2.11.1. 创建带有计数器的规则
- 要点:在识别规则是否匹配时,可以使用计数器。
- 要点:先决条件
- 列表:您要添加该规则的链已存在。
- 列表:向链中添加一条带有 counter 参数的新规则。以下示例添加一个带有计数器的规则,它允许端口 22 上的 TCP 流量,并计算与这个规则匹配的数据包和网络数据的数量: # nft add rule inet example_table example_chain tcp dport 22 counter accept
- 列表:显示计数器值: # nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
- 命令/配置摘录:
# nft add rule inet example_table example_chain tcp dport 22 counter accept
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }2.11.2. 在现有规则中添加计数器
- 要点:在识别规则是否匹配时,可以使用计数器。
- 要点:先决条件
- 列表:您要添加计数器的规则已存在。
- 列表:在链中显示规则及其句柄: # nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
- 列表:通过使用 counter 参数替换规则来添加计数器。以下示例替换了上一步中显示的规则并添加计数器: # nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
- 列表:显示计数器值: # nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
- 命令/配置摘录:
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
# nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept2.11.3. 监控与现有规则匹配的数据包
- 要点:要显示与某个规则匹配的数据包,您可以使用 nftables 中的追踪功能与 nft monitor 命令结合使用。您可以为规则启用追踪,并使用它来监控与此规则匹配的数据包。
- 要点:先决条件
- 列表:您要添加计数器的规则已存在。
- 列表:在链中显示规则及其句柄: # nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
- 列表:通过使用 meta nftrace set 1 参数替换规则来添加追踪功能。以下示例替换了上一步中显示的规则并启用追踪: # nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
- 列表:使用 nft monitor 命令来显示追踪。以下示例过滤了命令的输出,来只显示包含 inet example_table example_chain 的条目: # nft monitor | grep "inet example_table example_chain" trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 …
- 命令/配置摘录:
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
# nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept- 注意:警告 根据启用了追踪的规则数量以及匹配流量的数量,nft monitor 命令可以显示很多输出。使用 grep 或其他工具来过滤输出。
2.12. 备份和恢复 nftables 规则集
- 要点:您可以将 nftables 规则备份到文件,并稍后恢复它们。此外,管理员可以使用带有规则的文件,来将规则传给其他服务器。
2.12.1. 将 nftables 规则集备份到文件
- 要点:您可以使用 nft 工具将 nftables 规则集备份到文件。
- 要点:流程
- 列表:要备份 nftables 规则: 以 nft list ruleset 格式生成的格式: # nft list ruleset > file.nft JSON 格式: # nft -j list ruleset > file.json
- 列表:以 nft list ruleset 格式生成的格式: # nft list ruleset > file.nft
- 列表:JSON 格式: # nft -j list ruleset > file.json
- 命令/配置摘录:
# nft list ruleset > file.nft
# nft -j list ruleset > file.json2.12.2. 从文件中恢复 nftables 规则集
- 要点:您可以从文件恢复 nftables 规则集。
- 要点:流程
- 列表:要恢复 nftables 规则: 如果要恢复的文件是 nft list ruleset 生成的格式,或直接包含 nft 命令: # nft -f file.nft 如果要恢复的文件采用 JSON 格式: # nft -j -f file.json
- 列表:如果要恢复的文件是 nft list ruleset 生成的格式,或直接包含 nft 命令: # nft -f file.nft
- 列表:如果要恢复的文件采用 JSON 格式: # nft -j -f file.json
- 命令/配置摘录:
# nft -f file.nft
# nft -j -f file.json2.13. 使用 flowtables 加快 nftables 数据包转发
- 要点:nftables 工具使用 Netfilter 框架,它提供基于快速路径特性的 流表 机制来加快已建立连接的数据包。
- 要点:flowtable 机制有以下功能:
- 列表:使用连接跟踪来绕过典型的数据包转发路径。
- 列表:避免通过绕过经典数据包处理来重新访问路由表。
- 列表:只适用于 TCP 和 UDP 协议。
- 列表:硬件独立软件快速路径。
- 列表:添加 inet 系列的一个 example-table : # nft add table inet <example-table>
- 列表:添加一个带有 ingress 钩子和 filter 作为优先级类型的 example-flowtable flowtable : # nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter ; devices = { example_device_one, example_device_two } ; }
- 命令/配置摘录:
# nft add table inet <example-table>
# nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter \; devices = { example_device_one, example_device_two } \; }2.14. 从 iptables 迁移到 nftables
- 要点:如果您的防火墙配置仍然使用 iptables 规则,则您可以将 iptables 规则迁移到 nftables。
- 注意:重要 ipset 和 iptables-nft 软件包已在 Red Hat Enterprise Linux 9 中弃用。这包括 nft-variants (如 iptables、ip6tables、arptables 和 ebtables 工具)的弃用。如果您使用其中任何一个工具,例如,因为您已从早期的 RHEL 版本升级,因此请迁移到 nftables 软件包提供的 nft 命令行工具。
2.14.1. 弃用的 iptables 框架中的概念
- 要点:与主动维护的 nftables 框架类似,您可以使用已弃用的 iptables 框架执行各种数据包过滤任务、日志记录和审计、与 NAT 相关的配置任务。
- 要点:iptables 框架由多个表组成,其中每个表都为特定目的而设计:
2.14.2. 将 iptables 和 ip6tables 规则集转换为 nftables
- 要点:使用 iptables-restore-translate 和 ip6tables-restore-translate 实用程序将 iptables 和 ip6tables 规则集转换为 nftables。
- 要点:先决条件
- 列表:已安装 nftables 和 iptables 软件包。
- 列表:系统配置了 iptables 和 ip6tables 规则。
- 列表:将 iptables 和 ip6tables 规则写入一个文件: # iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dump
- 列表:将转储文件转换为 nftables 指令: # iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
- 列表:检查,如果需要,手动更新生成的 nftables 规则。
- 列表:要启用 nftables 服务来加载生成的文件,请在 /etc/sysconfig/nftables.conf 文件中添加以下内容: include "/etc/nftables/ruleset-migrated-from-iptables.nft" include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
- 命令/配置摘录:
# iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dump
# iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft2.14.3. 将单个 iptables 和 ip6tables 规则转换为 nftables
- 要点:RHEL 提供了 iptables-translate 和 ip6tables-translate 工具,来将 iptables 或 ip6tables 规则转换为 nftables 的等效规则。
- 要点:先决条件
- 列表:已安装 nftables 软件包。
- 列表:使用 iptables-translate 或 ip6tables-translate 程序而不是 iptables 或 ip6tables 显示对应的 nftables 规则,例如: # iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept 请注意,一些扩展可能缺少响应的转换支持。在这些情况下,实用程序会输出以 # 符号为前缀的未转换规则,例如: # iptables-translate -A INPUT -j CHECKSUM --checks…
- 命令/配置摘录:
# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept
# iptables-translate -A INPUT -j CHECKSUM --checksum-fill nft # -A INPUT -j CHECKSUM --checksum-fill2.14.4. 常见的 iptables 和 nftables 命令的比较
- 要点:以下是常见的 iptables 和 nftables 命令的比较。
- 要点:列出所有规则:
- 列表:列出所有规则: Expand iptables nftables iptables-save nft list ruleset Show more
- 列表:列出某个表和链: Expand iptables nftables iptables -L nft list table ip filter iptables -L INPUT nft list chain ip filter INPUT iptables -t nat -L PREROUTING nft list chain ip nat PREROUTING Show more nft 命令不会预先创建表和链。只有当用户手动创建它们时它们才会存在。 列出 firewalld 生成的规则: # nft list table inet firewalld # nft list table ip firewalld # …
- 命令/配置摘录:
# nft list table inet firewalld # nft list table ip firewalld # nft list table ip6 firewalld- 表格样本(共 2 行):
- iptables | nftables
- iptables-save | nft list ruleset
第 3 章 XDP 和 eBPF 入门
- 要点:eXpress Data Path (XDP)和扩展的 Berkeley Packet Filter (eBPF)功能是高速网络的一个强大的组合。XDP 为早期数据包处理提供了高性能框架,而 eBPF 允许内核中的安全动态程序执行。
- 要点:XDP 和 eBPF 的合成可提高网络性能,并启用强大的流量追踪、过滤和监控。
3.1. 了解 RHEL 10 中的 eBPF 网络功能
- 要点:扩展的 Berkeley Packet 过滤器(eBPF)是一个内核中的虚拟机,允许在内核空间中执行代码。此代码运行在一个受限的沙箱环境中,仅可访问有限功能集。
- 要点:在网络中,您可以使用 eBPF 来补充或替换内核数据包处理。根据您使用的 hook,eBPF 程序有:
- 列表:对元数据的读和写的访问权限
- 列表:可以查找套接字和路由
- 列表:可以设置套接字选项
- 列表:可以重定向数据包
3.1.1. RHEL 10 中网络 eBPF 功能的概述
- 要点:开发人员可以使用扩展 Berkeley Packet Filter (eBPF)在 Linux 内核中运行沙盒程序。要管理网络流量,您可以在特定的 hook 中配置 eBPF 程序,以检查、修改和过滤数据。
- 要点:您可以将扩展的 Berkeley 数据包过滤器(eBPF)网络程序附加到 RHEL 中的以下钩子:
- 列表:Express Data Path(XDP):在内核网络堆栈处理它们之前,对接收的数据包提供早期的访问权限。
- 列表:带有直接操作标志的 tc eBPF 分类器:对入口和出口提供强大的数据包处理。程序可以作为带有直接操作标志的 eBPF 分类器附加在 qdisc 层次结构中,或使用基于链接的 tcx API。
- 列表:控制组版本 2(cgroup v2):在控制组中,对程序所执行的基于套接字的操作启用过滤和覆盖。
- 列表:套接字过滤:启用对从套接字接收的数据包进行过滤。这个功能也可用于经典 Berkeley Packet Filter(cBPF),但已扩展为支持 eBPF 程序。
- 列表:流解析器:启用将流分成单独的消息、过滤并将其重定向到套接字。
- 列表:SO_REUSEPORT 套接字选择:对来自 reuseport 套接字组的接收套接字提供可编程选择。
- 注意:注意 目前,XDP 程序有一些系统配置限制。例如:您必须禁用接收接口中某些硬件卸载功能。另外,并非所有功能都可用于支持原生模式的所有驱动程序。
3.1.2. 在 RHEL 10 中按网卡的 XDP 功能概述
- 要点:RHEL 中提供的 XDP 功能取决于网卡及其驱动程序。
- 要点:以下是启用了 XDP 的网卡和您可以使用的 XDP 特性的概述:
- 列表:红帽支持状态: 支持的 :红帽完全支持此驱动程序提供的 XDP 功能。 启用 :XDP 功能由上游驱动程序提供。红帽以最佳方式解决发现问题,但硬件不受完整的内部质量保证测试套件的影响。
- 列表:支持的 :红帽完全支持此驱动程序提供的 XDP 功能。
- 列表:启用 :XDP 功能由上游驱动程序提供。红帽以最佳方式解决发现问题,但硬件不受完整的内部质量保证测试套件的影响。
- 列表:基本的:支持基本的返回代码:DROP、PASS、ABORTED 和 TX。
- 列表:重定向:支持 XDP_REDIRECT 返回码。
- 列表:目标 :可以是 XDP_REDIRECT 返回码的目标。
- 表格样本(共 32 行):
- 网卡 | 驱动 | 红帽支持状态 | 基本的 | 重定向 | 目标 | 零复制 | 大 MTU
- Amazon Elastic Network Adapter | ena | enabled | 是 | 是 | 是 [a] | 否 | 否
- aQuantia AQtion Ethernet card | atlantic | enabled | 是 | 是 | 是 | 否 | 是
- Broadcom NetXtreme-C/E 10/25/40/50 gigabit Ethernet | bnxt_en | 支持 | 是 | 是 | 是 [a] | 否 | 是
3.2. 使用 BPF 编译器集合进行网络追踪
- 要点:BPF Compiler Collection(BCC)是一个库,可帮助创建扩展的 Berkeley Packet Filter(eBPF)程序。eBPF 程序的主要工具是分析操作系统性能和网络性能,而不会遇到开销或安全问题。
- 要点:BCC 不再需要用户了解 eBPF 的技术详情,并提供了许多开箱即用的起点,如带有预先创建的 eBPF 程序的 bcc-tools 软件包。
- 注意:注意 eBPF 程序在事件中触发,如磁盘 I/O、TCP 连接以及进程创建。程序不太可能导致内核崩溃、循环或变得无响应,因为它们在内核中的安全虚拟机中运行。
3.2.1. 安装 bcc-tools 软件包
- 要点:安装 bcc-tools 软件包,该软件包还会将 BPF Compiler Collection (BCC)库作为依赖项安装。
- 要点:流程
- 列表:安装 bcc-tools : # dnf install bcc-tools BCC 工具安装在 /usr/share/bcc/tools/ 目录中。
- 列表:检查安装的工具: # ls -l /usr/share/bcc/tools/ ... -rwxr-xr-x. 1 root root 4198 Dec 14 17:53 dcsnoop -rwxr-xr-x. 1 root root 3931 Dec 14 17:53 dcstat -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector -rw-r--r--. 1 root root 7105 Dec 14 17:53 deadlock_detector.c drwxr-xr-x. 3 root root 8192 Mar 11 10:28 doc -rwxr-xr…
- 命令/配置摘录:
# dnf install bcc-tools
# ls -l /usr/share/bcc/tools/3.2.2. 显示添加到内核的接受队列中的 TCP 连接
- 要点:通过使用 tcpaccept 工具,您可以通过追踪内核的 accept() 函数来监控新接受的连接。
- 要点:内核在 TCP 3 向握手中接收 ACK 数据包后,内核会将来自 SYN 队列的连接移到 accept 队列,直到连接的状态变为 ESTABLISHED。因此,只有成功的 TCP 连接才能在此队列中看到。
- 列表:输入以下命令来启动对内核 accept 队列的追踪: # /usr/share/bcc/tools/tcpaccept PID COMM IP RADDR RPORT LADDR LPORT 843 sshd 4 192.0.2.17 50598 192.0.2.1 22 1107 ns-slapd 4 198.51.100.6 38772 192.0.2.1 389 1107 ns-slapd 4 203.0.113.85 38774 192.0.2.1 389 ... 每次内核接受一个连接时,tcpaccept 都会显示连接的详情。 详情请查看您系统上的 tcpaccept (8) 手册页和 /usr/share/bcc/to…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpaccept PID COMM IP RADDR RPORT LADDR LPORT 843 sshd 4 192.0.2.17 50598 192.0.2.1 22 1107 ns-slapd 4 198.51.100.6 38772 192.0.2.1 389 1107 ns-slapd 4 203.0.113.85 38774 192.0.2.1 389 ...3.2.3. 追踪出去的 TCP 连接尝试
- 要点:tcpconnect 工具使用 eBPF 特性来跟踪出去的 TCP 连接尝试。该工具的输出还包括失败的连接。
- 要点:tcpconnect 工具是轻量级的,例如,因为它跟踪内核的 connect() 函数,而不是捕获和过滤数据包。
- 列表:输入以下命令启动显示所有传出连接的追踪过程: # /usr/share/bcc/tools/tcpconnect PID COMM IP SADDR DADDR DPORT 31346 curl 4 192.0.2.1 198.51.100.16 80 31348 telnet 4 192.0.2.1 203.0.113.231 23 31361 isc-worker00 4 192.0.2.1 192.0.2.254 53 ... 每次内核处理一个出去的连接时,tcpconnect 都会显示连接的详情。 详情请查看您系统上的 tcpconnect (8) 手册页和 /usr/share/bcc/tools/doc/tcpconn…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpconnect PID COMM IP SADDR DADDR DPORT 31346 curl 4 192.0.2.1 198.51.100.16 80 31348 telnet 4 192.0.2.1 203.0.113.231 23 31361 isc-worker00 4 192.0.2.1 192.0.2.254 53 ...3.2.4. 测量出站 TCP 连接的延迟
- 要点:tcpconnlat 工具使用 eBPF 特性来测量发送 SYN 数据包和接收响应数据包之间的时间。
- 要点:TCP 连接延迟是建立连接所需的时间。这通常涉及内核 TCP/IP 处理和网络往返时间,而不是应用程序运行时。
- 列表:开始测量出站连接的延迟: # /usr/share/bcc/tools/tcpconnlat PID COMM IP SADDR DADDR DPORT LAT(ms) 32151 isc-worker00 4 192.0.2.1 192.0.2.254 53 0.60 32155 ssh 4 192.0.2.1 203.0.113.190 22 26.34 32319 curl 4 192.0.2.1 198.51.100.59 443 188.96 ... 每次内核处理一个出去的连接时,tcpconnlat 都会在内核接收响应数据包后显示连接的详细信息。 详情请查看您系统上的 tcpconnlat (8) 手册页和 /usr/…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpconnlat PID COMM IP SADDR DADDR DPORT LAT(ms) 32151 isc-worker00 4 192.0.2.1 192.0.2.254 53 0.60 32155 ssh 4 192.0.2.1 203.0.113.190 22 26.34 32319 curl 4 192.0.2.1 198.51.100.59 443 188.96 ...3.2.5. 显示被内核丢弃的 TCP 数据包和片段详情
- 要点:您可以使用 tcpdrop 工具显示内核丢弃的 TCP 数据包和片段详情。使用这个实用程序调试丢弃数据包的高速率,以便远程系统发送基于计时器的重新传输。
- 要点:释放数据包和片段的高速率可能会影响服务器的性能。tcpdrop 工具使用 eBPF 特性,而不是捕获和过滤资源密集型的数据包,来直接从内核检索信息。
- 列表:输入以下命令来显示丢弃 TCP 数据包和片段详情: # /usr/share/bcc/tools/tcpdrop TIME PID IP SADDR:SPORT > DADDR:DPORT STATE (FLAGS) 13:28:39 32253 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE_WAIT (FIN|ACK) b'tcp_drop+0x1' b'tcp_data_queue+0x2b9' ... 13:28:39 1 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE (ACK) b'tcp_drop+0x1' b'tcp_rcv_state_pr…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpdrop TIME PID IP SADDR:SPORT > DADDR:DPORT STATE (FLAGS) 13:28:39 32253 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE_WAIT (FIN|ACK) b'tcp_drop+0x1' b'tcp_data_queue+0x2b9' ... 13:28:39 1 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE (ACK) b'tcp_drop+0x1' b'tcp_rcv_state_process+0xe2' ...3.2.6. 追踪 TCP 会话
- 要点:tcplife 工具使用 eBPF 跟踪打开和关闭的 TCP 会话,并打印一行输出来总结每一个会话。管理员可以使用 tcplife 来识别连接和传输的流量数。
- 要点:例如,您可以显示到端口 22 (SSH)的连接来检索以下信息:
- 列表:本地进程 ID(PID)
- 列表:本地进程名称
- 列表:本地 IP 地址和端口号
- 列表:远程 IP 地址和端口号
- 列表:接收和传输的流量的数量(以 KB 为单位)。
- 列表:连接处于活跃状态的时间(毫秒)
- 命令/配置摘录:
# /usr/share/bcc/tools/tcplife -L 22 PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS 19392 sshd 192.0.2.1 22 192.0.2.17 43892 53 52 6681.95 19431 sshd 192.0.2.1 22 192.0.2.245 43902 81 249381 7585.09 19487 sshd 192.0.2.1 22 192.0.2.121 43970 6998 7 16740.35 ...3.2.7. 追踪 TCP 重新传输
- 要点:tcpretrans 工具显示有关 TCP 重新传输的详细信息,如本地和远程的 IP 地址和端口号,以及重新传输时 TCP 的状态。
- 要点:该工具使用 eBPF 功能,因此开销非常低。
- 列表:使用以下命令来显示 TCP 重新传输详情: # /usr/share/bcc/tools/tcpretrans TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:45:43 0 4 192.0.2.1:22 R> 198.51.100.0:17634 ESTABLISHED ... 每次内核调用 TCP 重新传输函数时,tcpretrans 都会显示…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpretrans TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:45:43 0 4 192.0.2.1:22 R> 198.51.100.0:17634 ESTABLISHED ...3.2.8. 显示 TCP 状态更改信息
- 要点:在 TCP 会话中,TCP 状态会改变。tcpstates 工具使用 eBPF 功能跟踪这些状态变化,并打印包括每个状态持续时间的详细信息。例如,使用 tcpstates 来确定连接是否在初始化状态中花费了太多时间。
- 要点:流程
- 列表:使用以下命令开始追踪 TCP 状态变化: # /usr/share/bcc/tools/tcpstates SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS ffff9cd377b3af80 0 swapper/1 0.0.0.0 22 0.0.0.0 0 LISTEN -> SYN_RECV 0.000 ffff9cd377b3af80 0 swapper/1 192.0.2.1 22 192.0.2.45 53152 SYN_RECV -> ESTABLISHED 0.067 ffff9cd377b3af80 818 sssd_nss 192…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpstates SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS ffff9cd377b3af80 0 swapper/1 0.0.0.0 22 0.0.0.0 0 LISTEN -> SYN_RECV 0.000 ffff9cd377b3af80 0 swapper/1 192.0.2.1 22 192.0.2.45 53152 SYN_RECV -> ESTABLISHED 0.067 ffff9cd377b3af80 818 sssd_nss 192.0.2.1 22 192.0.2.45 53152 ESTABLISHED -> CLOSE_WAIT 65636.773 ffff9cd377b3af80 1432 sshd 192.0.2.1 22 192.0.2.45 53152 CLOSE_WAIT -> LAST_ACK 24.409 ffff9cd377b3af80 1267 pulseaudio 192.0.2.1 22 192.0.2.45 53152 LAST_ACK -> CLOSE 0.376 ...3.2.9. 聚合发送到特定子网的 TCP 流量
- 要点:tcpsubnet 工具汇总并合计了本地主机发往子网的 IPv4 TCP 流量,并按固定间隔显示输出。该工具使用 eBPF 功能来收集并总结数据,以减少开销。
- 要点:默认情况下,tcpsubnet 为以下子网汇总流量:
- 列表:127.0.0.1/32
- 列表:10.0.0.0/8
- 列表:172.16.0.0/12
- 列表:192.0.2.0/24/16
- 列表:0.0.0.0/0
- 列表:开始监控发送到 192.0.2.0/24、198.51.100.0/24 和其他子网的流量数: # /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0 Tracing... Output every 1 secs. Hit Ctrl-C to end [02/21/20 10:04:50] 192.0.2.0/24 856 198.51.100.0/24 7467 [02/21/20 10:04:51] 192.0.2.0/24 1200 198.51.100.0/24 8763 0.0.0.0/0 673 ... 这个命令以字节为单位显示指定…
- 命令/配置摘录:
# /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0 Tracing... Output every 1 secs. Hit Ctrl-C to end [02/21/20 10:04:50] 192.0.2.0/24 856 198.51.100.0/24 7467 [02/21/20 10:04:51] 192.0.2.0/24 1200 198.51.100.0/24 8763 0.0.0.0/0 673 ...3.2.10. 通过 IP 地址和端口显示网络吞吐量
- 要点:tcptop 工具以 KB 为单位显示主机发送并接收的 TCP 流量。这个报告会自动刷新并只包含活跃的 TCP 连接。该工具使用 eBPF 功能,因此开销非常低。
- 要点:流程
- 列表:要监控发送和接收的流量,请输入: # /usr/share/bcc/tools/tcptop 13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875 PID COMM LADDR RADDR RX_KB TX_KB 3853 3853 192.0.2.1:22 192.0.2.165:41838 32 102626 1285 sshd 192.0.2.1:22 192.0.2.45:39240 0 0 ... 命令的输出只包括活跃的 TCP 连接。如果本地或者远程系统关闭了连接,则该连接在输出中不再可见。 详情请查看您系统上的 tcptop (8) 手册页和 /usr/share/bcc/tools…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcptop 13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875 PID COMM LADDR RADDR RX_KB TX_KB 3853 3853 192.0.2.1:22 192.0.2.165:41838 32 102626 1285 sshd 192.0.2.1:22 192.0.2.45:39240 0 0 ...3.2.11. 追踪已建立的 TCP 连接
- 要点:tcptracer 工具跟踪连接、接受和关闭 TCP 连接的内核函数。该工具使用 eBPF 功能,因此开销非常低。
- 要点:流程
- 列表:使用以下命令启动追踪过程: # /usr/share/bcc/tools/tcptracer Tracing TCP established connections. Ctrl-C to end. T PID COMM IP SADDR DADDR SPORT DPORT A 1088 ns-slapd 4 192.0.2.153 192.0.2.1 0 65535 A 845 sshd 4 192.0.2.1 192.0.2.67 22 42302 X 4502 sshd 4 192.0.2.1 192.0.2.67 22 42302 ... 每当内核连接、接受或关闭连接时,tcptracer 都会显示连接的详情。 详情请查看您…
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/tcptracer Tracing TCP established connections. Ctrl-C to end. T PID COMM IP SADDR DADDR SPORT DPORT A 1088 ns-slapd 4 192.0.2.153 192.0.2.1 0 65535 A 845 sshd 4 192.0.2.1 192.0.2.67 22 42302 X 4502 sshd 4 192.0.2.1 192.0.2.67 22 42302 ...3.2.12. 追踪 IPv4 和 IPv6 侦听尝试
- 要点:solisten 工具追踪所有 IPv4 和 IPv6 侦听尝试。它跟踪尝试,包括最终失败的或者不接受连接的侦听程序。当程序希望侦听 TCP 连接时,工具会跟踪内核调用的函数。
- 要点:流程
- 列表:输入以下命令启动显示所有监听 TCP 尝试的追踪过程: # /usr/share/bcc/tools/solisten PID COMM PROTO BACKLOG PORT ADDR 3643 nc TCPv4 1 4242 0.0.0.0 3659 nc TCPv6 1 4242 2001:db8:1::1 4221 redis-server TCPv6 128 6379 :: 4221 redis-server TCPv4 128 6379 0.0.0.0 .... 详情请查看您系统上的 solisten (9) 手册页和 /usr/share/bcc/tools/doc/solisten_example.txt 文件。
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/solisten PID COMM PROTO BACKLOG PORT ADDR 3643 nc TCPv4 1 4242 0.0.0.0 3659 nc TCPv6 1 4242 2001:db8:1::1 4221 redis-server TCPv6 128 6379 :: 4221 redis-server TCPv4 128 6379 0.0.0.0 ....3.2.13. 软中断的服务时间概述
- 要点:softirqs 工具总结了服务软中断(soft IRQ)所花费的时间,并将这个时间显示为总计或直方图分布。这个工具使用 irq:softirq_enter 和 irq:softirq_exit 内核追踪点,是一个稳定的追踪机制。
- 要点:流程
- 列表:输入以下命令启动追踪 soft irq 事件时间: # /usr/share/bcc/tools/softirqs Tracing soft irq event time... Hit Ctrl-C to end. ^C SOFTIRQ TOTAL_usecs tasklet 166 block 9152 net_rx 12829 rcu 53140 sched 182360 timer 306256 详情请查看您系统上的 softirqs (8) 和 mpstat (1) 手册页以及 /usr/share/bcc/tools/doc/softirqs_example.txt 文件。
- 列表:按 Ctrl+C 停止追踪过程。
- 命令/配置摘录:
# /usr/share/bcc/tools/softirqs Tracing soft irq event time... Hit Ctrl-C to end. ^C SOFTIRQ TOTAL_usecs tasklet 166 block 9152 net_rx 12829 rcu 53140 sched 182360 timer 3062563.2.14. 总结网络接口上的数据包大小和数量
- 要点:netqtop 工具显示有关特定网络接口的每个网络队列上收到的(RX)和传输的(TX)数据包属性的统计信息。
- 要点:统计包括:
- 列表:每秒字节数(BPS)
- 列表:每秒数据包数(PPS)
- 列表:平均数据包大小
- 列表:总数据包数
- 列表:显示 2 秒时间间隔的字节大小范围内的数据包数: # /usr/share/bcc/tools/netqtop -n enp1s0 -i 2 Fri Jan 31 18:08:55 2023 TX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 RX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 38.0 1 0 0 0 0 Total 38.0 1 0 0 0 0 ---------…
- 列表:按 Ctrl+C 来停止 netqtop。
- 命令/配置摘录:
# /usr/share/bcc/tools/netqtop -n enp1s0 -i 2 Fri Jan 31 18:08:55 2023 TX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 RX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 38.0 1 0 0 0 0 Total 38.0 1 0 0 0 0 ----------------------------------------------------------------------------- Fri Jan 31 18:08:57 2023 TX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 RX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 38.0 1 0 0 0 0 Total 38.0 1 0 0 0 0 -----------------------------------------------…3.3. 使用 xdp-filter 进行高性能流量过滤以防止 DDoS 攻击
- 要点:xdp-filter 工具使用 XDP 在网络接口中直接丢弃数据包,使其比过滤器快,如 nftables。它有助于在 DDoS 攻击期间快速阻止流量,并根据 IP、MAC 地址或端口过滤。
- 要点:例如,在测试过程中,红帽在单个核上每秒丢弃了 2,600万个网络数据包,这比同一硬件上 nftables 的丢弃率要高得多。
- 列表:IP 地址
- 列表:MAC 地址
- 列表:端口
- 注意:重要 在 AMD 和 Intel 64 位以外的其他构架上,xdp-filter 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。
3.3.1. 丢弃与 xdp-filter 规则匹配的网络数据包
- 要点:xdp-filter 工具可以使用 allow 策略,允许所有流量除与特定规则匹配的数据包外,如来自特定源 IP 地址、源 MAC 地址或特定目的地端口的数据包。
- 要点:先决条件
- 列表:xdp-tools 软件包已安装。
- 列表:支持 XDP 程序的网络驱动程序。
- 列表:加载 xdp-filter 来处理特定接口上传入的数据包,如 enp1s0 : # xdp-filter load enp1s0 默认情况下,xdp-filter 使用 allow 策略,并且工具只丢弃与任何规则匹配的流量。 可选: 使用 -f <feature& gt; 选项来只启用特定的功能,如 tcp、ipv4 或 ethernet。仅加载所需的功能而不是全部功能,可以提高数据包处理的速度。要启用多个功能,使用逗号分隔它们。 如果该命令出错,则网络驱动程序不支持 XDP 程序。
- 列表:添加规则来丢弃与它们匹配的数据包。例如: 要将传入数据包放到端口 22,请输入: # xdp-filter port 22 这个命令添加一个匹配 TCP 和 UDP 流量的规则。要只匹配特定的协议,请使用 -p protocol 选项。 要丢弃来自 192.0.2.1 的传入数据包,请输入: # xdp-filter ip 192.0.2.1 -m src 请注意,xdp-filter 不支持 IP 范围。 要丢弃来自 MAC 地址 00:53:00:AA:07:BE 的传入数据包,请输入: # xdp-filter ether 00:53:00:AA:07:BE -m src
- 列表:要将传入数据包放到端口 22,请输入: # xdp-filter port 22 这个命令添加一个匹配 TCP 和 UDP 流量的规则。要只匹配特定的协议,请使用 -p protocol 选项。
- 列表:要丢弃来自 192.0.2.1 的传入数据包,请输入: # xdp-filter ip 192.0.2.1 -m src 请注意,xdp-filter 不支持 IP 范围。
- 命令/配置摘录:
# xdp-filter load enp1s0
# xdp-filter port 223.3.2. 丢弃所有与 xdp-filter 规则匹配的网络数据包
- 要点:xdp-filter 工具可以使用 deny 策略来丢弃所有流量,除了与特定源 IP 地址、源 MAC 地址或特定目的地端口匹配的数据包外。
- 要点:先决条件
- 列表:xdp-tools 软件包已安装。
- 列表:您已在本地或通过使用您不打算过滤流量的网络接口登录到主机。
- 列表:支持 XDP 程序的网络驱动程序。
- 列表:加载 xdp-filter 来处理特定接口上的数据包,如 enp1s0 : # xdp-filter load enp1s0 -p deny 可选: 使用 -f <feature& gt; 选项来只启用特定的功能,如 tcp、ipv4 或 ethernet。仅加载所需的功能而不是全部功能,可以提高数据包处理的速度。要启用多个功能,使用逗号分隔它们。 如果该命令出错,则网络驱动程序不支持 XDP 程序。
- 列表:添加规则以允许匹配它们的数据包。例如: 要允许数据包发送端口 22 ,请输入: # xdp-filter port 22 这个命令添加一个匹配 TCP 和 UDP 流量的规则。要只匹配特定的协议,请将 -p protocol 选项传给命令。 要允许数据包发送到 192.0.2.1 ,请输入: # xdp-filter ip 192.0.2.1 请注意,xdp-filter 不支持 IP 范围。 要允许数据包发送到 MAC 地址 00:53:00:AA:07:BE ,请输入: # xdp-filter ether 00:53:00:AA:07:BE 重要 xdp-filter 工具不支持有状态数据包检查。这要求您不使用 -m mod…
- 列表:要允许数据包发送端口 22 ,请输入: # xdp-filter port 22 这个命令添加一个匹配 TCP 和 UDP 流量的规则。要只匹配特定的协议,请将 -p protocol 选项传给命令。
- 命令/配置摘录:
# xdp-filter load enp1s0 -p deny
# xdp-filter port 22- 注意:警告 如果您在接口上加载 xdp-filter 时将默认策略设为 deny,则内核会立即丢弃来自这个接口的所有数据包,直到您创建允许某些流量的规则。要避免从系统中锁定,在本地输入命令或者通过不同的网络接口连接到主机。
- 注意:重要 xdp-filter 工具不支持有状态数据包检查。这要求您不使用 -m mode 选项设置模式,或者您添加显式规则来允许机器接收传入流量来作为对传出流量的答复。
3.3.3. 其他资源
- 列表:技术预览功能支持范围
3.4. 使用 xdpdump 捕获网络数据包,包括 XDP 程序丢弃的数据包
- 要点:xdpdump 工具捕获网络数据包,包括 XDP 程序丢弃或修改的数据包。与 tcpdump 不同,xdpdump 使用 eBPF 程序,允许它捕获传统用户空间工具无法捕获的数据包。
- 要点:您可以使用 xdpdump 来调试已附加到接口上的 XDP 程序。因此,实用程序可以在 XDP 程序启动和完成后捕获数据包。在后一种情况下,xdpdump 也捕获 XDP 操作。默认情况下,xdpdump 会在 XDP 程序的入口处捕获传入的数据包。
- 列表:支持 XDP 程序的网络驱动程序。
- 列表:XDP 程序被加载到 enp1s0 接口。如果没有程序载入,xdpdump 会以与 tcpdump 类似的方式捕获数据包,以便向后兼容。
- 列表:要捕获 enp1s0 接口上的数据包,并将它们写入到 /root/capture.pcap 文件,请输入: # xdpdump -i enp1s0 -w /root/capture.pcap 如果您是开发人员,并且您对 xdpdump 的源代码感兴趣,请从红帽客户门户网站下载并安装相应的源 RPM(SRPM)。
- 列表:要停止捕获数据包,请按 Ctrl+C。
- 命令/配置摘录:
# xdpdump -i enp1s0 -w /root/capture.pcap- 注意:重要 在 AMD 和 Intel 64 位以外的其他构架上,xdpdump 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。 如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。
完整目录
- 管理 firewalld 服务、nftables 框架和 XDP 数据包过滤功能
- 对红帽文档提供反馈
- 第 1 章 使用和配置 firewalld
- 1.1. 防火墙区域
- 1.2. 防火墙策略
- 1.3. 防火墙规则
- 1.4. 防火墙直接规则
- 1.5. 预定义的 firewalld 服务
- 1.6. 使用 firewalld 区域
- 1.6.1. 更改默认区
- 1.6.2. 创建一个新区
- 1.6.3. 将网络接口分配给区
- 1.6.4. 添加源
- 1.6.5. 删除源
- 1.6.6. 使用 nmcli为连接分配区域
- 1.6.7. 使用区目标设定传入流量的默认行为
- 1.6.8. 为特定区域自定义防火墙设置来增强安全性
- 1.6.9. 使用 IP 集为允许列表配置动态更新
- 1.6.10. 使用 Web 控制台启用区域
- 1.6.11. 使用 Web 控制台禁用区域
- 1.7. 使用 firewalld控制网络流量
- 1.7.1. 使用 CLI 控制预定义服务的流量
- 1.7.2. 使用 Web 控制台在防火墙上启用服务
- 1.7.3. 使用 Web 控制台配置自定义端口
- 1.8. 在区域间过滤转发的流量
- 1.8.1. 策略对象和区域之间的关系
- 1.8.2. 使用优先级对策略进行排序
- 1.8.3. 使用策略对象过滤本地托管的容器和物理连接到主机的网络之间的流量
- 1.8.4. 使用 firewalld 策略集配置路由器
- 1.8.5. 设置策略对象的默认目标
- 1.9. 使用 firewalld配置 NAT
- 1.9.1. 网络地址转换类型
- 1.9.2. 配置 IP 地址伪装
- 1.9.3. 使用 DNAT 转发传入的 HTTP 流量
- 1.9.4. 将来自非标准端口的流量重定向,以使 Web 服务在标准端口上可访问
- 1.10. 丰富规则的优先级
- 1.10.1. priority 参数如何将规则组织到不同的链
- 1.10.2. 设置丰富的规则的优先级
- 1.11. 启用 firewalld 区域中不同接口或源之间的流量转发
- 1.11.1. 区域内转发和默认目标设置为 ACCEPT 的区域间的区别
- 1.11.2. 使用区内转发来在以太网和 Wi-Fi 网络间转发流量
- 1.12. 使用 RHEL 系统角色配置 firewalld
- 1.12.1. 使用 firewall RHEL 系统角色重置 firewalld 设置
- 1.12.2. 使用 firewall RHEL 系统角色,将 firewalld 中的传入流量从一个本地端口转发到另一个本地端口
- 1.12.3. 使用 firewall RHEL 系统角色配置 firewalld DMZ 区域
- 1.12.4. 使用 firewall RHEL 系统角色创建自定义 firewalld 服务
- 1.13. 加速 firewalld 转发流量
- 1.14. 使用 firewalld为流量分类配置区优先级
- 1.14.1. 为区域中的两个流量类型设置相同的优先级值
- 1.14.2. 为区域中的每个流量类型设置不同的优先级值
- 第 2 章 nftables 入门
- 2.1. 什么是 nftables
- 2.2. 何时使用 firewalld 或 nftables
- 2.3. nftables 框架中的概念
- 2.4. 创建和管理 nftables 表、链和规则
- 2.4.1. nftables 表的基础知识
- 2.4.2. nftables 链的基础知识
- 2.4.3. nftables 规则的基础知识
- 2.4.4. 使用 nft 命令管理表、链和规则
- 2.5. 使用 nftables 配置 NAT
- 2.5.1. NAT 类型
- 2.5.2. 使用 nftables配置伪装
- 2.5.3. 使用 nftables 配置源 NAT
- 2.5.4. 使用 nftables 配置目标 NAT
- 2.5.5. 使用 nftables 配置重定向
- 2.6. 编写并运行 nftables 脚本
- 2.6.1. 支持的 nftables 脚本格式
- 2.6.2. 运行 nftables 脚本
- 2.6.3. 使用 nftables 脚本中的注释
- 2.6.4. 使用 nftables 脚本中的变量
- 2.6.5. 在 nftables 脚本中包含文件
- 2.6.6. 系统引导时自动载入 nftables 规则
- 2.7. 使用 nftables 命令中的设置
- 2.7.1. 在 nftables 中使用匿名集合
- 2.7.2. 在 nftables 中使用命名集
- 2.7.3. 使用动态集添加来自数据包路径的条目
- 2.8. 在 nftables 命令中使用判决映射
- 2.8.1. 在 nftables 中使用匿名映射
- 2.8.2. 在 nftables 中使用命名映射
- 2.9. 示例:使用 nftables 脚本保护 LAN 和 DMZ
- 2.9.1. 网络条件
- 2.9.2. 防火墙脚本的安全要求
- 2.9.3. 配置将丢弃的数据包记录到文件
- 2.9.4. 编写并激活 nftables 脚本
- 2.10. 使用 nftables 限制连接数量
- 2.10.1. 使用 nftables限制连接数量
- 2.10.2. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址
- 2.11. 调试 nftables 规则
- 2.11.1. 创建带有计数器的规则
- 2.11.2. 在现有规则中添加计数器
- 2.11.3. 监控与现有规则匹配的数据包
- 2.12. 备份和恢复 nftables 规则集
- 2.12.1. 将 nftables 规则集备份到文件
- 2.12.2. 从文件中恢复 nftables 规则集
- 2.13. 使用 flowtables 加快 nftables 数据包转发
- 2.14. 从 iptables 迁移到 nftables
- 2.14.1. 弃用的 iptables 框架中的概念
- 2.14.2. 将 iptables 和 ip6tables 规则集转换为 nftables
- 2.14.3. 将单个 iptables 和 ip6tables 规则转换为 nftables
- 2.14.4. 常见的 iptables 和 nftables 命令的比较
- 第 3 章 XDP 和 eBPF 入门
- 3.1. 了解 RHEL 10 中的 eBPF 网络功能
- 3.1.1. RHEL 10 中网络 eBPF 功能的概述
- 3.1.2. 在 RHEL 10 中按网卡的 XDP 功能概述
- 3.2. 使用 BPF 编译器集合进行网络追踪
- 3.2.1. 安装 bcc-tools 软件包
- 3.2.2. 显示添加到内核的接受队列中的 TCP 连接
- 3.2.3. 追踪出去的 TCP 连接尝试
- 3.2.4. 测量出站 TCP 连接的延迟
- 3.2.5. 显示被内核丢弃的 TCP 数据包和片段详情
- 3.2.6. 追踪 TCP 会话
- 3.2.7. 追踪 TCP 重新传输
- 3.2.8. 显示 TCP 状态更改信息
- 3.2.9. 聚合发送到特定子网的 TCP 流量
- 3.2.10. 通过 IP 地址和端口显示网络吞吐量
- 3.2.11. 追踪已建立的 TCP 连接
- 3.2.12. 追踪 IPv4 和 IPv6 侦听尝试
- 3.2.13. 软中断的服务时间概述
- 3.2.14. 总结网络接口上的数据包大小和数量
- 3.3. 使用 xdp-filter 进行高性能流量过滤以防止 DDoS 攻击
- 3.3.1. 丢弃与 xdp-filter 规则匹配的网络数据包
- 3.3.2. 丢弃所有与 xdp-filter 规则匹配的网络数据包
- 3.3.3. 其他资源
- 3.4. 使用 xdpdump 捕获网络数据包,包括 XDP 程序丢弃的数据包
- 3.1. 了解 RHEL 10 中的 eBPF 网络功能
