允许 Docker 容器相互通信时如何防止 IP 伪装?

允许 Docker 容器相互通信时如何防止 IP 伪装?

我正在使用 运行一个 Mastodon 实例docker-compose,它构建并运行多个容器,这些容器通过 Docker 内部网络相互连接(相关的 docker-compose.yml)。

我在最新的 Debian 11 服务器上运行它。问题是,使用默认安装,Docker 容器无法相互连接(“无路由到主机”)。我发现的一个解决方案是在防火墙公共区域中启用 IP 伪装:firewall-cmd --zone=public --add-masquerade,这解决了该问题并允许容器相互通信。

遗憾的是,这个解决方案有一个我无法轻易接受的缺点:同一台服务器在同一个网络接口上有第二个 IP 地址,我需要用它来发送 postfix 生成的传出 SMTP 流量。为了实现这一点,我将其设置smtp_bind_address为辅助 IP 地址。这完全没问题直到我使用上述命令启用了 IP 伪装。一旦我这样做,postfix 发出的所有传出流量的源 IP 都会更改为主 IP,从而中断邮件传递。

我发现的一个临时解决方法是使用手动 netfilter 规则来逆转地址转换:

nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname eth0 tcp dport 25 snat to <secondary ip>

显然,如果我也使用防火墙,这不是一个好主意,而且我认为这不会以任何方式持续存在。

因此,理想情况下,应该有一种方法可以在不启用伪装的情况下实现 Docker 容器之间的联网(我不明白为什么这是必要的),这样我就不需要将这个“修复”破解到 netfilter 中。如果这绝对不可能,我也会选择一种方法来告诉防火墙添加与我的手动 netfilter 规则等效的内容。我认为有一种方法可以使用直接规则来实现这一点,但我无法找出正确的语法。

现有的其他防火墙规则主要是阻止和开放各种服务的某些端口。

相关内容