我正在尝试dnsmasq(8)
在私有网络中配置 Debian GNU/Linux 系统DHCP
。在本地手动设置期间(安装dnsmasq
istelf 后),只需包含以下行
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 相关的指令。