我有一个 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 上进行正确配置。