Firewalld 根据 IP 阻止/删除和允许

Firewalld 根据 IP 阻止/删除和允许

我们有一个 Linux 根服务器,它主要是一个 Docker 服务器。托管容器和 CI 运行器。

为了保护此服务器,目前的基本想法是

  • 阻止所有流量
  • 除了允许的一个 (或多个) IP 之外。

我昨天为 ip4 添加了丰富的规则

  • 阻塞 0.0.0.0/0
  • 明确允许我们的静态 IP

这导致我被禁止访问。Docker 容器仍然可以访问。容器生成一个新接口,据我所知,这些接口应该只负责从主机到容器的通信。我至少希望,在流量从 eth0 转发到 dockerinterface1234 之前,firewalld 会过滤流量。

我目前的研究表明。在区域中忽略接口信息会使该区域负责所有流量。但是,我自己的测试表明我要么配置错误,要么我的研究有误。

答案1

采纳我的基于 IP 的防火墙区域教程

首先将默认区域更改为 drop:

firewallctl config set default-zone drop

丢弃区域会丢弃所有传入连接。您可能要考虑执行block相同操作的区域,只不过它会返回一个被阻止的连接,而不是默默地丢弃它。然后创建一个新区域并将其绑定到 IP 地址子网(或单个地址):

 firewallctl new --permanent zone --name "myzone"
 firewallctl zone "myzone" --permanent add source "198.51.100.0/24"
 firewallctl zone "myzone" --permanent add source "2001:0DB8::/32"

(记住要准备好 IPv6!)检查你的区域是否正常:

 firewallctl info zones --active

此时你开始添加端口或服务myzone。这些服务只能从您添加的区域/IP 子网访问,而不能从默认的 drop/public 区域访问。

答案2

维基百科有一个很好的数据包流示意图https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg

Docker 将其端口映射规则置于“mangle 预路由”阶段。此阶段在“过滤输入”之前运行,大多数防火墙会尝试在此阶段放置其输入过滤规则,但如果您查看示意图,就会发现如果要转发数据包,它们将避开该阶段(“路由决策”)。这可能就是您所遇到的情况。

你可以使用“raw”表完全抢占 Docker 规则,而不必与规则作斗争。要删除从“eth0”到端口 12345 的所有流量

iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 12345 -j LOG

请注意,“raw”表也会影响内部(Docker)流量,因此如果您要根据源 IP 地址进行丢弃,请确保还将 localhost 和 docker 的内部 IP 范围列入白名单

相关内容