<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>55600</bug_id>
          
          <creation_ts>2025-08-13 19:02:32 +0300</creation_ts>
          <short_desc>NetworkManager (etcnet): Удаление link-local IPv6-адреса с помощью `ip`, если CONFIG_IPV6=yes, приводит к восстановлению всех IPv6-адресов</short_desc>
          <delta_ts>2025-08-26 11:12:26 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>etcnet</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          <see_also>https://bugzilla.altlinux.org/show_bug.cgi?id=51620</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Artem Varaksa">varaksaaa</reporter>
          <assigned_to name="Mikhail Efremov">sem</assigned_to>
          <cc>arseny</cc>
    
    <cc>ldv</cc>
    
    <cc>rider</cc>
    
    <cc>sem</cc>
    
    <cc>shaba</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>270863</commentid>
    <comment_count>0</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-08-13 19:02:32 +0300</bug_when>
    <thetext>Шаги
====

1. # ip -c a
2. # ip -6 addr delete fe80::&lt;link-local-ipv6&gt;/64 dev ens19 &amp;&amp; ip -c a
3. # sleep 3 &amp;&amp; ip -c a

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

==&gt; /etc/net/ifaces/ens19/ipv4address &lt;==
(пустой файл)

==&gt; /etc/net/ifaces/ens19/options &lt;==
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::&lt;link-local-ipv6&gt;/64 dev ens19 &amp;&amp; ip -c a
8. # sleep 3 &amp;&amp; ip -c a


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

До:

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

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

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

После:

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

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

&gt; 8. # sleep 3 &amp;&amp; ip -c a
&gt; ...
&gt; 2: ens19: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000
&gt;     link/ether &lt;mac&gt; brd ff:ff:ff:ff:ff:ff
&gt;     altname enp0s19
&gt;     inet &lt;ipv4&gt;/21 brd &lt;broadcast-ipv4&gt; scope global noprefixroute ens19
&gt;        valid_lft forever preferred_lft forever
&gt;     inet6 &lt;ipv6&gt;/64 scope global noprefixroute
&gt;        valid_lft forever preferred_lft forever
&gt;     inet6 fe80::&lt;link-local-ipv6&gt;/64 scope link noprefixroute
&gt;        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</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270896</commentid>
    <comment_count>1</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2025-08-14 15:03:40 +0300</bug_when>
    <thetext>Помогает ли следующая команда предотвратить перегенерацию адресов?
  # ip l set ens19 addrgenmode none

Если да, то etcnet, в теории, мог бы настраивать этот параметр и реализовывать собственную политику генерации адресов.
Но это более обширное предложение. В частности:
— далеко не факт, что надо поддерживать конфигурацию, где LL-адрес отсутствует на не-p2p интерфейсе;
— у него importance будет не normal, а enhancement;
— позволю себе сомневаться, что такое предложение будет принято при исходном позиционировании etcnet — &quot;хитрые алгоритмы почти все в ядре, не мешайте ему&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270897</commentid>
    <comment_count>2</comment_count>
    <who name="Arseny Maslennikov">arseny</who>
    <bug_when>2025-08-14 15:04:53 +0300</bug_when>
    <thetext>(In reply to Artem Varaksa from comment #0)
&gt; (Иногда сначала `scope link tentative noprefixroute` у link-local адреса,
&gt; затем `tentative` исчезает.)
Это абсолютно нормальное поведение, для свеженазначенного адреса происходит процедура duplicate address detection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270898</commentid>
    <comment_count>3</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-08-14 15:22:30 +0300</bug_when>
    <thetext>Спасибо.

Нет, команда `# ip l set ens19 addrgenmode none` не помогает. Адреса так же продолжают перегенерироваться после удаления link-local.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271373</commentid>
    <comment_count>4</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2025-08-25 19:17:17 +0300</bug_when>
    <thetext>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</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271374</commentid>
    <comment_count>5</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2025-08-25 19:18:42 +0300</bug_when>
    <thetext>Удаление link-local адреса, похоже, приводит к переинициализации сетевой подсистемы ipv6 на интерйфейсе и поэтому появляются и остальные удалённые адреса.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271406</commentid>
    <comment_count>6</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-08-26 10:23:37 +0300</bug_when>
    <thetext>Понятно, но почему тогда поведение воспроизводится только после включения CONFIG_IPV6=yes в etcnet? Если это ожидаемое поведение на уровне ядра, то оно должно быть таким всегда, вне зависимости от настроек etcnet.

В данном случае получается, что etcnet всё же меняет какие-то настройки, которые приводят к такой перегенерации. Возможно, это ожидаемо из-за переключения с фактического Только RA (также см. https://bugzilla.altlinux.org/55605) на DHCP/static, т. е. в режиме Только RA допустимо удаление адреса?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271420</commentid>
    <comment_count>7</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2025-08-26 11:12:26 +0300</bug_when>
    <thetext>Всё что делает etcnet для поднятия ipv6 адресов, если не настроен dhcp6:

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

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

    </bug>

</bugzilla>