我已经使用 CentOS 7 很长时间了,并且习惯于iptables
在各种个人和企业机器上构建自定义配置。
我最近开始使用 CentOS 8,并了解了从iptables
到 的转变nftables
,因此我能够重写我的规则集并让一切正常运行。问题是我的自定义 nft 规则集在重新启动后不会保留,我必须手动systemctl restart nftables
让我的规则重新生效。
我了解到罪魁祸首是firewalld
,根据我的理解(因为我从未在 CentOS 7 中使用过它),它是一个前端管理工具,并且iptables
......nftables
对吗?一旦我systemctl disable firewalld
尝试重新启动,我的nftables
规则集就按预期就位。问题解决了。
firewalld
我的问题是,不使用,仍在运行和活动的后果是什么nftables
,所以我假设我的实际防火墙仍然存在,是否有任何理由我应该保持firewalld
运行状态,而不是调整设置以确保它正在使用我的nftables
规则集代替。任何有关其用途的澄清将不胜感激!
答案1
我认为答案相当简单。首先,你做了完全正确的事......
Firewalld 是一个纯粹的前端。它本身并不是一个独立的防火墙。它仅通过接受指令,然后将它们转换为 nftables 规则(以前的 iptables)来操作,而 nftables 规则就是防火墙。因此,您可以选择运行“firewalld using nftables”和运行“nftables only”。 Nftables 反过来直接作为内核的一部分工作,使用其中的许多模块,这些模块部分是新的,部分重复内核钩子和模块的“netfilter”系统,该系统在 2000 年左右成为内核的一部分。
并行运行firewalld和nftables(以前的iptables)会变得相当混乱,尽管我相信有些人这样做。如果您习惯于运行自己的 iptables 规则,那么将它们转换为 nftables 规则并让它们成为您的防火墙规则是完美的解决方案。最好的事情确实是完全禁用并最好屏蔽firewalld - 稍微迂腐一点,你可以运行:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld
您无需执行任何其他操作。我自己也直接用 nftables 运行。我发现这比使用前端要透明得多(当然还有除了firewalld之外的其他前端)——它可以让您完全了解您正在做的事情,并且您可以通过运行轻松获得规则效果的完整审查sudo nft list ruleset > /etc/nftables.conf
。在 /etc/nftables.d 中使用单独的 nft 表是一种很好且简单的方法来跟踪您所做的事情以及事情的位置......
随后 @eriknelson 在评论中询问为什么要屏蔽某项服务。据我所知,这样做是出于用户体验的实际原因,并防止错误和难以发现的错误。非常不希望运行多个防火墙系统,因为对大多数人来说结果是不可预测的,并且您不太可能从任何防火墙收到有关其与另一台不希望出现的防火墙交互的明确错误消息。然而内核会尝试处理它所给出的任何内容。如果您使用 nftables 或 iptables,则不应使用 firewalld。或者UFW。或者任何其他更高级别的系统。而且,如果您主要使用像firewalld这样的高级防火墙,您不喜欢弄乱详细的低级指令(尽管有时它是针对您发现很难在更多信息中指定的特定困难情况而完成的)高级防火墙)。
当您屏蔽 systemd 服务时,您既不能立即启动也不能立即启用它。如果您发现/意识到该服务被屏蔽,您可以取消屏蔽它 - 然后执行您想要的操作。这样做是为了防止无意或自动进行的任何此类更改。您可以通过运行来亲自查看您的计算机上是否有隐藏的服务sudo systemctl list-unit-files | grep mask
因此,您可能不一定想要完全删除firewalld,但同样不想无意中运行它,这正是 usingsudo systemctl mask xyz.service
可以派上用场的情况之一。
我想从你写的内容中你已经知道这一切了。但我有点像 nftables 的布道者,如果其他人读到这个答案,他们可能会受到这些小提示的帮助。 nftables 的文档很好,但不过分。