我们的网络依靠 DHCP 标签将客户端路由到正确的上游主机,而无需知道这些主机的 FQDN。我们习惯dnsmasq
通过 MAC 地址为客户端设置标签,然后根据标签向客户端推送不同的搜索域。例如,我们在 中有以下两行dnsmasq.conf
:
dhcp-option=tag:foo,option:domain-search,foo.company.net
dhcp-host=00:11:22:33:44:55,foo-client,set:foo
这里,当foo-client
尝试访问任何不合格的主机时,它将尝试查看<unqualified-hostname>.foo.company.net
。
一些客户端计算机也在 LXC 容器内运行服务。容器通过dnsmasq
LXC 主机上运行的本地实例获取其网络信息,这是 LXC 客户机的 DNS/DHCP 默认方法。然后 LXC 客户机在本地 NAT 网络上获取 IP 地址。
问题出在我们的标记方案上。LXC 客户端无法收到推送给他们的搜索域,因为它们没有从我们主网络范围的 DHCP 服务器接收 DCHP。LXC 客户端可以 ping 更广泛网络上的 IP 地址,但搜索域的 DNS 解析失败。如果我手动设置正确的搜索域,则解析将按预期进行。
有没有办法将该搜索域从主机传递到客户机?
请注意,我们没有跑步lxd
。
答案1
因此,我没有找到确切的解决方案,但我确实找到了一种解决方法。基本上,LXC 可以在启动网络之前在客户机上运行一个脚本。此配置选项称为lxc.network.script.up
。我使用此功能从主机复制 DNS 信息:
#!/bin/bash
CONTAINER=$1
SECTION=$2
OPERATION=$3
NAMESERVER=$(grep nameserver /etc/resolv.conf | sed 's/^nameserver //g')
SEARCHDOMAIN=$(grep search /etc/resolv.conf | sed 's/^search //g')
cat > /var/lib/lxc/$CONTAINER/rootfs/etc/network/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
dns-search $SEARCHDOMAIN
dns-nameservers $NAMESERVER
EOF
我放置了这个脚本/var/lib/lxc/guest/setup-dns.sh
并将以下行添加到/var/lib/lxc/guest/config
:
lxc.network.script.up = /var/lib/lxc/guest/setup-dns.sh
完成这些步骤后,客户端启动并正确设置了 DNS 和搜索路径选项。