使用macvlan让你的LXD容器从LAN获得IP地址的方法

这篇文章已经兼容LXD 4.0。我还对它进行了调整,以便创建一个只做macvlan的空配置文件,并独立于默认配置文件。最后,我把这个配置文件称为macvlan(以前的名字:lanprofile)。

警告1:通过使用macvlan,你的计算机的网络接口将在网络上显示有一个以上的MAC地址。这对以太网网络来说是很好的。但是,如果你的接口是一个无线接口(具有像WPA/WPA2这样的安全性),那么接入点将拒绝来自你的计算机的任何其他MAC地址。因此,在这种特定情况下,所有这些都将不起作用。

警告2:如果你的主机是在一个虚拟机中,那么很可能虚拟机软件会阻止容器的DHCP请求。在VMWare和Virtualbox上都有允许 "混杂模式 "的选项(在其网络设置的某个地方)。你需要启用该选项。请记住,人们只在VMWare上报告了成功。目前,在VirtualBox上,您需要将主机上的网络接口切换到PROMISC模式,作为一种变通方法。

用LXD的术语来说,您有主机,然后您在这个主机上有许多容器。主机是LXD运行的计算机。默认情况下,所有容器都隐藏在主机的私有网络中运行。容器不能从本地网络访问,也不能从互联网访问。但是,它们可以通过主机对互联网进行网络访问。这就是NAT网络。

我们怎样才能让一些容器从局域网接收一个IP地址,并在局域网上被访问呢?

这可以通过macvlan(L2)虚拟网络接口来实现,这是Linux内核提供的一个功能。

在这篇文章中,我们将创建一个新的LXD配置文件并在其中配置macvlan。然后,我们在新的配置文件下启动新的容器,或将现有的容器附加到新的配置文件上(这样它们也会得到一个局域网IP地址)。

step 1 . 为 macvlan 创建一个新的 LXD 配置文件

让我们看看有哪些LXD配置文件可用。

$ lxc profile list
+------------+---------+
| NAME       | USED BY |
+------------+---------+
| default    | 11      |
+------------+---------+

有一个单一的配置文件,称为default,即默认配置文件。这个系统中的11个LXD容器都使用它。

我们创建一个新的配置文件。这个新的配置文件被称为macvlan

$ lxc profile create macvlan
Profile macvlan created
$ lxc profile list
+------------+---------+
| NAME       | USED BY |
+------------+---------+
| default    | 11      |
+------------+---------+
| macvlan    | 0       |
+------------+---------+

新档案的默认设置是什么?

$ lxc profile show macvlan
config: {}
description: ""
devices: {}
name: macvlan
used_by: []
$ 

我们需要在主机上的适当网络接口上添加一个nic类型 macvlan*parent*,然后我们就可以开始了。让我们使用ip route命令来确定正确的父节点。这个命令显示了默认的网络路由。它还显示了*设备的名称(dev/),在本例中是enp5s12。 在systemd之前,这些设备曾经是eth0wlan0.现在,名称因具体网卡而异)。

$ ip route show default 0.0.0.0/0
default via 192.168.1.1 dev enp5s12 proto static metric 100

现在我们准备在 "macvlan "LXD配置文件中添加相应的设备。我们使用lxc profile device add命令在配置文件lanprofile中添加一个*deviceeth0。我们设置nictypemacvlanparentenp5s12

$ lxc profile device add macvlan eth0 nic nictype=macvlan parent=enp5s12
Device eth0 added to macvlan
$ lxc profile show macvlan
config: {}
description: ""
devices:
  eth0:
    nictype: macvlan
    parent: enp5s12
    type: nic
name: macvlan
used_by: []
[email protected]:~$ 
$ 

好了,就这样了。我们现在准备使用这个新的配置文件启动容器,它们将从局域网的DHCP服务器上获得一个IP地址。

step 2. 用新的配置文件启动 LXD 容器

