如何使用 iptables=false 正确隔离带有firewalld 的容器?

如何使用 iptables=false 正确隔离带有firewalld 的容器?

我不希望 docker 动态修改我的 iptables/nftables,所以我决定使用 iptables=false。然后我按照建议这里启用容器内的出站互联网连接。

然而,我很快发现根本没有默认规则来阻止容器间甚至桥接器间的通信。这使得安全性产生了幻觉:不受信任区域中的受感染容器可以简单地使用受信任区域中的受信任容器作为跳转来进入我的主机。

例如,我有br1、br2、br3。 br1 和 br2 位于 zone1(完全默认设置),br3 位于 zone2 也是完全默认设置。

zone1
  target: default                                      
  icmp-block-inversion: no
  interfaces: br1 br2                                                
  sources:                     
  services: ssh                             
  ports:                                  
  protocols:                        
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

zone2
  target: default                                      
  icmp-block-inversion: no
  interfaces: br3
  sources:                     
  services: ssh                             
  ports:                                  
  protocols:                        
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

我预计至少 br3 无法启动与 br1/br2 的连接。所以我nc -lk -p 12345 -e /usr/bin/cat在br1做了。然后我尝试与它进行 nc 通信。令人惊讶的是根本没有堵塞。可以成功打开端口并发送消息。

这是为什么?我以为是container3-->| br3 --> 主机上的端口,因此默认情况下,除了 ssh 之外的所有内容都被阻止在这里

那么它到底是如何连接到container1的呢?也许是container3-->| br3 --> br1|--> 容器1

当container3和container1是真实机器,br3和br1是真实接口时。看来这实际上需要设置一些转发规则或域间策略来允许流量通过。而且,至少container3-->| br3应该被屏蔽了,那么即使设置了转发规则,如果我不打开br3上的端口,也无法到达对方吗?

但在容器/桥的情况下,情况似乎并非如此。完全没有堵塞。

我想知道1.防止容器连接到不同区域的网桥进行通信的规范方法是什么。 2. 防止同一区域内的容器间连接。

这完全超出了firewalld的概念吗?所以只能通过原始nft调用或iptables-nft调用来实现?直接规则几乎与nft的bear调用相同,因为那里根本没有可以使用每个区域或区域间的概念。

好的,这可能是因为 br_netfilter 未加载并且未插入正确的隔离规则。我想这比我想象的要复杂得多。防火墙也许不是解决办法

相关内容