Rocky 9.1 上的 nftables 防火墙配置

Rocky 9.1 上的 nftables 防火墙配置

我在 Rocky 9.1 机器上安装了 K3s 和 Rancher。根据手册,必须关闭firewalld。要关闭firewalld,我执行了:

systemctl disable firewalld
systemctl mask --now firewalld

我还使用 启用了 nftables 服务systemctl enable nftables

现在我尝试在防火墙中配置一个合理的规则集。据我所知,当前的 Linux 版本使用比 iptables 更现代的东西(我很久以前就熟悉 iptables),所以我尝试使用 nftables。

以下是我需要帮助的几个问题:

  1. nftables(或命令行工具 nft)是否适合在 Rocky 9.1 上使用?鉴于我在机器上使用 K3s 版本的 Kubernetes(它们生成 iptables 规则以及 nftables 规则,它们都出现在 Linux 中),我很困惑哪个是在 Rocky 9.1 上配置的“正确工具”
  2. 我读到过 iptables 不支持 nftables 生成的某些东西,但我应该在设置中关注它吗?对于我在 Linux 上创建哪种规则集,Kubernetes 或 K3s 是否有一些特定的兼容性要求?或者,如果我创建与 iptables 不兼容的 nft 规则集,它会中断网络连接吗?nftables 和 iptables 之间的实际关系是什么?在 Rocky 9.1 上还有其他工具可以做同样的事情吗?我应该使用更合适的工具吗?

编辑
我阅读了一些关于 nftables 的资料,随后调试了自己的错误。因此,我删除了问题的第三部分,这显然只是一个愚蠢的错误。对任何可能觉得它有用的人来说: nftables drop是一个最终决定,之后数据包永远不会返回。任何链type nat hook input不仅要评估转发(nat)目的,还要评估机器本身(输入)。放入链policy droptype nat hook input并将链留空将导致机器不可用。更有趣的是,它只会丢弃第一个数据包,而不是来自机器的整个流量。这正是我的情况。我使机器无法访问,但我不知道,因为我的连接一直处于活动状态直到重新启动。重启后,由于 nat 丢弃策略,没有新的连接被接受。/希望有一天它能帮助到某人/

答案1

回答我自己的问题 - 迄今为止最好的理解。如果我错了,请纠正我。

  1. Linux 使用 netfilter 来实现实际的防火墙功能。这个维基百科页面。如果你不知道的话,你一定要看看它们。
  2. netfilter 提供的规则远不止我们习惯在 iptables 中看到的那些规则。但要使用这些规则,我们需要一个可以访问 netfilter 并让我们有机会进行交互的工具。
  3. 尽管 iptables 可以完成这项任务(并与 netfilter 交互),但它即将退役,我们应该跟上并学习 nft。事实上,该nft命令将允许比您使用 创建的规则更复杂的规则iptables
  4. 为了消除对 nft 和 nftables 的混淆 - 它们都与同一件事有关。终端上的命令是nft,但 systemctl 中的服务是 nftables。
  5. 另一个困惑 - nftables 服务实际上不是服务。它只是一个加载特定规则集并退出的脚本。因此,您实际上不应该关心 nftables 服务是否正在运行。它只在启动时才重要 - 一旦您“启动 nftables 服务”,它就会执行一个使用命令加载配置文件的命令nft。因此,您可以nft自己运行命令并完成这项工作。
  6. 启动/停止防火墙服务(就像我们service iptables start过去所做的那样)?不,我想现在不再需要这样做了。好吧,可以禁用 netfilter 和整个网络堆栈,但我为什么要这么做呢?或者你为什么要这么做呢?<<--欢迎对这一点进行更新
  7. 原始问题的第二部分 -iptables命令支持什么,不支持什么?好吧,iptables 支持的功能不多。一旦你开始阅读NFT 手册,你很快就会本节并认识到它有多么不同,以及你实际上可以用它做更多的事情nft

答案2

我最终使用了 Cilium [参见此处1 它使我能够创建几个简单的 yaml 文件。

答案3

我最终选择了 Cilium。看这里 它使您能够在 yaml 文件中创建简单的规则。

这将启用 ssh:

---
apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: "ssh"
spec:
  description: "SSH access on Control Plane"
  nodeSelector: {}
  ingress:
  - toPorts:
    - ports:
      - port: "22"
        protocol: TCP

这将拒绝所有其他流量:

---
apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: "default-deny"
spec:
  description: "Block all unknown traffic to nodes"
  nodeSelector: {}
  ingress:
  - fromEntities:
    - cluster
    - remote-node

答案4

我也对这个话题感兴趣。你的目标是什么?

我想限制一组有限的 IP 地址对 10250 等端口的访问。然而,要找到实现这一目标的方法却非常困难。

我的设置是 Redhat 8 上的 k3s。问候 Hans

相关内容