我有很多机器(旧的 ubuntu14.04 以及较新的 ubuntu16.04),它们的集成以太网配置如下:
在 /etc/网络/接口:
allow-hotplug eth0
iface eth0 inet dhcp
metric 5
# Also have a fixed IP for infrastructure-less connections.
# Don't add a gateway, it would become a default-gw
auto eth0:1
iface eth0:1 inet static
address 192.168.200.10
metric 10
mtu 8192
正常情况下,这很有效,执行 ifconfig 时我得到以下界面:
eth0 Link encap:Ethernet HWaddr 94:c6:91:18:69:20
inet addr:192.168.2.11 Bcast:192.168.2.255 Mask:255.255.255.0
...
eth0:1 Link encap:Ethernet HWaddr 94:c6:91:18:69:20
inet addr:192.168.200.10 Bcast:192.168.200.255 Mask:255.255.255.0
...
这意味着我可以通过 DHCP 获取地址,同时拥有一个静态地址,可以在将机器直接连接到另一台机器时使用该地址。
但是,我最近注意到,当我在网络上没有 DHCP 服务器的情况下启动机器时(即,仅机器到机器),dhclient 会尝试获取地址 300 秒,然后放弃。此时,我的 eth0:1 被删除,因此,该机器无法通过网络访问。
情况并不总是这样的,我想知道
- 为什么会发生这种情况?
- 有什么改变?
我已尝试过:
- 我读了 dhclient.conf,发现 dhclient 在 中保存了之前成功的租约列表
/var/lib/dhcp/dhclient.eth0.leases
。当我删除此文件时,问题不再出现 - 我查看了 dhclient-script,虽然我不确定它是否在过程中实际使用,但它包含很多可疑的代码,例如
ip -4 addr flush dev ...
。
请帮忙!
答案1
因此我发现:
当 dhclient 在 eth0 上超时时,它会检查 /var/lib/dhcp/dhclient.eth0.lease 中是否有记录的租约仍然有效(即“expire”在将来)。如果找到这样的租约,它会运行 dhclient-script(并将reason=TIMEOUT 和租约的设置放入环境中)。
dhclient-script 的相关部分是
TIMEOUT)
if [ -n "$alias_ip_address" ]; then
# flush alias IP
ip -4 addr flush dev ${interface} label ${interface}:0
fi
# set IP from recorded lease
ip -4 addr add ${new_ip_address}${new_subnet_mask:+/$new_subnet_mask} \
${new_broadcast_address:+broadcast $new_broadcast_address} \
dev ${interface} label ${interface}
if [ -n "$new_interface_mtu" ]; then
# set MTU
ip link set dev ${interface} mtu ${new_interface_mtu}
fi
# if there is no router recorded in the lease or the 1st router answers pings
if [ -z "$new_routers" ] || ping -q -c 1 "${new_routers%% *}"; then
# if we have $new_rfc3442_classless_static_routes then we have to
# ignore $new_routers entirely
if [ ! "$new_rfc3442_classless_static_routes" ]; then
if [ -n "$alias_ip_address" ] &&
[ "$new_ip_address" != "$alias_ip_address" ]; then
# separate alias IP given => set up the alias IP & add host route to it
ip -4 addr add ${alias_ip_address}${alias_subnet_mask:+/$alias_subnet_mask} \
dev ${interface} label ${interface}:0
ip -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1
fi
# set if_metric if IF_METRIC is set or there's more than one router
if_metric="$IF_METRIC"
if [ "${new_routers%% *}" != "${new_routers}" ]; then
if_metric=${if_metric:-1}
fi
# set default route
for router in $new_routers; do
ip -4 route add default via ${router} dev ${interface} \
${if_metric:+metric $if_metric} >/dev/null 2>&1
if [ -n "$if_metric" ]; then
if_metric=$((if_metric+1))
fi
done
fi
# update /etc/resolv.conf
make_resolv_conf
else
# flush all IPs from interface
ip -4 addr flush dev ${interface}
exit_with_hooks 2
fi
因此,它首先尝试 ping 租约中的路由器并失败,然后前进到“# 从接口刷新所有 IP”并调用“ip -4 addr flush dev eth0”,这也会拆除 eth0:1。
第二个问题,有什么变化:我们正在使用新的 DHCP 服务器,其租约时间更长。以前它们被设置为大约一小时,因此在最后一次连接到 LAN 后一小时,这个问题不会出现(dhclient 无法找到有效的记录租约),而现在是 12 小时。