我试图了解 Linux 防火墙区域背后的逻辑及其评估方式。
据我了解,区域定义为接口和 IP 范围的列表,可对其应用允许/拒绝规则。这是正确的吗?对于包含接口和附加 IP 范围的区域。即使流量将从该范围内的 IP 到达计算机,但通过不同的接口,该区域允许的服务是否也将被允许用于该 IP 范围?
按照什么顺序评估区域?如果传入流量与两个(可能相互矛盾)区域匹配,会发生什么情况?例如,区域“Z1”允许从给定接口向计算机发送 nfs,而区域“Z2”拒绝来自 IP 的所有传入流量。如果 NFS 流量通过“Z1”中定义的接口到达计算机,但来自“Z2”中定义的 IP,会发生什么情况?
答案1
Zone 只是基于 netfilter 的一个抽象层。在 netfilter 语言中,它规定了一组链,这些链会让您作为 Firewalld 的最终用户感觉到您的数据包位于某个“区域”内。您可以随时检查 zone 运行的确切行为:
iptables -L
Firewalld匹配数据包的顺序为:
- 直接规则
- 根据源 IP 路由到区域
- 根据接口数据包的来源路由到区域
这基本上意味着,如果数据包的最终目的地不是由直接规则决定的,它们将进入某个区域。首先,firewalld 会尝试根据源 ip 对它们进行路由。如果没有匹配,firewalld 将尝试根据它们进入的接口对它们进行路由。如果这也失败了,它们将进入默认区域。如果您设置了更多带有源 ip 的区域,并且这些 ip 范围重叠,则首先添加源规则的区域将获胜,因为将首先检查其规则是否匹配。
例子:
让我们拥有带有接口的系统:
- eth0 的 IP 地址为 192.168.0.1/24
- eth1 的 IP 地址为 192.168.100.1/24
防火墙设置1:
firewall-cmd --zone=home --add-interface=eth0
firewall-cmd --zone=internal --add-source=192.168.0.0/16
来自地址 192.168.0.2 通过 eth0 的数据包将被路由到内部区域。
防火墙设置2:
firewall-cmd --zone=internal --add-source=192.168.0.0/16
firewall-cmd --zone=home --add-source=192.168.0.2/32
来自 192.168.0.2 的数据包将再次路由到内部区域。之所以这样工作,是因为防火墙会按照我们运行相关命令的顺序逐一添加路由区域的源规则。