0

问题

我在想要使用 Docker 配置文件运行 LXD 的主机上使用两个 NIC。我在接口 0 (enp0s10f0) 和环回上运行 DNSMASQ。我希望 LXD 容器使用单独的 NIC (enp0s10f1)。这时候我不需要容器直接暴露在网络上。所以我在 /etc/network/interfaces 中手动创建了一个桥(lxdbr1),其中 enp0s10f0 作为它的从站。我想使用 ebtables + DNSMASQ 和自定义配置(可能会因不同的容器实例而改变)来过滤来自容器的允许出站流量。由于我的上述要求,我试图不使用它创建的 lxd-bridge 服务和默认网桥 (lxdbr0)。

我现在面临两个问题:

  1. 我将 lxdbr1 附加到默认的 LXD 配置文件。如果我使用默认配置文件和 docker 配置文件启动容器,我确实会在容器中看到 eth0 接口。但是,它没有 IPv4 地址,似乎有一个随机的 IPv6 地址。我相信这是因为这是 LXD 的默认设置。我尝试使用 lxc 设备编辑 lxdbr1 编辑网络配置,但在添加 ipv4.address、ipv4.nat、ipv6.address 和 ipv6.nat 选项并保存文件后,编辑命令指示错误“配置解析错误:未找到”。我用格式化程序验证了我写的 YAML 是正确的。所以不确定这里的问题是什么。
  2. 假设我能够完成上述工作,除此之外我还需要什么吗?关于伪装的 Debian 网络 wiki 表明我还必须设置从接口 enp0s10f1 上的外部网络 IP 到分配给网桥的内部 IP 的默认路由。这部分也让我感到困惑。

还有其他更简单的选择吗?例如,我可以使用 LXD 创建的默认网桥,使其持久化,然后使用我自己的 DNSMASQ 实例(我可能有多个)和我自己的流量规则吗?

背景

我正在为在 Linux 上提供服务或库的团队构建持续交付管道。由于各种原因,我们必须锁定运行构建、签名和发布流程的主机和环境,同时为使用管道的团队提供最大的灵活性,以使用他们认为合适的任何编程语言、框架或工具。例如,假设一个团队想要在版本 A 和 B 上使用 Haskell 和 Rust(无论出于何种原因);我不想从事管理此类声明或为该团队预先安装它们的业务。同时,我想确保他们不使用随机包源或最终发布未签名的包。所以我想出了一个解决方案,它可以在不同阶段(构建、测试、打包、发布、存档)在每个容器启动之前或之后在主机之间完成管道所需的任何工作。工作流程将类似于:

  • 在主机上执行预构建步骤。
  • 在容器中调用用户构建脚本。
  • 在主机上执行构建后步骤。
  • 在主机上执行预测试步骤。
  • 在容器中调用用户测试脚本。
  • 在主机上调用测试后步骤。

等等。

4

1 回答 1

1

通过将容器附加到包含物理网络接口的桥接器上,实际上您将容器直接暴露给该网络,这就是桥接器的作用。

如果您不希望将第 2 层级别的容器暴露给您的物理网络,请创建一个不包含您的物理网络的网桥。然后,您可以在该网桥上运行 dnsmasq,以便容器可以获取 IP 地址,并且主机将充当网关。

于 2017-01-24T19:38:44.817 回答