多个 DHCP 上行链路 - 如何忽略除一个之外的所有 DNS 和默认路由?

多个 DHCP 上行链路 - 如何忽略除一个之外的所有 DNS 和默认路由?

多宿主机需要为 DHCP 配置多个上行链路。它需要忽略默认路由和 DNS除了一个DHCP 上行链路。

这里有一个类似的问题[Debian 接口文件 - 忽略来自 dhcp 的网关和 dns 条目],但那里的答案并不能解决我的问题:

  • 编辑全局 DHCP 客户端配置 (/etc/dhcp[3]/dhclient.conf) 将导致默认路由和 DNS 被忽略全部DHCP 上行链路。
  • ifmetric建议仅处理路由,而不处理 DNS。

此外,我希望自 2009 年以来情况有所改变。

请注意,我说的是无头嵌入式系统。NetworkManager 不是一个选项。

首选解决方案是仅使用 /etc/network/interfaces{.d/}。我正在寻找类似以下内容的内容:

auto  eth0
iface eth0 inet dhcp

auto  eth1
iface eth1 inet dhcp
    ignore-dhcp-option routers domain-name-servers domain-name

附录:

我们在各种环境中安装了数十个这样的盒子。网络不在我们的控制之下。在某些情况下,盒子需要在多个接口上执行 DHCP。我们通常事先不知道默认路由和 DNS,即使知道,它们也可能随着时间的推移而发生变化,恕不另行通知。因此,我们不能静态设置它们,而必须通过“主”DHCP 客户端配置它们。

答案1

/etc/network/interfaces{,.d/}(我仍然对仅触及但不触及的解决方案感兴趣/etc/dhcp/。在没有这样的解决方案的情况下,我会使用这个。)

在 中,从全局语句中/etc/dhcp*/dhclient.conf删除选项。然后添加此(假设是默认路由和 DNS 将要使用的设备)routers, domain-name-servers, domain-name, domain-searchrequesteth0不是被忽略):

interface "eth0" {
    also request routers, domain-name-servers, domain-name, domain-search;
}

该解决方案至少适用于 isc-dhcp-client 版本 4.2.2.dfsg.1-5+deb70u8,因为它随 Debian 7 一起提供。我认为它也适用于更高版本。


编辑:

  • 确认原始想法经过微小修改即可行得通(eth0必须引用,也应该引用request,而不是required
  • 指定适用的 dlclient 版本

答案2

除了使用之外,inet dhcp您还可以使用inet manual来指定您自己的dhclient调用,并向其传递自定义dhclient.conf文件(请注意-cf <file>参数):

iface eth0 inet manual
    up /sbin/dhclient -4 -v -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}
    down /sbin/dhclient -4 -v -r -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}

在您的自定义dhclient.conf/etc/dhcp/dhclient_no_routers.conf在这种情况下)中,您可以设置所需的 DHCP 选项。

要查看该inet dhcp方法的其他功能,请参阅inet.defn源代码中的文件(这就是我dhclient从上面获得一些调用的地方)。

答案3

通过在 /etc/dhcp/dhcliet.conf 中添加以下内容可解决相同的问题:

interface "eth0" {
    prepend domain-search "my.domain";
    prepend domain-name-servers 127.0.0.1; # for using dnsmasq without -r option
    request subnet-mask, broadcast-address, time-offset, 
            routers, domain-name-servers, domain-name, domain-search, host-name,
            dhcp6.name-servers, dhcp6.domain-search,
            netbios-name-servers, netbios-scope, interface-mtu,
            rfc3442-classless-static-routes, ntp-servers,
            dhcp6.fqdn, dhcp6.sntp-servers;
    require routers, domain-name-servers, domain-name, domain-search, host-name;

}

request并从配置中删除全局参数

答案4

systemd 忽略dhclient.conf。对于需要使用 systemd 执行相同操作的任何人,如果您将以下内容添加到所有网络接口文件 ( /etc/systemd/network/*.network) 中,对于您不想使用 DNS 或路由的接口,它也可以解决问题:

[DHCP]
RouteMetric=2000
SendHostname=True
UseHostname=False
UseDNS=False
UseDomains=False
UseNTP=False
UseTimezone=False
UseMTU=True

只要RouteMetric大于主路由的度量,只要主路由可用,网关就不会被使用。在我的设置中,我为每个接口增加它,这样流量总是通过第一个可用的接口路由。

相关内容