如果我使用 Virtualbox 来启动 VM,我可以选择“桥接”作为网络适配器类型,这会导致来宾/虚拟 NIC 连接到我的物理 LAN,从而从我的路由器获取 LAN IP(通过 DHCP)。
我想实现同样的功能,但我不想使用 Virtualbox,而是想使用 lxc/lxd 容器。
我怎样才能做到这一点?
编辑 1
我正在运行 Ubuntu,并尝试遵循本指南:
……但这无济于事。原来的主机接口之后应该有一个IP吗?因为当我尝试手动桥接时它不会。
编辑 2
如果有帮助,我的 lxd/lxc 主机是运行 Ubuntu 的 Virtualbox 虚拟机,设置了与我的物理以太网 NIC 的桥接网络。
编辑 3
如果我使用 tcpdump 监控桥接接口、物理/主机接口和容器/虚拟接口上的 icmp 流量,只有容器/虚拟接口没有任何流量。其他两个可以。
编辑 4
根据本指南:
http://www.microhowto.info/troubleshooting/troubleshooting_ethernet_bridging_on_linux.html
我的网桥设置没有问题。
然而,正如“编辑 3”中所述,容器接口没有获得任何流量。需要找出原因,但我不知道如何...
我觉得它与路线有关。
容器没有路由,而主机有。
编辑 5
使用 tcpdump 监控 arp 流量,表明 arp 流量实际上正在到达容器/虚拟接口。
所以只是icmp流量不是。
编辑 6
如果我在容器中设置了一个静态 IP(通过 /etc/network/intefaces*),那么我就可以从主机(这是一台 Virtualbox 机器)对容器进行 ping 操作。
如果我随后更改 Virtualbox 中的网络配置以允许混杂流量,那么我可以从我的物理机(Virtualbox 机器的主机)ping 容器。然而,从这里,我仍然无法从容器内 ping 到我的物理 LAN 之外。
最后一步,如果我在容器中手动添加“默认”路由,如下所示:
route add default gw 192.168.0.1 eth0
这允许我从容器内部 ping 物理 LAN 外部。
因此,除非其他人可以提供解释(我会在发布答案之前等待),否则我猜测缺少容器 DHCP 支持(通过桥接)与 lxc/lxd 使用 netmasq 处理 DHCP 的事实有关(和 DNS)。
在我的第 6 次编辑中,我说我需要在容器中手动添加默认路由,但事实并非如此。我只需要这样做,因为我忘记在
/etc/network/interfaces
文件中指定网关 LAN IP 地址。所以这不是 LXD 问题,只是不要忘记指定它。您需要创建一个桥接接口,您的主机操作系统接口将是其中的一个分支,然后将 lxc 容器附加到该桥接 - 这样您将获得正确的桥接连接。
您的容器配置的一部分将如下所示:
虽然您的操作系统桥配置实际上是特定于发行版的。
您基本上需要的是使用可以将流量转发到网络其余部分的默认网关的容器,以及可以转发回该系统的路由器上的静态路由。这可能是您的 lxd 主机(在 Linux 中使用ip 转发),或者您可以有一个专用容器来处理路由(可能运行防火墙来限制可以访问哪些容器 IP/端口)。
如果您使用默认的 lxdbr0 网桥并且想要更改容器的网关,您可以使用raw.dnsmasq设置。它通常会设置为您在配置网桥时用于 lxd 主机的 IP,但可以使用以下命令进行更改
dhcp-option=3
:然后,当您重新启动容器时,您可以看到使用
ip route show
.将容器设置为使用所需的默认网关后,请确保将系统设置为转发 ip 数据包。此时,您的容器应该能够 ping 该主机上的其他 IP,但无法访问网络上的其他任何内容。这是因为网络的其余部分没有关于如何返回以容器子网为目的地的数据包的路由信息。
如果这是路由器后面的家庭网络,您可以在家庭路由器上添加一个静态路由,告诉它将这些数据包发送到哪里。如果您的 lxd 主机使用静态 IP 192.168.0.2 并且您的容器使用子网 192.168.4.0/24,那么您可以将该子网添加为静态路由,并将主机 .2 主机 IP 作为网关。这应该允许使用您的 lxd 主机作为两个网络之间的网关在您的容器和本地网络之间路由数据包