У меня есть много машин (оба старых 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 удален и таким образом, поле становится недоступным через сеть.
Это не всегда имело место и интересно
Что я попробовал:
/var/lib/dhcp/dhclient.eth0.leases
. Когда я удаляю этот файл, проблема больше не появляетсяip -4 addr flush dev ...
.Помогите!
Таким образом, я узнал:
То, когда 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-м.