在 16.04 上,当 dhclient 无法获得租约时,ifconfig 样式的接口别名会丢失

在 16.04 上,当 dhclient 无法获得租约时,ifconfig 样式的接口别名会丢失

我有很多机器(旧的 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/dh​​cp/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 小时。

相关内容