Bug 55600 - NetworkManager (etcnet): Удаление link-local IPv6-адреса с помощью `ip`, если CONFIG_IPV6=yes, приводит к восстановлению всех IPv6-адресов
Summary: NetworkManager (etcnet): Удаление link-local IPv6-адреса с помощью `ip`, если...
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: etcnet (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Mikhail Efremov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-08-13 19:02 MSK by Artem Varaksa
Modified: 2025-08-26 11:12 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2025-08-13 19:02:32 MSK
Шаги
====

1. # ip -c a
2. # ip -6 addr delete fe80::<link-local-ipv6>/64 dev ens19 && ip -c a
3. # sleep 3 && ip -c a

4. Добавить в настройки etcnet по умолчанию строку `CONFIG_IPV6=yes`, получив:

==> /etc/net/ifaces/ens19/ipv4address <==
(пустой файл)

==> /etc/net/ifaces/ens19/options <==
BOOTPROTO=dhcp
TYPE=eth
CONFIG_WIRELESS=no
NM_CONTROLLED=yes
DISABLED=yes
SYSTEMD_CONTROLLED=no
ONBOOT=yes
SYSTEMD_BOOTPROTO=dhcp4
CONFIG_IPV4=yes
CONFIG_IPV6=yes

(в sisyphus по сравнению с p11 ещё есть DHCP_TIMEOUT=7)

5. Перезагрузиться.

6. # ip -c a
7. # ip -6 addr delete fe80::<link-local-ipv6>/64 dev ens19 && ip -c a
8. # sleep 3 && ip -c a


Фактический результат
=====================

До:

> 6. # ip -c a
> ...
> 2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
>     link/ether <mac> brd ff:ff:ff:ff:ff:ff
>     altname enp0s19
>     inet <ipv4>/21 brd <broadcast-ipv4> scope global noprefixroute ens19
>        valid_lft forever preferred_lft forever
>     inet6 <network>:<ipv6-link-local>/64 scope global noprefixroute
>        valid_lft forever preferred_lft forever
>     inet6 fe80::<link-local-ipv6>/64 scope link noprefixroute
>        valid_lft forever preferred_lft forever

> 7. # ip -6 addr delete fe80::<link-local-ipv6>/64 dev ens19 && ip -c a
> ...
> 2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
>     link/ether <mac> brd ff:ff:ff:ff:ff:ff
>     altname enp0s19
>     inet <ipv4>/21 brd <broadcast-ipv4> scope global noprefixroute ens19
>        valid_lft forever preferred_lft forever
>     inet6 <network>:<ipv6-link-local>/64 scope global noprefixroute
>        valid_lft forever preferred_lft forever

> 8. # sleep 3 && ip -c a
> (то же самое)

После:

> 6. # ip -c a
> ...
> 2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
>     link/ether <mac> brd ff:ff:ff:ff:ff:ff
>     altname enp0s19
>     inet <ipv4>/21 brd <broadcast-ipv4> scope global noprefixroute ens19
>        valid_lft forever preferred_lft forever
>     inet6 <ipv6>/64 scope global noprefixroute
>        valid_lft forever preferred_lft forever
>     inet6 fe80::<link-local-ipv6>/64 scope link noprefixroute
>        valid_lft forever preferred_lft forever

> 7. # ip -6 addr delete fe80::<link-local-ipv6>/64 dev ens19 && ip -c a
> ...
> 2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
>     link/ether <mac> brd ff:ff:ff:ff:ff:ff
>     altname enp0s19
>     inet <ipv4>/21 brd <broadcast-ipv4> scope global noprefixroute ens19
>        valid_lft forever preferred_lft forever
>     inet6 <ipv6>/64 scope global noprefixroute
>        valid_lft forever preferred_lft forever

> 8. # sleep 3 && ip -c a
> ...
> 2: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
>     link/ether <mac> brd ff:ff:ff:ff:ff:ff
>     altname enp0s19
>     inet <ipv4>/21 brd <broadcast-ipv4> scope global noprefixroute ens19
>        valid_lft forever preferred_lft forever
>     inet6 <ipv6>/64 scope global noprefixroute
>        valid_lft forever preferred_lft forever
>     inet6 fe80::<link-local-ipv6>/64 scope link noprefixroute
>        valid_lft forever preferred_lft forever

(Иногда сначала `scope link tentative noprefixroute` у link-local адреса, затем `tentative` исчезает.)


Ожидаемый результат
===================

IPv6-адрес link-local не появляется автоматически сразу после удаления вручную (до перезагрузки или другого аналогичного события).


Дополнительно
=============

Аналогичное поведение, если `BOOTPROTO=static` и настроить статический IPv6 в файле `ipv6address`.

Если сначала удалить все не link-local IPv6-адреса, то они удаляются успешно. Но после этого удаление link-local адреса приводит к появлению всех новых IPv6-адресов заново. Если удалить только часть, восстанавливаются все после удаления link-local.

Если убрать `CONFIG_IPV6=yes` и перезагрузиться, то link-local адрес будет удаляться корректно.

Обнаружено при выполнении workaround для https://bugzilla.altlinux.org/51620.


Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[sisyphus] например ALT Workstation K 11.0 x86_64
etcnet-0.9.35-alt1.noarch
iproute2-6.13.0-alt1.x86_64
NetworkManager-1.53.92-alt1.x86_64
kernel-image-6.12-6.12.41-alt1.x86_64

[p11] например ALT Workstation K 11.0 x86_64
etcnet-0.9.35-alt1.noarch
iproute2-6.12.0-alt1.x86_64
NetworkManager-1.52.1-alt1.x86_64
kernel-image-6.12-6.12.41-alt1.x86_64
Comment 1 Arseny Maslennikov 2025-08-14 15:03:40 MSK
Помогает ли следующая команда предотвратить перегенерацию адресов?
  # ip l set ens19 addrgenmode none

Если да, то etcnet, в теории, мог бы настраивать этот параметр и реализовывать собственную политику генерации адресов.
Но это более обширное предложение. В частности:
— далеко не факт, что надо поддерживать конфигурацию, где LL-адрес отсутствует на не-p2p интерфейсе;
— у него importance будет не normal, а enhancement;
— позволю себе сомневаться, что такое предложение будет принято при исходном позиционировании etcnet — "хитрые алгоритмы почти все в ядре, не мешайте ему".
Comment 2 Arseny Maslennikov 2025-08-14 15:04:53 MSK
(In reply to Artem Varaksa from comment #0)
> (Иногда сначала `scope link tentative noprefixroute` у link-local адреса,
> затем `tentative` исчезает.)
Это абсолютно нормальное поведение, для свеженазначенного адреса происходит процедура duplicate address detection.
Comment 3 Artem Varaksa 2025-08-14 15:22:30 MSK
Спасибо.

Нет, команда `# ip l set ens19 addrgenmode none` не помогает. Адреса так же продолжают перегенерироваться после удаления link-local.
Comment 4 Anton Farygin 2025-08-25 19:17:17 MSK
etcnet сам не работает как сервис, отдавая настройку на сторону ядра.

Link-local адреса (fe80::/64) автоматически назначаются ядром IPv6 на каждый активный интерфейс и являются обязательными по стандарту (RFC 4291, RFC 4862).
Удалить их «навсегда» командой ip -6 addr del невозможно — стек IPv6 создаёт их заново.

Если требуется полностью убрать link-local на конкретном интерфейсе, нужно отключить IPv6 именно для него через sysctl -w net.ipv6.conf.ens19.disable_ipv6=1
Comment 5 Anton Farygin 2025-08-25 19:18:42 MSK
Удаление link-local адреса, похоже, приводит к переинициализации сетевой подсистемы ipv6 на интерйфейсе и поэтому появляются и остальные удалённые адреса.
Comment 6 Artem Varaksa 2025-08-26 10:23:37 MSK
Понятно, но почему тогда поведение воспроизводится только после включения CONFIG_IPV6=yes в etcnet? Если это ожидаемое поведение на уровне ядра, то оно должно быть таким всегда, вне зависимости от настроек etcnet.

В данном случае получается, что etcnet всё же меняет какие-то настройки, которые приводят к такой перегенерации. Возможно, это ожидаемо из-за переключения с фактического Только RA (также см. https://bugzilla.altlinux.org/55605) на DHCP/static, т. е. в режиме Только RA допустимо удаление адреса?
Comment 7 Anton Farygin 2025-08-26 11:12:26 MSK
Всё что делает etcnet для поднятия ipv6 адресов, если не настроен dhcp6:

$IP -6 address flush dev $NAME scope host >/dev/null 2>&1
$IP -6 address flush dev $NAME scope site >/dev/null 2>&1
$IP -6 address flush dev $NAME scope global >/dev/null 2>&1

link-local адреса он не трогает, но возможно эти команды заставляют ядро показать и link-local адреса