通过 DNS 查找通过 DHCP 分配固定 IP 地址

Jan*_*tor 5 networking dhcp linux ubuntu dhcp-server

前言

我正在使用 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 服务器的主机标识符选项参数。例如,不可能将主机声明与主机名选项相匹配。这是因为不能保证主机名选项对于任何给定的客户端都是唯一的,而硬件地址和 dhcp-client-identifier 选项至少在理论上保证对给定的客户端是唯一的。

我还尝试创建一个与主机名匹配的类,如下所示:

class "my-client-name" {
    match if option host-name = "my-client-name";
    fixed-address my-client-name.my-domain.com;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在 class 语句中不允许使用固定地址选项。我可以用一个大小为 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这需要我在两个地方(Amazon Route53 和 DHCP 服务器)管理 IP 地址,而我不想这样做

关于安全

由于这仅用于内部网络的引导阶段,然后由 Puppet 替换为静态网络配置,因此从安全角度来看,这应该不是问题。但是,我知道虚拟机使用“ubuntu:ubuntu”凭据引导,我打算在运行后修复它。

小智 2

希望您可以控制虚拟以太网接口的硬件MAC 地址。

在这种情况下,我遇到了类似的问题,ISC Bind 同样不配合我的配置工作。最好的解决方案是编辑租用文件,以便将所需的 IP 地址分配给相应的硬件 MAC,多年来我仍然可靠地使用该解决方案。

首先,您只需启动客户端来填充租赁文件。然后停止客户端并绑定,然后编辑租约文件。