如果我使用 Virtualbox 启动虚拟机,我可以选择“桥接”作为网络适配器类型,这会导致客户机/虚拟 NIC 连接到我的物理 LAN,从而从我的路由器获取 LAN IP(通过 DHCP)。
我想要实现相同的功能,但我不想使用 Virtualbox,而是想使用 lxc/lxd 容器。
我怎样才能实现这个目标?
编辑1
我正在运行 Ubuntu 并尝试按照本指南操作:
...但这没有帮助。原始主机接口之后应该有一个 IP 吗?因为当我尝试手动桥接时它没有。
编辑2
如果有帮助的话,我的 lxd/lxc 主机是一个运行 Ubuntu 的 Virtualbox 虚拟机,设置了到我的物理以太网网卡的桥接网络。
编辑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)有关。
答案1
- 如果您的 LXD 主机实际上是一台虚拟机,请确保虚拟机的网络适配器配置为混杂模式,这样 LXD 容器流量就可以从物理网络传输到虚拟网络。
- 在 lxd 容器中设置静态 IP 地址,因为 DHCP(来自您的物理网关)似乎不起作用。
在我的第六次编辑中,我说我需要在容器中手动添加默认路由,但事实并非如此。我只需要这样做,因为我忘记在文件中指定网关 LAN IP 地址/etc/network/interfaces
。所以这不是 LXD 问题,只是不要忘记指定它。
答案2
您需要创建一个桥接接口,您的主机操作系统接口将是其一条腿,然后将 lxc 容器附加到这个桥接器 - 这样您将获得正确的桥接连接。
容器配置的一部分将如下所示:
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
而你的操作系统桥接配置实际上是特定于发行版的。
答案3
你基本上需要的是容器使用一个默认网关,它可以将流量转发到网络的其余部分,以及路由器上的静态路由,它可以转发回该系统。这可能是你的 lxd 主机(使用IP 转发在 Linux 中),或者你可以有一个专门的容器来处理路由(可能运行防火墙来限制可以访问哪些容器 IP/端口)。
如果你正在使用默认的 lxdbr0 网桥,并且想要更改容器的网关,则可以使用raw.dnsmasq设置。它通常会被设置为配置桥接时用于 lxd 主机的 IP,但可以使用以下命令进行更改dhcp-option=3
:
lxc network show lxdbr0
config:
ipv4.address: 192.168.4.1/24
ipv6.address: none
raw.dnsmasq: dhcp-option=3,192.168.4.2
description: ""
name: lxdbr0
type: bridge
used_by:
- /1.0/containers/ubuntu-test
managed: true
当您重新启动容器时,您可以看到使用的新网关ip route show
。
一旦将容器设置为使用所需的默认网关,请确保系统设置为转发 IP 数据包。此时,您的容器应该能够 ping 该主机上的其他 IP,但无法访问网络上的任何其他内容。这是因为网络的其余部分没有关于如何返回发往容器子网的数据包的路由信息。
如果这是路由器后面的家庭网络,您可以在家庭路由器上添加静态路由,告诉它将这些数据包发送到哪里。如果您的 lxd 主机使用静态 IP 192.168.0.2,而您的容器使用子网 192.168.4.0/24,那么您可以将该子网添加为静态路由,并以主机 .2 主机 IP 作为网关。这应该允许数据包在您的容器和本地网络之间路由,使用您的 lxd 主机作为两个网络之间的网关