![Rocky 9.1 上的 nftables 防火墙配置](https://linux22.com/image/783060/Rocky%209.1%20%E4%B8%8A%E7%9A%84%20nftables%20%E9%98%B2%E7%81%AB%E5%A2%99%E9%85%8D%E7%BD%AE.png)
我在 Rocky 9.1 机器上安装了 K3s 和 Rancher。根据手册,必须关闭firewalld。要关闭firewalld,我执行了:
systemctl disable firewalld
systemctl mask --now firewalld
我还使用 启用了 nftables 服务systemctl enable nftables
。
现在我尝试在防火墙中配置一个合理的规则集。据我所知,当前的 Linux 版本使用比 iptables 更现代的东西(我很久以前就熟悉 iptables),所以我尝试使用 nftables。
以下是我需要帮助的几个问题:
- nftables(或命令行工具 nft)是否适合在 Rocky 9.1 上使用?鉴于我在机器上使用 K3s 版本的 Kubernetes(它们生成 iptables 规则以及 nftables 规则,它们都出现在 Linux 中),我很困惑哪个是在 Rocky 9.1 上配置的“正确工具”
- 我读到过 iptables 不支持 nftables 生成的某些东西,但我应该在设置中关注它吗?对于我在 Linux 上创建哪种规则集,Kubernetes 或 K3s 是否有一些特定的兼容性要求?或者,如果我创建与 iptables 不兼容的 nft 规则集,它会中断网络连接吗?nftables 和 iptables 之间的实际关系是什么?在 Rocky 9.1 上还有其他工具可以做同样的事情吗?我应该使用更合适的工具吗?
编辑:
我阅读了一些关于 nftables 的资料,随后调试了自己的错误。因此,我删除了问题的第三部分,这显然只是一个愚蠢的错误。对任何可能觉得它有用的人来说:
nftables drop
是一个最终决定,之后数据包永远不会返回。任何链type nat hook input
不仅要评估转发(nat)目的,还要评估机器本身(输入)。放入链policy drop
中type nat hook input
并将链留空将导致机器不可用。更有趣的是,它只会丢弃第一个数据包,而不是来自机器的整个流量。这正是我的情况。我使机器无法访问,但我不知道,因为我的连接一直处于活动状态直到重新启动。重启后,由于 nat 丢弃策略,没有新的连接被接受。/希望有一天它能帮助到某人/
答案1
回答我自己的问题 - 迄今为止最好的理解。如果我错了,请纠正我。
- Linux 使用 netfilter 来实现实际的防火墙功能。这个维基百科页面。如果你不知道的话,你一定要看看它们。
- netfilter 提供的规则远不止我们习惯在 iptables 中看到的那些规则。但要使用这些规则,我们需要一个可以访问 netfilter 并让我们有机会进行交互的工具。
- 尽管 iptables 可以完成这项任务(并与 netfilter 交互),但它即将退役,我们应该跟上并学习 nft。事实上,该
nft
命令将允许比您使用 创建的规则更复杂的规则iptables
。 - 为了消除对 nft 和 nftables 的混淆 - 它们都与同一件事有关。终端上的命令是
nft
,但 systemctl 中的服务是 nftables。 - 另一个困惑 - nftables 服务实际上不是服务。它只是一个加载特定规则集并退出的脚本。因此,您实际上不应该关心 nftables 服务是否正在运行。它只在启动时才重要 - 一旦您“启动 nftables 服务”,它就会执行一个使用命令加载配置文件的命令
nft
。因此,您可以nft
自己运行命令并完成这项工作。 - 启动/停止防火墙服务(就像我们
service iptables start
过去所做的那样)?不,我想现在不再需要这样做了。好吧,可以禁用 netfilter 和整个网络堆栈,但我为什么要这么做呢?或者你为什么要这么做呢?<<--欢迎对这一点进行更新 - 原始问题的第二部分 -
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