让我们使用新的macvlan配置文件启动两个容器,然后检查它们的IP地址。我们需要先指定default配置文件,然后再指定macvlan配置文件。通过这样做,容器将从第一个配置文件中获得适当的基本配置,然后网络将被macvlan配置文件所覆盖。

$ lxc launch ubuntu:18.04 net1 --profile default --profile macvlan
Creating net1
Starting net1
$ lxc launch ubuntu:18.04 net2 --profile default --profile macvlan
Creating net2
Starting net2
$ lxc list
+------+---------+---------------------+------+-----------+-----------+
| NAME |  STATE  |        IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+---------------------+------+-----------+-----------+
| net1 | RUNNING | 192.168.1.7 (eth0)  |      | CONTAINER | 0         |
+------+---------+---------------------+------+-----------+-----------+
| net2 | RUNNING | 192.168.1.3 (eth0)  |      | CONTAINER | 0         |
+------+---------+---------------------+------+-----------+-----------+
$ 

两个容器都从局域网路由器得到了它们的IP地址。下面是显示这两个容器的路由器管理屏幕。我编辑了名称,在前面加上LXD,使它们看起来更漂亮。容器的外观和感觉就像新的局域网电脑一样!

让我们试一下ping命令, 从一个容器到另一个容器。

$ lxc exec net1 -- ping -c 3 192.168.1.7
PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.
64 bytes from 192.168.1.7: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 192.168.1.7: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 192.168.1.7: icmp_seq=3 ttl=64 time=0.082 ms

--- 192.168.1.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2036ms
rtt min/avg/max/mdev = 0.064/0.071/0.082/0.007 ms

你可以从局域网的其他电脑上ping这些容器! 但是主机和这些macvlan容器不能通过网络通信。这与macvlan在Linux内核中的工作方式有关。

故障排除

帮助! 我不能在主机和容器之间ping!

为了能够让主机和容器之间相互通信,你需要对主机进行一些额外的修改,以便将其也加入到macvlan中。它讨论了这里,虽然我没有测试,因为我不需要容器与主机的通信。如果你测试了它,请在下面报告。

帮助! 我再也找不到net1.lxd, net2.lxd这些花哨的主机名了!

默认的LXD DHCP服务器会给每个容器分配net1.lxd、net2.lxd这样的主机名。然后,你可以让容器使用主机名而不是IP地址来相互通信。

当使用局域网DHCP服务器时,你也需要对它进行配置以产生好的主机名。

帮助! 这些新的macvlan容器可以读取我的LAN网络流量吗?

新的macvlan LXD 容器(得到一个LAN IP地址)只能看到自己的流量和任何LAN broadcast数据包。他们不能看到用于主机的流量,也不能看到其他容器的流量。

帮助!我得到一个错误 "Error: 设备验证失败 "eth0"。不能将 "nictype "属性与 "network "属性一起使用`。

本教程的前一版本是以旧的方式来添加设备到LXD配置文件。老式的方法应该是在LXD较新版本的兼容模式下工作。但至少在 LXD 4.2 中不能,并出现以下错误。由于我更新了帖子,您应该不会再出现这个错误。如果您使用的是非常老的 LXD,您可能会得到一个错误。在这种情况下,请在评论中报告。

$ lxc profile device set macvlan eth0 nictype macvlan
Error: Device validation failed "eth0": Cannot use "nictype" property in conjunction with "network" property
$

摘要

通过这个教程,你可以使用macvlan创建从局域网中获得IP地址的容器(与主机的来源相同)。

缺点是,主机和这些 "macvlan "容器不能通过网络通信。对于一些人来说,这是一个很好的优势,因为他们把主机和容器屏蔽了。

然后,"macvlan "容器在局域网上是可见的,就像另一个局域网计算机一样工作。

本教程已经更新了编辑LXD配置文件的新命令(lxc profile device add)。旧的命令会出现错误。

文章来源
https://blog.simos.info/how-to-make-your-lxd-container-get-ip-addresses-from-your-lan/

0
封面图

评论0

没有账号? 注册  忘记密码?