CFW（Cyber Firewall）是一个人性化的 Linux 防火墙。概括CFW（Cyber Firewall）是一个人性化的 Linux 防火墙。它旨在协助阻止拒绝服务攻击（DDoS），同时能控制 Linux 系统端口的开关。CFW 基于 Linux 原生基础设施运行，拥有良好的软件兼容性。该软件基于 iptables 和 ipset，使用 Python 开发，使用时建议关闭发行版自带的防火墙（如 firewalld、ufw）避免冲突。通过 CFW，你将能够：通过自定义的规则自动封禁互联网中的恶意 IP，以防止拒绝服务攻击保护 Linux 的所有端口遭受 DDoS 攻击，而不仅仅是 Web 应用获得良好的软件兼容性，原生支持 Nginx、Caddy 等服务器支持配合 CDN 使用，使用 CDN 时请将 CDN 的 IP 段设置为 CFW 白名单控制开启或关闭 Linux 系统的 TCP/UDP 端口获得友好的命令行交互式体验背景Web 应用程序运行在复杂的互联网中，随时可能面临恶意攻击，导致拒绝服务现象。为了封禁这些不友好的 IP，CFW 正是为此而诞生。CFW 的灵感最初来自宝塔面板的 Nginx 防火墙。然而，使用 Nginx 防火墙的过程中遇到诸多不顺。该防火墙仅针对 Web 应用（通常是 80 和 443 端口）防御 CC 攻击，无法保护 Linux 服务器的其他端口。同时，该防火墙需要按月付费，并始终捆绑宝塔生态（最新的宝塔面板甚至需要登录绑定手机实名制的账号），从而限制了软件自由度。我们想在纯净的 Linux 中运行防火墙，并对所有端口生效，于是自己开发了一个。由于 CFW 基于 iptables 和 ipset，不免会与发行版自带的防火墙（如 firewalld、ufw）冲突，我们增加了 CFW 对端口开关的控制。实现CFW 通过 ss -Hntu | awk '{print $5,$6}' 命令获取当前服务器的所有连接。客户端的请求若超过设定并发数，该 IP 将被 iptables 封禁，并存储在 ipset 数据结构中。CFW 通过调用 iptables 命令实现 Linux 端口的开关。安装请先确保系统拥有以下依赖。对于 Debian、Ubuntu 等：sudo apt install -y curl ipset python3 git net-tools 对于 CentOS 等：sudo yum install -y curl ipset python3 git net-tools 安装好系统依赖后，输入以下命令安装 CFW：sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/install.py | python3 你也可以下载该脚本阅读，以了解该脚本所进行的工作后再执行上述命令。完成安装后，使用 source ~/.bashrc 激活 CFW 的环境变量。（或者新打开一个 shell 环境，自动激活环境变量。）在 Linux 终端输入 systemctl status cfw，显示 active (running) 字样说明 CFW 已成功运行，同时会在服务器重启时自动运行。卸载sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/uninstall.py | python3 配置配置文件在 /etc/cfw/config.yaml 中，修改配置文件后运行 systemctl restart cfw 即可生效。配置文件参数说明：# CFW 运行端口 port: 6680 # CFW 检测连接的频率，单位：秒。此处默认 5 秒一次。 frequency: 5 # 允许每个 IP 连接的最大并发数，超过将被 CFW 封禁。 max_num: 100 # 解封 IP 的时间。此处默认 IP 被封禁后 600 秒将自动解封。若此处值为 0，则永久封禁。 unblock_time: 600 # 数据备份时间，单位：秒。 backup_time: 60 # IPv4 白名单路径。写在文本文件中，一行一个 IP，支持子网掩码。）本地地址、内网地址默认在该文件中） whitelist: /etc/cfw/ip_list/whitelist.txt # IPv4 黑名单路径。写在文本文件中，一行一个 IP，支持子网掩码。 blacklist: /etc/cfw/ip_list/blacklist.txt # IPv6 白名单路径。写在文本文件中，一行一个 IP。 whitelist6: /etc/cfw/ip_list/whitelist6.txt # IPv6 黑名单路径。写在文本文件中，一行一个 IP。 blacklist6: /etc/cfw/ip_list/blacklist6.txt # 日志文件的路径 log_file_path: /etc/cfw/log/log.csv # 日志文件的最大行数。（达到最大行数后将自动滚动。若此处值为 0，则不限制最大行数） log_max_lines: 10000000 命令命令中 [] 表示变量。运行停止 CFW：systemctl stop cfw启动 CFW：systemctl start cfw重启 CFW：systemctl restart cfwIP 黑名单管理手动封禁单个 IPv4 地址：cfw block [ip]手动解封单个 IPv4 地址：cfw unblock [ip]查看 IPv4 黑名单：cfw blacklist手动封禁单个 IPv6 地址：cfw block6 [ip]手动解封单个 IPv6 地址：cfw unblock6 [ip]查看 IPv6 黑名单：cfw blacklist6Linux 端口操作放行 IPv4 端口：cfw allow [port]阻止 IPv4 端口：cfw deny [port]单独放行 IPv4 TCP 端口：cfw allow [port]/tcp，示例如 cfw allow 69.162.81.155/tcp单独阻止 IPv4 TCP 端口：cfw deny [port]/tcp，示例如 cfw deny 69.162.81.155/tcpIPv4 UDP 端口操作同理查看所有放行的 IPv4 端口：cfw status放行 IPv6 端口：cfw allow6 [port]阻止 IPv6 端口：cfw deny6 [port]单独放行 IPv6 TCP 端口：cfw allow6 [port]/tcp，示例如 cfw allow6 69.162.81.155/tcp单独阻止 IPv6 TCP 端口：cfw deny6 [port]/tcp，示例如 cfw deny6 69.162.81.155/tcpIPv6 UDP 端口操作同理查看所有放行的 IPv6 端口：cfw status6日志操作动态查询日志 cfw log [num]。[num] 为查询日志的条数，查询结果将按时间倒序。相关链接GitHub: https://github.com/Cyberbolt/cfw电光笔记: https://www.cyberlight.xyz/Potato Blog: https://www.liuya.love/更多如果你在使用中遇到任何问题，欢迎在 https://github.com/Cyberbolt/cfw/issues 处留言。有了你的帮助，CFW 才能日渐壮大。总结CFW 可以防止一定程度的 DDoS 攻击，同时能控制开启或关闭 Linux 系统的 TCP/UDP 端口，很好地帮助我们解决恶意 IP 入侵的问题。但是不要做不切实际的想象，认为 CFW 可以抵御大型 DDoS 攻击。DDoS 攻击的规模往往与成本是正相关的，必要时提升网络带宽才能解决问题的根本。作者简介：Cyberbolt：一个自由的 Python 开发者。作者：Cyberbolt 编辑：wxy本文由贡献者投稿至 Linux 中国公开投稿计划，采用 CC-BY-SA 协议 发布，Linux中国 荣誉推出
我创建了 Linux nftwatch 命令来观察防火墙的流量统计。Netfilter 表（nftables）是现代 Linux 发行版中的默认防火墙。它在 Fedora 和 RHEL 8、最新的 Debian 和许多其他版本上都有。它取代了早期发行版中捆绑的旧版 iptables。它是一个强大的、值得的 iptables 替代品，作为一个广泛使用它的人，我欣赏它的能力和功能。nftables 的一个特点是能够为许多元素添加计数器，例如规则。这些都是按需启用的。你需要使用 counter 参数，在每一行明确地要求它。我为我的防火墙中的特定规则启用了这些计数器，这使我能够看到这些规则。这让我开始思考。我怎样才能实时查看这些计数器？一开始我尝试了 watch，它允许诸如刷新率之类的东西，但我不喜欢默认格式，而且它不能滚动。我发现使用 head 和 tail 以及 awk 也不理想，并不存在一个用户友好的解决方案。所以我自己写了一个，我想与开源社区分享。Linux 上的 nftwatch 介绍我的解决方案，我称之为 nftwatch，做了几件事：它对 nftables 的输出进行重新排序和改写，使其更具有可读性。它允许向上或向下滚动输出。可以由用户定义的刷新率（可以实时改变）。它可以暂停显示。你得到的不是一个表格的转储，而是显示每个规则活动的输出。你可以从它的 Git 仓库下载它。它是 100% 的 Python 代码，100% 的开源，100% 的免费。它满足了所有免费的高质量程序的要求。在 Linux 上安装 nftwatch以下是手动安装说明：克隆或从 git 仓库下载该项目。将 nftwatch.yml 复制到 /etc/nftwatch.yml。将 nftwatch 复制到 /usr/local/bin/nftwatch 并使用 chmod a+x 授予其可执行权限。使用 nftwatch，不带任何参数来运行它。参见 nftwatch -m 的手册。你也可以在没有 YAML 配置文件的情况下运行 nftwatch，在这种情况下它使用内置的默认值。使用nftwatch 命令显示 nftables 规则。大多数控制都是为此目的而设计的。箭头键和等效的 Vim 的按键控制滚动。使用 F 或 S 键来改变刷新速度。使用 P 键来暂停显示。运行 nftwatch -m 以获得完整的说明，以及交互式按键控制的列表。防火墙的新观点即使你花费了时间去配置防火墙，它也会显得晦涩难懂和模糊不清。除了从日志条目中推断指标外，很难判断你的防火墙实际看到的活动类型。 使用 nftwatch，你可以看到你的防火墙在工作，并且可以更好地了解你的网络每天需要处理的流量类型。（文内图片来自 Kenneth Aaron，CC BY-SA 4.0）via: https://opensource.com/article/22/7/nftwatch-linux-firewall作者：Kenneth Aaron 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
硬核观察 # 577 影响所有 Linux 防火墙的安全漏洞被发现
影响所有 Linux 防火墙的安全漏洞被发现安全研究人员在 Linux 的 netfilter 中发现了 一个漏洞，“可以利用它来实现内核代码的执行，能够做到完全的本地权限提升、容器逃逸等。”几乎所有的 Linux 防火墙工具，如 iptables、nftables、firewalld 和 ufw 背后都有 netfilter，它控制着进出 Linux 的网络栈。漏洞原因是 netfilter 没有正确处理硬件卸载功能，即使被攻击的硬件没有卸载功能。这个漏洞存在于 Linux 内核 5.4 到 5.6.10 版本中。影响了最近的主要发行版，如 RHEL 8.x、Debian Bullseye、Ubuntu Linux 和 SUSE SLE 15.3。老王点评：几乎所有的 Linux 都会启用 netfilter 防火墙，因此这个漏洞必须得补上，而无法规避。20 年的 Debian 开发者被排挤出项目一位在 Debian 项目中服务超过 20 年的开发者在去年 12 月被降级为维护者，导致他决定 离开该项目。他称，Debian 客户经理团队认为他“多年来一直在欺负项目成员”，“不能与社区团队沟通”。他现在已经加入了 Arch Linux 项目。他表示他将在以后的博文中解释更多的情况。老王点评：是非曲直我们并不知道，但是有人的地方就有江湖，开源社区也不例外。英特尔准备让其 SGX 支持 Linux 下的微码更新越来越多的用户对他们的内核进行热补丁，并在不重启系统的情况下应用微码更新。但英特尔的“软件防护扩展”（SGX）还不允许实时微码更新。在一个正在运行的系统上进行 CPU 微码更新将破坏 SGX 认证，SGX 将停留在认证旧版本上，直到重新启动，而新的更新由于不同的版本而被认为受损。英特尔 正在引入 一个新的 SGX 指令 “EUPDATESVN”，允许其证明更新的微代码信息，而不需要重新启动。老王点评：虽然 SGX 屡屡出现安全问题，但是这个对安全还是很有意义的，要是能支持实时微码更新，那就更好了。回音被曝在 Windows 11 Insider 的文件管理器测试广告后，微软表示，这是一个实验性的横幅，并不打算对外发布，并且已经被关闭了，但不排除未来在文件资源管理器中出现广告。
在你通过 Kubernetes 部署一个应用之前，了解 Kubernetes 的网络策略是一个基本的要求。随着越来越多的云原生应用程序通过 Kubernetes 部署到生产环境，安全性是你必须在早期就需要考虑的一个重要检查项。在设计云原生应用程序时，预先嵌入安全策略非常重要。不这样做会导致后续的安全问题，从而导致项目延迟，并最终给你带来不必要的压力和金钱投入。这么多年来，人们总是把安全留到最后，直到他们的部署即将发布到生产环境时才考虑安全。这种做法会导致项目交付的延迟，因为每个组织都有要遵守的安全标准，这些规定被绕过或不遵守，并承受大量的风险才得以实现可交付成果。对于刚开始学习 Kubernetes 实施的人来说，理解 Kubernetes 网络策略 NetworkPolicy 可能会令人生畏。但这是在将应用程序部署到 Kubernetes 集群之前必须了解的基本要求之一。在学习 Kubernetes 和云原生应用程序时，请把“不要把安全抛在脑后！”定为你的口号。NetworkPolicy 概念 网络策略 NetworkPolicy 取代了你所知道的数据中心环境中的防火墙设备 —— 如 吊舱 Pod 之于计算实例、网络插件之于路由器和交换机，以及卷之于存储区域网络（SAN）。默认情况下，Kubernetes 网络策略允许 吊舱 Pod 从任何地方接收流量。如果你不担心吊舱的安全性，那么这可能没问题。但是，如果你正在运行关键工作负载，则需要保护吊舱。控制集群内的流量（包括入口和出口流量），可以通过网络策略来实现。要启用网络策略，你需要一个支持网络策略的网络插件。否则，你应用的任何规则都将变得毫无用处。Kubernetes.io 上列出了不同的网络插件：CNI 插件：遵循 容器网络接口 Container Network Interface （CNI）规范，旨在实现互操作性。Kubernetes 遵循 CNI 规范的 v0.4.0 版本。Kubernetes 插件：使用桥接器和主机本地 CNI 插件实现基本的 cbr0。应用网络策略要应用网络策略，你需要一个工作中的 Kubernetes 集群，并有支持网络策略的网络插件。但首先，你需要了解如何在 Kubernetes 的环境使用网络策略。Kubernetes 网络策略允许 吊舱 从任何地方接收流量。这并不是理想情况。为了吊舱安全，你必须了解吊舱是可以在 Kubernetes 架构内进行通信的端点。1、使用 podSelector 进行吊舱间的通信： - namespaceSelector: matchLabels: project: myproject 2、使用 namespaceSelector 和/或 podSelector 和 namespaceSelector 的组合进行命名空间之间的通信和命名空间到吊舱的通信。： - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend 3、对于吊舱的 IP 块通信，使用 ipBlock 定义哪些 IP CIDR 块决定源和目的。 - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 注意吊舱、命名空间和基于 IP 的策略之间的区别。对于基于吊舱和命名空间的网络策略，使用选择器来控制流量，而对基于 IP 的网络策略，使用 IP 块（CIDR 范围）来定义控制。把它们放在一起，一个网络策略应如下所示：apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: app: backend policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 192.168.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 参考上面的网络策略，请注意 spec 部分。在此部分下，带有标签 app=backend 的 podSelector 是我们的网络策略的目标。简而言之，网络策略保护给定命名空间内称为 backend 的应用程序。此部分也有 policyTypes 定义。此字段指示给定策略是否适用于选定吊舱的入口流量、选定吊舱的出口流量，或两者皆有。spec: podSelector: matchLabels: app: backend policyTypes: - Ingress - Egress 现在，请看 Ingress（入口）和 Egress（出口）部分。该定义规定了网络策略的控制。首先，检查 ingress from 部分。此实例中，网络策略允许从以下位置进行吊舱连接：ipBlock允许 172.17.0.0/16拒绝 192.168.1.0/24namespaceSelectormyproject: 允许来自此命名空间并具有相同标签 project=myproject 的所有吊舱。podSelectorfrontend: 允许与标签 role=frontend 匹配的吊舱。ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 192.168.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend 现在，检查 egress to 部分。这决定了从吊舱出去的连接：ipBlock10.0.0.0/24: 允许连接到此 CIDRPorts: 允许使用 TCP 和端口 5978 进行连接egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 网络策略的限制仅靠网络策略无法完全保护你的 Kubernetes 集群。你可以使用操作系统组件或 7 层网络技术来克服已知限制。你需要记住，网络策略只能解决 IP 地址和端口级别的安全问题 —— 即开放系统互联（OSI）中的第 3 层或第 4 层。为了解决网络策略无法处理的安全要求，你需要使用其它安全解决方案。以下是你需要知道的一些 用例，在这些用例中，网络策略需要其他技术的增强。总结了解 Kubernetes 的网络策略很重要，因为它是实现（但不是替代）你通常在数据中心设置中使用的防火墙角色的一种方式，但适用于 Kubernetes。将此视为容器安全的第一层，仅仅依靠网络策略并不是一个完整的安全解决方案。网络策略使用选择器和标签在吊舱和命名空间上实现安全性。此外，网络策略还可以通过 IP 范围实施安全性。充分理解网络策略是在 Kubernetes 环境中安全采用容器化的一项重要技能。via: https://opensource.com/article/21/10/kubernetes-networkpolicy作者：Mike Calizo 选题：lujun9972 译者：perfiffer 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
硬核观察 #343 第一款龙芯架构的芯片的性能测试一般
第一款龙芯架构的芯片的性能测试一般本周发布的龙芯 3A5000 是第一款龙芯架构的芯片，四核，时钟速度高达 2.3~2.5GHz。据称龙芯 3A5000 的性能比之前基于 MIPS 的芯片提高了 50%，同时功耗更低。据 phoronix 报道，龙芯 3A5000 已经在 OpenBenchmarking.org 上传了一些 Phoronix 测试套件的基准测试结果，总的来说，如果与现代英特尔/AMD 甚至 ARM 的竞争对手相比，性能并不那么令人印象深刻。龙芯 3A5000 上的简易 C-Ray 基准测试 大约为 393 秒，在排名上与基于 ARM 的飞腾 FT-2000 或 Core i3 8109U / Core 2 Quad Q9500 / Core i5 750 差不多。甚至用于服务器的龙芯 3A5000LL 的 Perl 基准测试也是 OpenBenchmarking 上所看到的最慢的结果之一。在几个其它基准测试中，龙芯 3A5000 也只能与飞腾 ARMv8 SoC 相比较。这还只是龙芯架构迈出的第一步，让我们多给它一些时间。Linux 防火墙 Firewalld 十年后发布了 1.0Firewalld 是红帽公司十年前开始的，用于通过 Netfilter 管理 Linux 的防火墙功能。在首次发布十年半之后，发布了 Firewalld 1.0。Firewalld 1.0 带来了一些突破性的变化，包括放弃对 Python 2 的支持，默认支持区内转发，NAT 规则被移到 iNet 系列，默认目标现在类似于拒绝，废弃了旧的 IPTables 后端等等。对于终端用户来说，它可以普遍减少规则集大小。预计将在 Fedora 35 上推出。Linux 界的传统就是这么谦虚，都在生产环境用了 10 年了才发布 1.0，不过现在这个传统已经逐渐被那些飙版本号的抛弃了。GitHub 提高了 Go 模块的供应链安全性GitHub 宣布对基于 Go 编程语言的模块进行了一系列供应链安全升级。Go 现在是该平台上最流行的编程语言之一。根据 2020 年 Go 开发者调查，76% 的受访者表示，Go 现在已经以某种形式在企业中使用，96% 的受访者表示这些模块被用于包管理。GitHub 为 Go 模块主要提供了如下供应链安全改进：咨询建议数据库，目前包含 150 多个建议；依赖关系图，可以通过 go.mod 来监控、分析项目的依赖关系，在发现有漏洞的依赖关系时提醒用户；依赖机器人，启用自动拉动请求来修补有漏洞的 Go 模块。通过软件仓库来解决软件供应链攻击风险是一个好的思路。
如果你运行的服务器有面向公众的 SSH 访问，你可能遇到过恶意登录尝试。本文介绍了如何使用两个实用程序来防止入侵者进入我们的系统。为了防止反复的 ssh 登录尝试，我们来看看 fail2ban。而且，如果你不经常旅行，基本上停留在一两个国家，你可以将 FirewallD 配置为只允许从你选择的国家访问。首先，让我们为不熟悉这些应用程序的人员介绍一些术语，以完成这项工作：fail2ban：一个守护进程，用于禁止发生多次认证错误的主机。fail2ban 将监控 SystemD 日志，以查找对任何已启用的“ 监狱 jail ”的失败的验证尝试。在达到指定失败次数后，它将添加一个防火墙规则，在配置的时间内阻止该特定 IP 地址。FirewallD：一个带有 D-Bus 接口的防火墙守护进程，提供动态防火墙。除非你另行决定使用传统的 iptables，否则你已经在所有支持的 Fedora 和 CentOS 上安装了 FirewallD。假定前提主机系统有一个互联网连接，并且要么是直接暴露在互联网上，要么是通过 DMZ（这两个都是非常糟糕的想法，除非你知道你在做什么），要么是有一个端口从路由器转发过来。虽然大部分的内容可能适用于其他系统，但本文假设当前系统是 Fedora（31 及以上）或 RHEL/CentOS 8 版本。在 CentOS 上，你必须用 sudo dnf install epel-release 启用 Fedora EPEL 仓库。安装与配置Fail2Ban很有可能已经有某个 Firewalld 区已经允许 SSH 访问，但 sshd 服务本身默认没有启用。要手动启动它，并且不在启动时永久启用它：$ sudo systemctl start sshd 或者在系统启动时启用，并同时启动它：$ sudo systemctl enable --now sshd 下一步就是安装、配置、启用 fail2ban。和往常一样，安装可以通过命令行完成：$ sudo dnf install fail2ban 安装完毕后，下一步就是配置“监狱”（你要以设置的任何阈值监视并禁止的服务）。默认情况下，IP 会被禁止 1 小时（这其实不够长）。最好的做法是使用 *.local 文件覆盖系统默认值，而不是直接修改 *.config 文件。如果我们查看我的 jail.local，我们可以看到：# cat /etc/fail2ban/jail.local [DEFAULT] # "bantime" is the number of seconds that a host is banned. bantime = 1d # A host is banned if it has generated "maxretry" during the last "findtime" findtime = 1h # "maxretry" is the number of failures before a host get banned. maxretry = 5 换成通俗的语言讲，就是在过去一小时内尝试 5 次后，该 IP 将被封禁 1 天。对于多次被封的 IP，也可以选择增加封禁时间，但这是另一篇文章的主题。下一步是配置“监狱”。在本教程中显示的是 sshd，但其他服务的步骤大致相同。在 /etc/fail2ban/jail.d 中创建一个配置文件。这是我的文件：# cat /etc/fail2ban/jail.d/sshd.local [sshd] enabled = true 就这么简单! 很多配置已经在为 Fedora 构建的软件包中处理了（提示：我是当前的维护者）。接下来启用并启动 fail2ban 服务：$ sudo systemctl enable --now fail2ban 希望没有立即出错，如果没有，请使用下面的命令检查 fail2ban 的状态：$ sudo systemctl status fail2ban 如果它没有错误地启动，应该是这样的：$ systemctl status fail2ban ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2020-06-16 07:57:40 CDT; 5s ago Docs: man:fail2ban(1) Process: 11230 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) Main PID: 11235 (f2b/server) Tasks: 5 (limit: 4630) Memory: 12.7M CPU: 109ms CGroup: /system.slice/fail2ban.service └─11235 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start Jun 16 07:57:40 localhost.localdomain systemd[1]: Starting Fail2Ban Service… Jun 16 07:57:40 localhost.localdomain systemd[1]: Started Fail2Ban Service. Jun 16 07:57:41 localhost.localdomain fail2ban-server[11235]: Server ready 如果是刚刚启动的，fail2ban 不太可能显示任何有意思的信息，但要检查 fail2ban 的状态，并确保“监狱”被启用，请输入：$ sudo fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd sshd “监狱”的上级状态也会显示出来。如果启用了多个“监狱”，它们会在这里显示出来。要查看一个“监狱”的详细状态，只需在前面的命令中添加“监狱”名称。下面是我的系统的输出，它已经运行了一段时间。我已经从输出中删除了被禁止的 IP：$ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 8 | |- Total failed: 4399 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 101 |- Total banned: 684 `- Banned IP list: ... 监控 fail2ban 日志文件是否有入侵尝试，可以通过“尾随”日志来实现：$ sudo tail -f /var/log/fail2ban.log tail 是一个很好的命令行工具，默认情况下，它可以显示一个文件的最后 10 行。添加 -f 告诉它尾随文件，这是个观察一个仍在被写入的文件的很好方式。由于输出的内容中有真实的 IP，所以这里不会提供样本，但它的可读性很高。INFO 行通常是登录的尝试。如果从一个特定的 IP 地址进行了足够多的尝试，你会看到一个 NOTICE 行显示一个 IP 地址被禁止。在达到禁止时间后，你会看到一个 NOTICE 解禁行。注意几个警告行。最常见的情况是，当添加了一个禁止后，fail2ban 发现该 IP 地址已经在其禁止数据库中，这意味着禁止可能无法正常工作。如果是最近安装的 fail2ban 包，它应该被设置为 FirewallD 的富规则。这个包在 fail2ban-0.11.1-6 版本时从 ipset 方式切换到了富规则方式，所以如果你的 fail2ban 安装时间较早，它可能还在尝试使用 ipset 方式，这种方式使用的是传统的 iptables，不是很可靠。FirewallD 配置被动还是主动？有两种策略可以分开或一起使用：被动地将单个 IP 地址或主动地根据来源国将子网永久列入黑名单。对于被动方式，一旦 fail2ban 运行了一段时间，最好再运行 sudo fail2ban-client status sshd 来看看有哪些坏蛋。很可能会有很多被禁止的 IP 地址。选择一个，然后试着对它运行 whois。在输出结果中可能会有很多有趣的信息，但是对于这个方法来说，只有来源国是重要的。为了保持简单，让我们过滤掉除了国家以外的所有信息。在这个例子中，我们将使用一些著名的域名：$ whois google.com | grep -i country Registrant Country: US Admin Country: US Tech Country: US $ whois rpmfusion.org | grep -i country Registrant Country: FR $ whois aliexpress.com | grep -i country Registrant Country: CN 使用 grep -i 的原因是为了使 grep 不区分大小写，而大多数条目都使用的是 “Country”，而有些条目则是全小写的 “country”，所以这种方法无论如何都能匹配。现在知道了尝试入侵的来源国，问题是，“是否有来自这个国家的人有合法的理由连接到这台计算机？”如果答案是否定的，那么封锁整个国家应该是可以接受的。从功能上看，主动式方法它与被动式方法没有太大区别，然而，来自有些国家的入侵企图是非常普遍的。如果你的系统既不放在这些国家里，也没有任何源自这些国家的客户，那么为什么不现在就把它们加入黑名单而是等待呢？（LCTT 译注：我的经验是，动辄以国家的范畴而列入黑名单有些过于武断。建议可以将该 IP 所属的 WHOIS 网段放入到黑名单，因为这些网段往往具有相同的使用性质，如都用于用户接入或 IDC 托管，其安全状况也大致相同，因此，如果有来自该网段的某个 IP 的恶意尝试，可以预期该网段内的其它 IP 也可能被利用来做这样的尝试。）黑名单脚本和配置那么如何做到这一点呢？用 FirewallD ipset。我开发了下面的脚本来尽可能地自动化这个过程：#!/bin/bash # Based on the below article # https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist # Source the blacklisted countries from the configuration file . /etc/blacklist-by-country # Create a temporary working directory ipdeny_tmp_dir=$(mktemp -d -t blacklist-XXXXXXXXXX) pushd $ipdeny_tmp_dir # Download the latest network addresses by country file curl -LO http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz tar xf all-zones.tar.gz # For updates, remove the ipset blacklist and recreate if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then firewall-cmd -q --permanent --delete-ipset=blacklist fi # Create the ipset blacklist which accepts both IP addresses and networks firewall-cmd -q --permanent --new-ipset=blacklist --type=hash:net \ --option=family=inet --option=hashsize=4096 --option=maxelem=200000 \ --set-description="An ipset list of networks or ips to be dropped." # Add the address ranges by country per ipdeny.com to the blacklist for country in $countries; do firewall-cmd -q --permanent --ipset=blacklist \ --add-entries-from-file=./$country.zone && \ echo "Added $country to blacklist ipset." done # Block individual IPs if the configuration file exists and is not empty if [ -s "/etc/blacklist-by-ip" ]; then echo "Adding IPs blacklists." firewall-cmd -q --permanent --ipset=blacklist \ --add-entries-from-file=/etc/blacklist-by-ip && \ echo "Added IPs to blacklist ipset." fi # Add the blacklist ipset to the drop zone if not already setup if firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then echo "Blacklist already in firewalld drop zone." else echo "Adding ipset blacklist to firewalld drop zone." firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist fi firewall-cmd -q --reload popd rm -rf $ipdeny_tmp_dir 这个应该安装到 /usr/local/sbin，不要忘了让它可执行！$ sudo chmod +x /usr/local/sbin/firewalld-blacklist 然后创建一个配置文件 /etc/blacklist-by-country：# Which countries should be blocked? # Use the two letter designation separated by a space. countries="" 而另一个配置文件 /etc/blacklist-by-ip，每行只有一个 IP，没有任何额外的格式化。在这个例子中，从 ipdeny 的区文件中随机选择了 10 个国家：# ls | shuf -n 10 | sed "s/\.zone//g" | tr '\n' ' ' nl ee ie pk is sv na om gp bn 现在只要在配置文件中加入至少一个国家，就可以运行了！$ sudo firewalld-blacklist % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 142 100 142 0 0 1014 0 --:--:-- --:--:-- --:--:-- 1014 100 662k 100 662k 0 0 989k 0 --:--:-- --:--:-- --:--:-- 989k Added nl to blacklist ipset. Added ee to blacklist ipset. Added ie to blacklist ipset. Added pk to blacklist ipset. Added is to blacklist ipset. Added sv to blacklist ipset. Added na to blacklist ipset. Added om to blacklist ipset. Added gp to blacklist ipset. Added bn to blacklist ipset. Adding ipset blacklist to firewalld drop zone. success 要验证 FirewallD 黑名单是否成功，请检查 drop 区和 blacklist ipset。$ sudo firewall-cmd --info-zone=drop drop (active) target: DROP icmp-block-inversion: no interfaces: sources: ipset:blacklist services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: $ sudo firewall-cmd --info-ipset=blacklist | less blacklist type: hash:net options: family=inet hashsize=4096 maxelem=200000 entries: 第二条命令将输出所有的子网，这些子网是基于被封杀的国家而添加的，可能会相当长。那么现在我该怎么做？虽然在开始的时候，监控的频率会比较高，但随着时间的推移，入侵尝试的次数应该会随着黑名单的增加而减少。那么目标应该是维护而不是主动监控。为此，我创建了一个 SystemD 服务文件和定时器，这样每月都会刷新由 ipdeny 维护的每个国家的子网。事实上，这里讨论的所有内容都可以从我的 pagure.io 项目中下载。是不是很高兴你看完了整篇文章？现在只要把服务文件和定时器下载到 /etc/systemd/system/，并启用定时器就行了：$ sudo systemctl daemon-reload $ sudo systemctl enable --now firewalld-blacklist.timer via: https://fedoramagazine.org/protect-your-system-with-fail2ban-and-firewalld-blacklists/作者：hobbes1069 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在上一篇文章中，我们探讨了如何在 Fedora 中用命令行控制防火墙。现在你将看到如何“添加”、“删除”和“列出”服务、协议和端口，以便“阻止”或“允许”它们。简短回顾首先，最好检查一下防火墙的状态，看它是否正在运行。如我们先前所学，你可以使用状态选项（firewall-cmd ‐‐state）来得到。下一步是获取网络接口适用的 域 zone 。例如，我使用的桌面有两个网络接口：一个物理接口（enp0s3），代表我实际的网卡，和虚拟接口（virbr0），它由 KVM 等虚拟化软件使用。要查看哪些域处于活动状态，请运行 firewall-cmd ‐‐get-active-zones。现在，你知道了你感兴趣的域，可以使用 firewall-cmd ‐‐info-zone=FedoraWorkstation 这样的命令列出该域的规则。读取区域信息要显示特定域的信息，请运行 firewall-cmd ‐‐zone=ZoneName ‐‐list-all，或使用以下命令显示默认域的信息：[dan@localhost ~]$ firewall-cmd --list-all FedoraWorkstation (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: dhcpv6-client mdns samba-client ssh ports: 1025-65535/udp 1025-65535/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:现在，让我们查看输出。第一行表明以下信息关联的域以及该域当前是否在使用中。target: default：告诉我们这是默认域。可以通过 ‐‐set-default-zone=ZoneName 和 ‐‐get-default-zone 设置或获取。icmp-block-inversion 表明是否阻止 ICMP 请求。例如，如果机器响应来自网络上其他机器的 ping 请求。interfaces 字段显示接受此域的所有接口。处理服务、端口和协议现在，重点关注 services、ports 和 protocols 所在行。默认情况下，防火墙将阻止所有端口、服务和协议，而只允许列出的。在这里，你可以看到允许的服务是非常基本的客户端服务。例如，访问网络上的共享文件夹（samba-client）、与 DNS 服务器通信或通过 SSH（ssh 服务）连接到计算机。你可以将 service 视为与端口组合的协议，例如 ssh 服务使用 SSH 协议，并且按照惯例使用 22 端口。通过允许 ssh 服务，你实际上所做的就是允许传入的连接在默认 22 端口上使用 SSH 协议。请注意，根据经验，名称中带有 client 字样的服务是指传出连接，也就是你使用你的 IP 作为源对外部的连接，与之相反的是 ssh 服务，比如，它将接受传入连接（监听来自外部的连接）。你可以在文件 /etc/services 中查找服务。例如，如果你想知道这些服务使用什么端口和协议：[dan@localhost ~]$ cat /etc/services | grep ssh ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol你可以看到 SSH 同时使用 TCP 和 UDP 的 22 端口。此外，如果你希望查看所有可用的服务，只需使用 firewall-cmd --get-services。打开端口如果要阻止端口、服务或协议，请确保在此处未列出它们。展开来说，如果要允许服务，那么需要将它添加到列表中。假设你要打开 5000 端口用于 TCP 连接。为此，请运行：sudo firewall-cmd --zone=FedorwaWorkstation --permanent --add-port=5000/tcp请注意，你需要指定规则适用的域。添加规则时，还需要如上指定它是 tcp 还是 udp 端口。--permanent 参数将规则设置为即使系统重启后也可以保留。再次查看你所在区域的信息：[dan@localhost ~]$ firewall-cmd --list-all FedoraWorkstation (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: dhcpv6-client mdns samba-client ssh ports: 1025-65535/udp 1025-65535/tcp 5000/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:类似地，如果你想从列表删除该端口，请运行：sudo firewall-cmd --zone=FedorwaWorkstation --permanent --remove-port=5000/tcp相同的 remove （‐‐remove-protocol、‐‐remove-service） 和 add（‐‐add-protocol、‐‐add-service）选项同样适用于服务和协议。via: https://fedoramagazine.org/how-to-manage-network-services-with-firewall-cmd/作者：dan01 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
FirewallD 是由红帽发起的提供了支持网络/防火墙 区域 （ zone ） 定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥接，并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。由于 FirewallD 项目本身的自由软件特性，像 Debian Linux 社区发行版已经默认在软件仓库中收录了该防火墙组件软件包。随着各个新 GNU/Linux 发行版中防火墙引擎逐步从 iptables 向 nftables 迁移，FirewallD 是目前唯一能够支持该两种防火墙后端引擎的前端服务组件，用户掌握以后可以方便的进行防火墙配置并很好的规避了从 iptables 向 nftables 迁移带来的学习恐慌。笔者通过查阅 RedHat 8 发行版网络配置手册，并结合自己在 Debian Linux 10 社区版上进行 FirewallD 防火墙的实际配置使用，对该服务组件的功能和日常使用进行整理。希望通过该文能帮助其他 Linux 用户掌握该防火墙，并通过该防火墙提高主机测网络安全防御能力，打造可信的网络安全环境。一、安装在 Debian Linux 10 社区版中使用如下命令：apt-get install firewall-applet firewall-config firewalld就可以直接进行 FirewallD 防火墙软件组件包的安装，其中：firewall-applet 为 FirewallD 托盘小程序，firewall-config 为 FirewallD 图形化系统配置管理工具firewalld 为 FirewallD 防火墙软件组件的主组件包，其中包含 firewall-cmd、firewall-offline-cmd 等命令行系统配置管理工具。在 RedHat 8 下该防火墙组件默认已经进行了安装，如果用户进行特殊定制安装之后需要单独安装该软件组件可以使用命令yum install firewall-config直接进行安装即可。笔者在两个系统装进行过安装对比，发现该软件组件包在两个系统上除了安装命令稍有差异外，其它从配置文件到 systemd 服务配置并没有任何区别。随后的内容将不再强调操作系统。二、防火墙默认区域Block（阻塞） 任何对该区域的连接请求都会被以 IPv4 的 icmp-host-prohibited 信息或 IPv6 的 icmp6-adm-prohibited 信息所拒绝。只能从系统内部启动网络连接。Dmz（隔离） 用于你的隔离区内的电脑，此区域内可公开访问，可以有限地进入你的内部网络，仅仅接收经过选择的连接。Drop（丢弃） 对进入该区域的所有数据包丢弃，并且不进行任何回包，区域内主动发起连接的流入回程数据包允许通过，允许进行出方向的网络连接。External（外部） 用于在启用伪装的外部网络上使用，尤其路由器、防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。Home（家庭） 默认其他同区域内主机可信，仅仅接收经过选择的连接。同时默认放行 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务产生的连接。Internal（内部） 从描述中可以等同于家庭区域。Public（公开） 公共区域，也是防火墙配置的默认区域，防火墙认为该区域主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh 与 dhcpv6-client 服务产生的连接。Trusted（可信） 可信区域，防火墙放行一切流量。等同于关闭防火墙功能。Work（工作） 工作区域，防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh、ipp-client 与 dhcpv6-client 服务产生的连接。这些区域的命名不言自明，用户可以很快选择一个合适的安全区域，从而简化和避开很多安全问题。当然用户也可以根据自己的需要或者安全评估来根据自己的实际需求对相应安全域进行更个性化的配置，以适应自己的安全管理规范。尽管有些安全域的安全规则是相同的，但之所以还要在名字上有所区别，主要是为了从习惯上让用户更好区分不同域的独特使用场景，对用户来说更好理解和便于区分。三、防火墙日常管理3.1、查看防火墙当前状态查询状态：firewall-cmd --state更多的防火墙系统服务状态信息可以使用systemctl status firewalld在你配置新的防火墙规则之前，你需要了解如何通过命令查看当前防火墙配置。查看防火墙当前配置可以通过图形界面或者在终端模式下使用命令进行。在图形界面下可以直接通过点击应用程序“firewall-config”图标或者在终端窗口中输入 firewall-config 命令进行防火墙配置。如果当前用户为非 root 用户，系统将弹出管理员认证窗口，用户正确输入管理员密码后，防火墙配置窗口就会打开，用户即可以按照窗口界面提供的功能进行操作。用户也可以在命令行下使用 firewall-cmd工具进行防火墙配置。命令行工具虽然学习起来需要一定的时间，不过该工具可以完全在系统处于终端模式下进行各种复杂的防火墙全功能配置，用户有必要进行认真的学习和掌握。3.2、防火墙基础命令FirewallD 使用了区域进行数据流的管理，当用户使用 firewall-cmd --list-all 命令时，如果没有使用 --zone 指定区域，那么系统将返回默认区域的当前配置状态。默认区域由配置文件 /etc/firewalld/firewalld.conf 中的字段 DefaultZone 定义，初始状态下，默认区域被定义为 public（公共区域）。用户可以使用命令：firewall-cmd --get-zones查看当前系统防火墙设置的的区域名列表，也可以使用命令：firewall-cmd --get-default-zone查看防火墙当前的默认区域；同时，可使用命令：firewall-cmd --set-default-zone=[zonename]或者通过直接编辑配置文件中 DefaultZone 字段的值进行默认区域的修改。启动防火墙：systemctl unmask firewalld systemctl start firewalld让防火墙随系统启动一起启动：systemctl enable firewalld停止防火墙：systemctl stop firewalld停止随系统启动：systemctl disable firewalld停止通过访问 firewalld D-Bus 接口和其他服务需要 firewalld 依赖导致的 firewalld 自动启动，更加干净的关闭 firewalld 服务：systemctl mask firewalld按照 RedHat 的官方文档定义，防火墙运行之后被称为运行时状态，保存了启动默认参数之后的配置被称为永久状态。在当前运行状态对防火墙进行的所有配置修改，系统即时生效，但重启后防火墙会恢复到它之前的永久状态，其实这一过程就是从保存之后的配置文件中加载相应配置参数的过程。用户可以使用命令：fiewall-cmd --runtime-to-permanent对当前修改过的规则即时保存为永久配置，也可以使用命令 firewall-cmd --permanent 并在其后添加其它参数永久进行修改。重新启动 firewalld 将关闭所有打开的端口并停止网络通信，需要使用命令：firewall-cmd --reload重新加载永久配置使之生效。FirewallD 提供了一种系统受到攻击的紧急操作功能。假设攻击者对系统进行攻击，用户可以直接使用命令：firewall-cmd --panic-on关闭网络通信并且切断攻击者，而不用像之前那样通过物理拔除网线来进行断网操作，防止了系统在多网口环境中一次性插拔所有网线可能带来的混乱以及由此引发的系统恢复后延续问题。需要恢复网络通信时用户只要使用命令：firewall-cmd --panic-off关闭恐慌模式即可，用户也可以使用命令：firewall-cmd --query-panic查询防火墙当前恐慌模式的状态。3.2、防火墙服务管理命令用户可以通过命令行工具添加预定义的服务类型，防火墙会自动根据所需的端口并将其他设置修改为服务定义文件。使用命令：firewall-cmd --list-services可以查看当前区域内被允许的服务。使用命令：firewall-cmd --get-services可以列出所有防火墙已经给定的预定义服务名称。使用命令：firewall-cmd --add-service=<service-name>可以添加具体服务，服务名称用户可以根据自己的实际需求从预定义服务名称中选取合适的服务名进行添加。完成之后用户可以使用命令：firewall-cmd --runtime-to-permanent将对运行时的修改保存为永久。用户可以通过命令 firewall-config、firewall-cmd 和 firewall-offline-cmd，或者通过直接将 /usr/lib/firewalld/services 目录的默认模板 XML 文件复制到 /etc/firewalld/services 目录中进行编辑来添加一个自定义服务类型。具体过程如下：方法一：执行 firewall-cmd –new-service=service-name，系统将直接在 /etc/firewalld/services 目录下创建一个以 .xml 结尾的同名文件，自定义服务类型添加完成。方法二：在相应目录使用编辑软件直接编辑好 XML 文件并执行 firewall-cmd --new-service-from-file=service-name.xml，系统将自动完成同名自定服务类型的添加。端口作为特定系统服务的接收和区分网络流量并将其转发到系统服务的逻辑设备，系统守护进程通常侦听特定的服务端口。防火墙在默认的服务类型配置中已经定义了相应服务需要放行的对应的端口。当用户还需要在某个服务中放行特定的自定义端口或者端口段的时候可以通过 firewall-cmd 完成，格式如下：firewall-cmd [--zone=zone_name] [--service=service_name] --add-port=port-number/port-type这里需要说明的是 --zone、--service 为可选参数，如果用户不添加这两个参数执行命令时相当与在默认区域中直接添加了端口，当只选取了 --zone 参数时，命令执行的结果是在指定区域直接添加端口，此时与服务状态无关。只有在使用 --service 参数时才是在相应的服务中添加端口。当用户需要删除一个端口时可以使用如下命令：# firewall-cmd [--zone=zone_name] [--service=service_name] --remove-port=port-number/port-type当用户需要向不同区域添加服务时，用户可以通过如下步逐进行：# firewall-cmd --add-service=ssh --zone=drop该命令将向区域 drop 中添加 ssh 服务，其实质就是放行 ssh 服务定义中的默认 22 端口入站方向的流量及连接。在多网络接口主机中，可以使用如下方法将指定的网络接口添加到需要的区域中，从而实现每个接口的安全连接区域要求，实现真正的区域化网络安全管理。使用命令：firewall-cmd --get-active-zones查看当前激活的安全区域和相应的网络接口配置。使用命令firewall-cmd --zone=work --change-interface=ens3p0则将网卡 ens3p0 加入到了 work 区域，之后所有通过该网卡的流量将受到区域安全规则的约束和限制，该配置是即时生效的并且会自动保存为永久配置。用户需要将某个网卡加入到特定安全区域也可以直接使用：vi /etc/sysconfig/network-scripts/ifcfg-connection-name并在该文件下加入 ZONE=zone-name 行，该网卡即属于特定的安全区域。用户可以对安全区域进行默认规则设置，默热规则包括三个选项 ACCEPT、REJECT、DROP，其中 ACCEPT 选项将放行所有流量，REJECT、DROP 选项将阻止所有进入该安全区域的流量，与 REJECT 不同的是 DROP 选项直接丢弃进入安全区域的数据包，并不会向该数据包的发起者回复任何信息。用户可以使用命令：firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>进行相应安全区域的默认规则设置。3.3、使用区域根据来源来管理传入流量你可以使用区域根据来源管理流入流量，这使你可以对传入流量进行排序，并将其路由到不同区域，以允许或禁止该流量可以到达的服务。如果将源添加到区域，则该区域将变为活动状态，并且来自该源的任何传入流量将通过它。你可以为每个区域指定不同的设置，该设置将应用于来自给定来源的流量。即使你只有一个网络接口，也可以使用更多区域。通过以下实例，我们可以将特定网段对 HTTP 的请求流量进行更细致的管理，使用命令：firewall-cmd --zone=trusted --add-source=192.168.1.0/24将该网段作为资源加入到 trusted 区中，通过命令：firewall-cmd --zone=trusted --add-service=http将 Web 服务添加到相同区域中，随后该目标地址产生的访问 Web 服务流量将可以顺利通过。3.4、防火墙锁机制为了防止本地程序比如 KVM 虚拟机组件对防火墙的修改，FirewallD 还提供了一种锁闭机制来防止本地程序或者服务组件对防火墙配置的修改，并且该命令只有 root 用户本身才可以执行。用户可以使用命令：firewall-cmd --query-lockdown查询防火墙锁闭状态，当需要锁闭时可以直接执行命令：firewall-cmd --lockdown-on恢复到非锁闭状态时可以执行命令：firewall-cmd --lockdown-off四、后记FirewallD 防火墙组件作为 RedHat 对自由软件社区的贡献之一，具有很好的普适性，希望通过本文的讲解使更多的用户开始熟悉该防火墙软件组件，并将其作为主机本地侧防护很好的技术手段，不断提高主机自身的 IPS 能力。在当今网络环境复杂的形势下让主机具有更好的安全性和可用性。
GNU/Linux 系统下 nftables 防火墙的本地 IPS 能力部署实例
随着各 GNU/Linux 系统厂商以及社区逐步开始采用新的内核作为其发行版本的默认内核，防火墙机制采用了更新的 nftables 防火墙机制。尽管红帽公司提供了 firewalld.service 防火墙服务组件以及相关的配置管理命令 firewall-config、firewall-cmd 来对防火墙进行管理，但该服务组件目前还没有在其他发行版或者社区版本内得到统一使用。为了更好的帮助读者朋友们理解该防火墙机制，笔者将自己在工作中直接使用 nftables 进行手工创建配置，从而使系统具有本地 IPS 能力的过程进行总结。目前多数主流的新发行版 GNU/Linux 系统，默认安装完成后 systemd 系统和服务管理器中已经添加了新的 nftables.serivce 子服务配置文件。同时依然支持 iptables 规则和 iptables 命令，不过为了彻底将防火墙升级到 nftables 机制，我们可以在没有 firewalld.service 的发行版系统中直接启用 nftables.service 服务来使用新的防火墙。通过执行命令 vi /lib/systemd/system/nftables.service，从该文件中的语句 ExecStart=/usr/sbin/nft -f /etc/nftables.conf 我们可以清楚的看到，nftables 防火墙的默认配置和规则文件一般都放置在系统的 /etc/nftables.conf 目录中，不过该默认配置文件中只包含一个名为 inet filter 的简单 IPv4/IPv6 防火墙列表。inet 过滤器可以同时适用于 IPv4 和 IPv6 的规则，但不能用于 NAT 类型的链，只能用于过滤器类型的链。为了保持和 iptables 防火墙的规则类比，便于用户熟悉，我们可以使用如下 nftables 命令创建相应的表和链来建立一个类似于传统 iptables 防火墙框架，创建过程如下：1、创建 nft 表与 iptables 中的表不同，nftables 中没有内置表，表的数量和名称由用户决定。但是，每个表只有一个地址簇，并且只适用于该簇的数据包。表可以指定五个（ip、ip6、inet、arp、bridge）簇中的一个，用户可以依次执行如下命令：nft add table ip filter nft add table ip6 filter nft add table bridge filter”nftables 将为我们分别建立三个 ip、ipv6、bridge 簇并且表名均为 filter 的防火墙框架。2、创建链表包含链，链的目的是保存规则。与 iptables 中的链不同，nftables 也没有内置链。这意味着与 iptables 不同，如果链不匹配 nftables 框架中的簇或钩子，则流经这些链的数据包不会被 nftables 触及。链有两种类型。基础链是来自网络栈的数据包的入口点，其中指定了钩子，其实可以理解为 iptables 防火墙的默认规则。常规链可以理解为其它用户自定义的规则链。使用如下命令为每一个表建立 INPUT、FORWARD、OUTPUT 链，并且设置基础链，其中 ip 簇 filter 表 INPUT 链默认为丢弃所有数据包的相应的命令格式如下。添加 ip 簇 filter 表相应链命令集：nft add chain ip filter INPUT { type filter hook input priority 0\; policy drop\; } nft add chain ip filter FORWARD { type filter hook forward priority 0\; policy accept\; } nft add chain ip filter OUTPUT { type filter hook output priority 0\; policy accept\; }添加 ipv6 簇 filter 表相应链命令集：nft add chain ip6 filter INPUT { type filter hook input priority 0\; policy accept\; } nft add chain ip6 filter FORWARD { type filter hook forward priority 0\; policy accept\; } nft add chain ip6 filter OUTPUT { type filter hook output priority 0\; policy accept\; }添加 bridge 簇 filter 表相应链命令集：nft add chain bridge filter INPUT { type filter hook input priority 0\; policy accept\; } nft add chain bridge filter FORWARD { type filter hook forward priority 0\; policy accept\; } nft add chain bridge filter OUTPUT { type filter hook forward priority 0\; policy accept\; }3、添加规则规则由语句或表达式构成，包含在链中。将一条规则添加到链中使用如下语法：nft add rule family table chain handle statement规则添加到 handle 处，这是可选的。如果不指定，则规则添加到链的末尾，类似于 iptables -A 方法。将规则插入到指定位置使用如下语法：nft insert rule family table chain handle statement如果未指定handle，则规则插入到链的开头，类似于 iptables -I 方法。以下是用户根据自己的实际情况添加的具体规则：放行本地回环接口 lo 的所有流量：nft add rule ip filter INPUT iif lo accept放行 established、related 状态的数据包，这一点很重要，因为多数对外访问的数据包在收到对端主机回包时多为这两种状态，如果在 INPUT 链中不放行该类型数据包，即使本机的 OUTPUT 链默认为 ACCEPT，让所有数据包出站，系统也会主动在 INPUT 链中丢弃掉相应的回包而导致数据无法交互。具体命令如下：nft add rule ip filter INPUT ct state established,related accept阻断存在重大安全隐患的系统端口，包括已经公布的比如勒索病毒等端口。nftables 在配置过程中，当用户使用端口进行添加后，nftables 会自动将端口转换为 service 模式，用户可以通过使用命令 nft describe tcp dport 对照查看。阻断安全隐患的系统端口具体命令如下：nft add rule ip filter INPUT meta l4proto tcp tcp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop nft add rule ip filter INPUT meta l4proto udp udp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop对服务进行限流控制，防止 DDoS 攻击或者 CC 攻击造成系统服务中断，可以通过 limit 限制通信速率，以下是接受一个每秒最多 10 个 web 或者 https 或者 dns 查询请求的数据包，同时可以有 2 个包超出限制的规则具体命令：nft add rule ip filter INPUT meta l4proto tcp tcp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept nft add rule ip filter INPUT meta l4proto udp udp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept总结经过以上配置后，我们的主机就具有了很好的本机 IPS 能力。应对不论是面向南北跨路由器的访问流量，还是本地网络内的东西访问流量，常规的恶意扫描或者恶意攻击基本是够用了。之后用户可以使用命令 nft list ruleset > /etc/nftables.conf 将这些规则保存在 nftables 的默认配置文件中，并使用 systemctl enable nftables.service 打开该服务的默认启动模式，之后系统将在开机时自动启动 nftables 防火墙并应用相应规则。用户也可以通过命令 vi /etc/nftables.conf 来直接按照相应规则编辑该文件来修改防火墙配置，以确保自己的系统处于本机防火墙 IPS 能力的保护之下。希望本文对你有用并能帮助到你。
防火墙是你的计算机防止网络入侵的第一道屏障。为确保你的安全，请下载我们的备忘单。合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网，通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时，那么你计算机上的那层防火墙就是仅有的一层，所以配置和控制好你 Linux 电脑上的防火墙很重要。如果你维护一台 Linux 服务器，那么知道怎么去管理你的防火墙同样重要，只要掌握了这些知识你才能保护你的服务器免于本地或远程非法流量的入侵。安装防火墙很多 Linux 发行版本已经自带了防火墙，通常是 iptables。它很强大并可以自定义，但配置起来有点复杂。幸运的是，有开发者写出了一些前端程序来帮助用户控制防火墙，而不需要写冗长的 iptables 规则。在 Fedora、CentOS、Red Hat 和一些类似的发行版本上，默认安装的防火墙软件是 firewalld，通过 firewall-cmd 命令来配置和控制。在 Debian 和大部分其他发行版上，可以从你的软件仓库安装 firewalld。Ubuntu 自带的是 简单防火墙 Uncomplicated Firewall （ufw），所以要使用 firewalld，你必须启用 universe 软件仓库：$ sudo add-apt-repository universe $ sudo apt install firewalld你还需要停用 ufw：$ sudo systemctl disable ufw没有理由不用 ufw。它是一个强大的防火墙前端。然而，本文重点讲 firewalld，因为大部分发行版都支持它而且它集成到了 systemd，systemd 是几乎所有发行版都自带的。不管你的发行版是哪个，都要先激活防火墙才能让它生效，而且需要在启动时加载：$ sudo systemctl enable --now firewalld理解防火墙的域Firewalld 旨在让防火墙的配置工作尽可能简单。它通过建立 域 zone 来实现这个目标。一个域是一组的合理、通用的规则，这些规则适配大部分用户的日常需求。默认情况下有九个域。trusted：接受所有的连接。这是最不偏执的防火墙设置，只能用在一个完全信任的环境中，如测试实验室或网络中相互都认识的家庭网络中。home、work、internal：在这三个域中，接受大部分进来的连接。它们各自排除了预期不活跃的端口进来的流量。这三个都适合用于家庭环境中，因为在家庭环境中不会出现端口不确定的网络流量，在家庭网络中你一般可以信任其他的用户。public：用于公共区域内。这是个偏执的设置，当你不信任网络中的其他计算机时使用。只能接收选定的常见和最安全的进入连接。dmz：DMZ 表示隔离区。这个域多用于可公开访问的、位于机构的外部网络、对内网访问受限的计算机。对于个人计算机，它没什么用，但是对某类服务器来说它是个很重要的选项。external：用于外部网络，会开启伪装（你的私有网络的地址被映射到一个外网 IP 地址，并隐藏起来）。跟 DMZ 类似，仅接受经过选择的传入连接，包括 SSH。block：仅接收在本系统中初始化的网络连接。接收到的任何网络连接都会被 icmp-host-prohibited 信息拒绝。这个一个极度偏执的设置，对于某类服务器或处于不信任或不安全的环境中的个人计算机来说很重要。drop：接收的所有网络包都被丢弃，没有任何回复。仅能有发送出去的网络连接。比这个设置更极端的办法，唯有关闭 WiFi 和拔掉网线。你可以查看你发行版本的所有域，或通过配置文件 /usr/lib/firewalld/zones 来查看管理员设置。举个例子：下面是 Fefora 31 自带的 FedoraWorkstation 域：$ cat /usr/lib/firewalld/zones/FedoraWorkstation.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Fedora Workstation</short> <description>Unsolicited incoming network packets are rejected from port 1 to 1024, except for select network services. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description> <service name="dhcpv6-client"/> <service name="ssh"/> <service name="samba-client"/> <port protocol="udp" port="1025-65535"/> <port protocol="tcp" port="1025-65535"/> </zone>获取当前的域任何时候你都可以通过 --get-active-zones 选项来查看你处于哪个域：$ sudo firewall-cmd --get-active-zones输出结果中，会有当前活跃的域的名字和分配给它的网络接口。笔记本电脑上，在默认域中通常意味着你有个 WiFi 卡：FedoraWorkstation interfaces: wlp61s0修改你当前的域要更改你的域，请将网络接口重新分配到不同的域。例如，把例子中的 wlp61s0 卡修改为 public 域：$ sudo firewall-cmd --change-interface=wlp61s0 --zone=public你可以在任何时候、任何理由改变一个接口的活动域 —— 无论你是要去咖啡馆，觉得需要增加笔记本的安全策略，还是要去上班，需要打开一些端口进入内网，或者其他原因。在你凭记忆学会 firewall-cmd 命令之前，你只要记住了关键词 change 和 zone，就可以慢慢掌握，因为按下 Tab 时，它的选项会自动补全。更多信息你可以用你的防火墙干更多的事，比如自定义已存在的域，设置默认域，等等。你对防火墙越了解，你在网上的活动就越安全，所以我们创建了一个备忘单便于速查和参考。下载你的 防火墙备忘单。（需注册）via: https://opensource.com/article/20/2/firewall-cheat-sheet作者：Seth Kenlon 选题：lujun9972 译者：lxbwolf 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出