如何在 Ubuntu 上从 DHCP 服务器请求主机名?

如何在 Ubuntu 上从 DHCP 服务器请求主机名?

我有一个 Ubuntu 11.04 服务器虚拟机。我想从办公室的 DHCP 服务器请求特定的主机名。因为我不经常运行它,所以每次启动时IP都会改变。显然,通过主机名引用它是首选。

我知道我的 DHCP 服务器尊重 DHCP 客户端主机名请求。在我的 Windows 7 计算机上,我可以重命名计算机、重新启动、查询 DHCP 服务器,并在“答案部分”中查看新名称。我使用的查询命令是:

dig @192.168.225.5 -x 192.168.235.XXX

每次它都会以新的计算机主机名进行响应。我现在还可以使用新主机名从其他计算机执行 ping 和 ssh 操作。

我在 Ubuntu VM 上就没有这样的运气了。我修改了 /etc/dhcp/dhclient.conf 以包含一行:

send host-name "MYRQUESTEDHOSTNAME";

然后运行

sudo /etc/init.d/networking restart

但使用虚拟机的 IP 地址进行 dig 查询不会产生任何答案部分。

我缺少什么?

答案1

您需要检查主机名是否实际发送。如果是,则问题在于 dhcp 服务器未更新 DNS 记录。

send 指定发送到 DHCP 服务器的选项。你假设这send host-name "foo.bar"意味着发送 foo.bar 作为主机名。然而这意味着将主机名和字符串“foo.bar”发送到 dhcp 服务器。您需要两行: option host-name "foo.bar";发送主机名;

答案2

我找到了适合我的网络的解决方案,但您的情况可能会有所不同。我不知道为什么它不会自动发生。无论如何,这是一个简单的 shell 脚本,它应该使用正确的 IP 更新正确网络接口上的正确名称服务器(也适用于 VPN 连接),并且应该适用于 OSX/BSD 和 Linux。

#!/bin/bash

# the host information to send
DOMAIN=$(awk '/^search/ {print $2}' /etc/resolv.conf | head -1)
HOST=$(hostname -s)

# nameserver to update
NAMESERVER=$(awk '/nameserver/ {print $2}' /etc/resolv.conf | head -1)

# linux version to find interace that routes to nameserver 
if [[ -e /sbin/ip ]]; then
    INTERFACE=$(ip -o route get ${NAMESERVER} | awk '{print $5}')
else # osx / bsd version
    INTERFACE=$(route get ${NAMESERVER} | awk '/interface/ {print $2}')
fi

# ip of the interface
IP=$(ifconfig ${INTERFACE} | perl -ne 'print "$1" if /inet.*?(\d+\.\d+\.\d+\.\d+)/')


nsupdate -d <(

echo server ${NAMESERVER} 53
echo update add ${HOST}.${DOMAIN} 86400 A ${IP}
echo show
echo send

)

答案3

上面的答案是,您的 Windows 计算机正在使用其主机名手动更新网络上的名称服务器,这与 DHCP 过程完全独立。

理想情况下,您的 DHCP 服务器本身会执行此任务 - 因此答案与 DHCP 请求无关,而与 DHCP/DNS 服务器本身的配置有关。看这篇文章在 Debian 上进行正确配置。

相关内容