На 16,04, потерян интерфейсный псевдоним ifconfig-стиля, когда dhclient не удается получить арендный договор

У меня есть много машин (оба старых ubuntu14.04, а также более новый ubuntu16.04), которым настроили их интегрированный Ethernet как это:

/etc/network/interfaces:

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 удерживает список previosuly-успешных арендных договоров /var/lib/dhcp/dhclient.eth0.leases. Когда я удаляю этот файл, проблема больше не появляется
  • Я посмотрел на dhclient-сценарий, и в то время как я не уверен, что его на самом деле используемый в процессе, он содержит много подозрительного кода как ip -4 addr flush dev ....

Помогите!

0
задан 10 November 2018 в 17:42

1 ответ

Таким образом, я узнал:

То, когда dhclient испытывает таймаут на eth0, он проверяет/var/lib/dhcp/dhclient.eth0.lease на зарегистрированный арендный договор, который все еще действителен (т.е. "истеките", находится в будущем). Если это находит такой арендный договор, это выполняет dhclient-сценарий (и помещает reason=TIMEOUT и настройки арендного договора в ENV),

Соответствующий раздел dhclient-сценария

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-4 dev eth0 сброса addr", которые также разъединяют eth0:1.

Второй вопрос, что изменилось: мы используем новый сервер DHCP с намного более длительными временами арендного договора. Ранее они были установлены приблизительно на час, таким образом, спустя один час после последнего соединения с LAN эта проблема не покажет (dhclient, не может найти действительный зарегистрированный арендный договор), тогда как теперь это было 12-м.

0
ответ дан 27 October 2019 в 04:33

Другие вопросы по тегам:

Похожие вопросы: