【问题标题】:How to setup LXD containers that communicate over the LAN如何设置通过 LAN 通信的 LXD 容器
【发布时间】:2017-06-09 03:33:21
【问题描述】:

我有一组连接到 LAN 的服务器。我能够在机器上安装和使用 LXD 容器,但是对于我的一生,我无法让容器在网络上可见。我试图关注这些网址,但无济于事:

我的服务器设置如下:

  1. eth0 - 连接到 Internet 的硬件 NIC
  2. eth1 - 连接到 LAN 的硬件网卡

如果我尝试通过 lxdbr0 在 eth1 设备上设置网桥,则容器在 LAN 上不可见。如果我尝试手动设置桥接的br0 设备,桥接到 eth1 并使用 DHCP,则设备无法启动。

我的 /etc/network/interfaces 如下所示:

iface lo inet loopback

# The primary network interface
iface eth0 inet static
    address x.x.x.x
    netmask 255.255.255.224
    gateway x.x.x.x

iface eth1 inet static
    address 192.168.0.61/23

iface br0 inet dhcp
    bridge_ports eth1
    bridge-ifaces eth1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

auto lo eth0 eth1 br0

是否可以创建在 LAN 上可见并可以连接到 Internet 的容器?

Ubuntu 16.04 上的 LXD v2.7

