如何远程重新加载 DHCP 客户端,以便写入新的 resolv.conf?

如何远程重新加载 DHCP 客户端,以便写入新的 resolv.conf?

我正在尝试dnsmasq(8)在私有网络中配置 Debian GNU/Linux 系统DHCP。在本地手动设置期间(安装dnsmasqistelf 后),只需包含以下行

prepend domain-name-servers 127.0.0.1;

/etc/dhcp/dhclient.conf重新启动网络。这将包括本地主机,/etc/resolv.conf并且其中一个已准备就绪。(另请参阅:http://wiki.debian.org/HowTo/dnsmasq#Local_Caching

但尝试远程执行同样的操作,尤其是与配置管理软件,会导致网络连接丢失。好吧,因为目标不是网络重启,而是更新resolv.conf……:

如何强制dhclient(8)更新resolv.conf同时保持网络连接正常运行?

[编辑]

下面是一个对我有用的脚本:

if grep '^\s*nameserver\>.\+\<127\.0\.0\.1\>' /etc/resolv.conf >/dev/null; then
    : # do nothing
else
    grep -v '^\s*nameserver\>' /etc/resolv.conf > /tmp/resolv.conf.new
    echo "nameserver 127.0.0.1" >> /tmp/resolv.conf.new
    grep '^\s*nameserver\>' /etc/resolv.conf >> /tmp/resolv.conf.new
    mv -f /tmp/resolv.conf.new /etc/resolv.conf
fi

这有点尴尬——我仍在寻找更好的解决方案。

答案1

我在通过 ansible 设置 dnsmasq 时遇到了同样的问题。在 debian jessie 上,您可以更新 dhclient.conf 并执行以下操作:

/usr/bin/killall dhclient
dhclient INTERFACE

或者如果你愿意:

dhclient -x
dhclient INTERFACE

除非您的租约到期并且您获得了不同的 IP 地址,否则这不会终止您的连接。

您提到了配置管理。如果您正在使用 ansible,以下是我的剧本的相关部分:

tasks:
- name: Ensure a correct resolv.conf
  template: src=templates/resolv.conf.j2 dest=/etc/resolv.conf

- name: Ensure dhclient config wont mess up my resolv.conf
  template: src=dhclient.conf.j2 dest=/etc/dhcp/dhclient.conf
  notify: Kill dhclient

handlers:
- name: Kill dhclient
  command: /usr/bin/killall dhclient
  ignore_errors: yes
  changed_when: false

请注意,我在终止 dhclient 后不会重新启动它。这在我的环境中运行良好,但 YMMV。您可以添加另一个任务,复制一个脚本来处理 dhclient 停止/启动并从处理程序中调用该脚本(甚至可能使用它{{ansible_default_ipv4.interface}}来获取接口的名称)。

我的dhclient.conf模板是这样的:

send host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers, host-name, interface-mtu, rfc3442-classless-static-routes, ntp-servers, dhcp6.fqdn, dhcp6.sntp-servers;

因此,大多数默认的 debiandhclient.conf都没有与 dns 相关的指令。

相关内容