前言
我正在使用 Ubuntu 14.04 和 LXC 构建虚拟化环境。我不想编写自己的模板,因为从 12.04 升级到 14.04 表明无法保证向后兼容性。
因此,我使用默认的 Ubuntu 模板通过 lxc-create 部署虚拟机。服务器的 DNS 由 Amazon Route 53 提供,因此不需要本地 DNS 服务器。
我还使用 Puppet 来配置我的服务器,所以我想尽量减少部署上的手动工作量。
现在,默认的 Ubuntu 模板通过 DHCP 分配 IP 地址。因此,我需要一个本地 DHCP 服务器来为节点分配 IP 地址,这样我就可以通过 SSH 进入这些节点并运行 Puppet。由于 Puppet 需要正确的 DNS 设置,因此无法分配临时 IP 地址,客户端需要从一开始就获取正确的主机名和 IP 地址。
问题
我使用什么 DHCP 服务器以及如何通过对该主机名执行 DNS 查找来使其仅根据主机名 DHCP 选项分配 IP 地址?
我尝试过的方法
我尝试使用 ISC DHCP 服务器使其工作,但是手册明确指出:
请注意,只有 dhcp-client-identifier 选项和硬件地址可用于匹配主机声明,或 DHCPv6 服务器的 host-identifier 选项参数。例如,无法将主机声明与 host-name 选项匹配。这是因为 host-name 选项无法保证对于任何给定的客户端都是唯一的,而硬件地址和 dhcp-client-identifier 选项至少在理论上可以保证对于给定的客户端都是唯一的。
我还尝试创建一个与主机名匹配的类,如下所示:
class "my-client-name" {
match if option host-name = "my-client-name";
fixed-address my-client-name.my-domain.com;
}
不幸的是类语句中不允许使用固定地址选项。我可以用 1 大小的池替换它,它可以按预期工作:
subnet 10.103.0.0 netmask 255.255.0.0 {
option routers 10.103.1.1;
class "my-client-name" {
match if option host-name = "my-client-name";
}
pool {
allow members of "my-client-name";
range 10.103.1.2 10.103.1.2;
}
}
但是,这需要我在两个地方(Amazon Route53 和 DHCP 服务器)管理 IP 地址,我不想这么做。
关于安全
由于这仅在内部网络的引导阶段使用,然后由 Puppet 替换为静态网络配置,因此从安全角度来看这应该不是问题。但是,我知道虚拟机使用“ubuntu:ubuntu”凭据进行引导,我打算在运行后修复这个问题。
答案1
希望你能控制硬件MAC 地址虚拟以太网接口。
在这种情况下,我遇到了类似的问题,ISC bind 同样不配合我的配置工作。最好的解决方案是编辑租约文件这样所需的 IP 地址就可以分配给相应的硬件 MAC。
首先,您只需启动客户端来填充租约文件。然后停止客户端并绑定,然后编辑租约文件。
答案2
正如一位朋友指出的那样,我可以使用 Puppet 替换 LXC 配置文件中自动生成的 MAC 地址。这样我就可以使用带有 DNS 名称的 fixed-address 指令。