多宿主机需要为 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-search
request
eth0
不是被忽略):
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
大于主路由的度量,只要主路由可用,网关就不会被使用。在我的设置中,我为每个接口增加它,这样流量总是通过第一个可用的接口路由。