蚊章汇 - 防火墙
type: channel
link: https://linuxcn.bwsl.wang/tag/%E9%98%B2%E7%81%AB%E5%A2%99/
items: 使用人性化的 Linux 防火墙 CFW 阻止 DDOS 攻击
items: 用 nftwatch 监控你的 Linux 防火墙
items: 硬核观察 # 577 影响所有 Linux 防火墙的安全漏洞被发现
items: Kubernetes 网络策略基础
items: 硬核观察 #343 第一款龙芯架构的芯片的性能测试一般
items: 使用 fail2ban 和 FirewallD 黑名单保护你的系统
items: 如何使用 firewall-cmd 管理网络服务
items: FirewallD 防火墙使用概述
items: GNU/Linux 系统下 nftables 防火墙的本地 IPS 能力部署实例
items: Linux 防火墙入门教程

使用人性化的 Linux 防火墙 CFW 阻止 DDOS 攻击
type: item
date: 2023-01-05T02:04:11+08:00
description: 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 黑名单…

用 nftwatch 监控你的 Linux 防火墙
type: item
date: 2022-07-24T15:07:00+08:00
description: 我创建了 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 防火墙的安全漏洞被发现
type: item
date: 2022-03-17T01:38:55+08:00
description: 影响所有 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 网络策略基础
type: item
date: 2021-11-21T21:02:25+08:00
description: 在你通过 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 部…

硬核观察 #343 第一款龙芯架构的芯片的性能测试一般
type: item
date: 2021-07-25T16:27:56+08:00
description: 第一款龙芯架构的芯片的性能测试一般本周发布的龙芯 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 模块。通过软件仓库来解决软件供应链攻击风险是一个好的思路。

使用 fail2ban 和 FirewallD 黑名单保护你的系统
type: item
date: 2020-07-15T20:46:00+08:00
description: 如果你运行的服务器有面向公众的 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 (…

如何使用 firewall-cmd 管理网络服务
type: item
date: 2020-06-03T17:09:16+08:00
description: 在上一篇文章中，我们探讨了如何在 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: d…

FirewallD 防火墙使用概述
type: item
date: 2020-05-14T23:27:00+08:00
description: 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”图标或者在终端窗…

GNU/Linux 系统下 nftables 防火墙的本地 IPS 能力部署实例
type: item
date: 2020-05-11T23:08:00+08:00
description: 随着各 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 表相应链命令集…

Linux 防火墙入门教程
type: item
date: 2020-04-20T18:42:00+08:00
description: 防火墙是你的计算机防止网络入侵的第一道屏障。为确保你的安全，请下载我们的备忘单。合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网，通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时，那么你计算机上的那层防火墙就是仅有的一层，所以配置和控制好你 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-cl…