我们有一个 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 范围列入白名单