【问题讨论】:

    标签: lxc lxd


    【解决方案1】:

    是的,这是很有可能的。我还没有玩过 LXD 2.3 中引入的所有新网络功能,所以我不能说这些,但看起来你想要一个非常简单的网络布局,所以这些功能甚至可能不会发挥作用.我做的事情有点类似于你的网络布局。我的所有服务器中都有 4 个 NIC。前两个我放入一个绑定并放入我的管理网络,后两个我放入一个 LAG(另一个绑定)并用于所有 LXD 流量。我有多个 VLAN,所以我的 LAG 设置为中继端口,我为每个我希望能够连接的 VLAN 创建 VLAN 设备。然后,我将这些 VLAN 设备放入实际容器使用的网桥中。

    去掉所有绑定和原始 VLAN 设备,您的设置基本相同:一个 NIC 用于管理 LXD 主机,一个网桥用于 LXD 容器流量。我没有使用默认的 lxcbr0 设备,但是所有的概念应该都是一样的。

    一个简单的例子

    首先定义将成为网桥一部分的 NIC。在您的情况下,您似乎只使用一个 NIC(eth1)。您需要将网卡设置为手动。不要为其分配地址。

    auto eth1
    iface eth1 inet manual
    

    接下来定义你的网桥,同样我不会在这里定义 IP 地址。我更喜欢在容器内分配我所有的容器 IP。将桥接器也设置为手动。当容器启动时,它会启动设备。

    auto br0
    iface br0 inet manual
      bridge_ports eth1
      bridge_stp off
      bridge_fd 0
      bridge_maxwait 0
    

    现在您所要做的就是在您的容器配置文件中使用这个桥接器。

    lxduser@lxdhost:~$ lxc profile show default
    name: default
    config: {}
    description: ""
    devices:
      eth0:
        name: eth0
        nictype: bridged
        parent: br0
    

    现在启动您的容器并编辑网络配置。例如,在基于 Debian 的系统中,您将编辑 /etc/network/interfaces(在容器中)。在基于 Red Hat 的系统中,您将编辑 /etc/sysconfig/network-scripts/ifcfg-eth0(在容器中)。这是 Debian 示例。

    auto eth0
    iface eth0 inet dhcp
    

    只要 DHCP 在 eth1(在您的 LXD 主机上)插入的网络上工作,那么容器应该获得一个地址并且可以在该网络上路由。为了获得 Internet 访问权限,必须将 eth1 插入到可以访问 Internet 的子网中,它不依赖于容器。

    更复杂的网络

    如果您想将容器放在不同的 VLAN 上,或者想在您的主机上实现容错,或者两者兼而有之,那么这需要更多的设置。我在我的 LXD 主机上使用下面的配置文件。

    ############################
    # PHYSICAL NETWORK DEVICES #
    ############################
    
    # Management network interface
    auto enp2s0f0
    iface enp2s0f0 inet static
        address 10.1.31.36/24
        gateway 10.1.31.1
        dns-nameserver 10.1.30.2 10.1.30.3 75.75.75.75
        dns-search harmonywave.com
    
    #iface enp2s0f0 inet6 dhcp
    
    # Second network interface
    auto enp2s0f1
    iface enp2s0f1 inet manual
    
    # LXD slave interface (1)
    auto enp3s0f0
    iface enp3s0f0 inet manual
        bond-master bond1
    
    # LXD slave interface (2)
    auto enp3s0f1
    iface enp3s0f1 inet manual
        bond-master bond1
    
    ##########################
    # BONDED NETWORK DEVICES #
    ##########################
    
    # Bond network device
    auto bond1
    iface bond1 inet manual
        bond-mode 4
        bond-miimon 100
        bond-lacp-rate 1
        bond-slaves enp3s0f0 enp3s0f1
        bond-downdelay 400
        bond-updelay 800
    
    ####################
    # RAW VLAN DEVICES #
    ####################
    
    # Tagged traffic on bond1 for VLAN 10
    iface bond1.10 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 20
    iface bond1.20 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 30
    iface bond1.30 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 31
    iface bond1.31 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 42
    iface bond1.42 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 50
    iface bond1.50 inet manual
        vlan-raw-device bond1
    
    # Tagged traffic on bond1 for VLAN 90
    iface bond1.90 inet manual
        vlan-raw-device bond1
    
    ##########################
    # BRIDGE NETWORK DEVICES #
    ##########################
    
    # Bridged interface for VLAN 10
    auto br0-10
    iface br0-10 inet manual
        bridge_ports bond1.10
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0    
    
    # Bridged interface for VLAN 20
    auto br0-20
    iface br0-20 inet manual
        bridge_ports bond1.20
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0    
    
    # Bridged interface for VLAN 30
    auto br0-30
    iface br0-30 inet manual
        bridge_ports bond1.30
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    
    # Bridged interface for VLAN 31
    auto br0-31
    iface br0-31 inet manual
        bridge_ports bond1.31
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    
    # Bridged interface for VLAN 42
    auto br0-42
    iface br0-42 inet manual
        bridge_ports bond1.42
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    
    # Bridged interface for VLAN 50
    auto br0-50
    iface br0-50 inet manual
        bridge_ports bond1.50
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    
    # Bridged interface for VLAN 90
    auto br0-90
    iface br0-90 inet manual
        bridge_ports bond1.90
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    

    让我们分解一下。首先我定义物理网卡。那是PHYSICAL NETWORK DEVICES 部分。对于第一个网卡,我的和你的没有什么不同(eth0 对你来说是 enp2s0f0 对我来说)。我只是静态定义它并给它一个地址。我在我的管理网络上为此 NIC 分配了一个地址。我用于容器流量的第三个和第四个 NIC。我想在 LAG 中使用 LACP,所以我将设备定义为手动设备,并将它们设为“bond1”的从属设备。

    接下来我定义我的绑定设备。那是BONDED NETWORK DEVICES 部分。在这种情况下,只是集装箱运输的一个纽带。同样,我将其设置为手动并将绑定模式定义为 4 (LACP)。可以同样轻松地设置不同类型的绑定(主动-被动、主动-主动等)。

    接下来,因为我将第三个和第四个 NIC 物理连接到交换机上的中继端口,所以我必须指定 dot1Q 以便实际标记流量。我为容器可能位于的每个 VLAN 创建了一个原始 VLAN 设备。我附加了一个 .XX,其中“XX”是 VLAN ID。这已经没有必要了,我这样做只是为了方便识别。然后用“vlan-raw-device”节标记设备。这是RAW VLAN DEVICES 部分。

    最后,在BRIDGE NETWORK DEVICES 部分,我为每个 VLAN 设备创建网桥。这是容器实际使用的。同样,我将其设置为手动,并且没有定义在容器内定义的 IP 地址。

    现在我要做的就是将我想要的 VLAN 上的任何网桥分配给一个容器。为简单起见并避免配置每个容器,我只为每个网桥/VLAN 创建一个配置文件。例如,这是我的 VLAN 31 配置文件。

    lxduser@lxdhost:~$ lxc profile show 31_vlan_int_server
    name: 31_vlan_int_server
    config: {}
    description: ""
    devices:
      eth0:
        name: eth0
        nictype: bridged
        parent: br0-31
        type: nic
    

    然后我只需将此配置文件分配给我想要在 VLAN 31 上的任何容器。此时我可以将容器的 /etc/network/interfaces 文件设置为 dhcp(如果在该 VLAN 上启用了 DHCP)或给它一个静态属于该 VLAN 的 IP 地址。

    整个网络布局看起来像这样。

    容器使用桥内的 veth 设备(由 LXD 创建)。主机也将原始 vlan 设备添加到网桥,它们都使用实际的绑定设备,而后者又使用物理网卡。

    关于连接问题

    最后,关于您无法连接到互联网的问题,请确保您的容器使用的网桥可以访问互联网。我喜欢采取逐步解决问题的方法。

    1. 确保 eth1 可以访问 Internet。暂时移除任何绑定和桥接配置,直接在主机上使用 eth1。将其从手动更改为静态并为其提供 IP 地址。
      • 在主机上能ping通网卡的IP地址吗?
        • 是吗? NIC 工作正常,继续故障排除。不?网卡设置不正确,其他一切都会失败。
      • 您可以在主机上 ping 同一子网中的另一台主机吗?
        • 是吗?开关设置正确,继续故障排除。不?连接到网络的问题。盒子本身可能存在静态路由问题,交换机可能存在问题。
      • 在主机上,您可以 ping 不同子网上的机器(试试ping 8.8.8.8)吗?
        • 是吗?路由工作正常,继续故障排除。不?主机上可能的网关配置错误。可能是路由器的问题。盒子上的静态路由可能存在问题(检查最后的网关)。
      • 你能解析一个DNS地址吗(试试ping www.google.com)?
        • 是吗? DNS 解析设置正确,继续故障排除。不? DNS解析问题。检查 /etc/resolv.conf 或 resolvconf 设置。
    2. 如果 eth1 在静态设置时一切正常,那么您就知道 NIC 工作正常。下一步是将 eth1 改回手动,从中删除静态 IP,然后重新创建网桥。现在在网桥本身上分配静态 IP 地址并重复步骤 1 中的所有子步骤。

    如果一切正常,那么您应该能够连接到您的容器(在将网桥设置回手动并删除静态 IP 之后)。如果没有,则获取容器上的地址(静态或 DHCP)并重复步骤 1 中的子步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多