Bug 55254 - samba + admc: Зависание ~10 секунд при запуске и каждом действии, когда у Samba DC отключен IPv6 (который отдаётся самим DC DNS)
Summary: samba + admc: Зависание ~10 секунд при запуске и каждом действии, когда у Sam...
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: samba (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Evgeny Sinelnikov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-07-17 17:42 MSK by Artem Varaksa
Modified: 2025-11-05 17:43 MSK (History)
4 users (show)

See Also:


Attachments
admc-comparison.mp4 (2.12 MB, video/mp4)
2025-07-17 17:42 MSK, Artem Varaksa
no flags Details
wireshark (2) bug (642.95 KB, video/mp4)
2025-07-25 13:51 MSK, Artem Varaksa
no flags Details
wireshark (1) ok (650.25 KB, video/mp4)
2025-07-25 13:52 MSK, Artem Varaksa
no flags Details
Вывод тестовых шагов (3.30 KB, text/plain)
2025-07-30 16:13 MSK, Artem Varaksa
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2025-07-17 17:42:29 MSK
Created attachment 19123 [details]
admc-comparison.mp4

Шаги
====

1. Развернуть Samba DC (ALT Server 11.0 x86_64) и ввести клиентов (ALT Workstation, Workstation K, Education (KDE), Education (XFCE) 11.0 x86_64).

2. Войти на клиентах администратором домена.

3. Открыть ADMC и попробовать открыть различные каталоги, объекты.


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

ADMC зависает 5+ секунд при каждом действии, иногда сильно дольше и выводится предложение о перезапуске неотвечающего приложения. См. видео - слева p11, справа p11+387440 (в sisyphus аналогично).


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

ADMC не зависает, как в p11, действия выполняются относительно быстро.


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

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

[sisyphus]
samba-4.21.7-alt1.x86_64
admc-0.21.0-alt1.x86_64

[p11+387440]
samba-4.21.7-alt1.x86_64
admc-0.20.0-alt2.x86_64


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

[p11]
samba-4.20.8-alt2.x86_64
admc-0.20.0-alt2.x86_64
Comment 1 Artem Varaksa 2025-07-17 18:05:08 MSK
Ошибся, на sisyphus перепроверил ещё раз, там скорость работы нормальная, как в p11. Проблема только в p11+387440, т. е. возможно исправляется в admc-0.21.0-alt1.x86_64 или зависит от какого-то другого пакета.
Comment 2 Artem Varaksa 2025-07-17 18:14:44 MSK
Перепроверил также в p11+387440 на свежеразвёрнутом домене, не воспроизвелось повторно. Возможно, плавающая ошибка, или зависит от каких-либо конкретных настроек, выполненных в домене при других проверках.
Comment 3 Evgeny Sinelnikov 2025-07-17 23:14:22 MSK
Хотелось бы локализовать проблемы.
Плавающую багу искать тяжело.

Наверное, стоит проверить статус клиента с помощью diag-domain-client.
Comment 4 Artem Varaksa 2025-07-18 11:21:31 MSK
Сейчас нет доступа к тем клиентам, где воспроизводилось. Воспроизводилось на всех 4 клиентах, т. е. возможно дело было и в сервере.

diag-domain-client/controller выполнял до обнаружения данной проблемы, всё было успешно за исключением:


1. Некорректной работы самих тестов:

* https://bugzilla.altlinux.org/51685
* https://bugzilla.altlinux.org/51573


2. Ошибок/предупреждений в тестах:

[WARN] # diag-domain-client --verbose check_nameservers 

(samba.testdomain недоступен на вышестоящих DNS-серверах, ожидаемо)


[WARN] # diag-domain-controller is_there_way_to_cache_kerberos_tickets
The type of caching of Kerberos tickets is set: keyring.
Possible problems with caching of Kerberos tickets.

(позже устанавливал `kerberos method = system keytab` для проверки https://bugzilla.altlinux.org/55111 - возможно из-за этого?)


[FAIL] # diag-domain-controller is_resolve_local 
Error: the resolv.conf file does not contain the nameserver 127.0.0.1 line.

(ожидаемо, `nameserver 127.0.0.1` убирается специально)
Comment 5 Artem Varaksa 2025-07-25 13:51:59 MSK
Created attachment 19190 [details]
wireshark (2) bug

При проверке в новой сборке p11+387440.5 ошибка снова воспроизвелась на всех клиентах.

Ошибка связана с DC и/или репликой, т. к.:
* При работающем ADMC на клиенте, если выполнить откат серверов до состояния сразу после введения клиентов в домен (1), проблема перестаёт воспроизводится.
* Как только выполняется откат до состояния, в котором ошибка воспроизводится (2), она сразу начинает воспроизводится, без перезапуска ADMC.

Попробовал воспроизвести на (1) (и наоборот исправить на (2)), выполняя шаги, которые выполнял при проверке (или обратные), но пока не удалось установить причину.

Однако известно, что:
* Результат `diag-domain-{client,controller}` не изменился.
* Перезагрузка серверов и клиентов не влияет на воспроизводимость.
* В терминале `$ admc` и в `# journalctl -f` вывода при возникновении проблемы нет.
* Никаких ошибок в интерфейсе ADMC не возникает (как, например, при отсутствии подключения к серверу). Просто начинает тормозить после 1-2 нажатий, и пока какой-то внутренний процесс не завершится и действия не обработаются, висит.
* Повышенной загрузки по памяти или CPU на клиенте, сервере и реплике не наблюдается.

Прикрепляю запись экрана с Wireshark в состояниях (2) и (1). В (2) быстро выполняются запросы DNS, а затем после долгой задержки клиент начинает быстро выполнять запросы LDAP и пр. В (1) все запросы выполняются сразу. При этом ответы на DNS-запросы идентичные (за исключением, конечно, Transaction ID).

Есть какие-то дополнительные способы выполнить диагностику проблемы, возможно как-то сделать profiling admc?
Comment 6 Artem Varaksa 2025-07-25 13:52:36 MSK
Created attachment 19191 [details]
wireshark (1) ok
Comment 7 Evgeny Sinelnikov 2025-07-27 22:28:18 MSK
Для диагностики поведения admc, хотелось бы исключить особенности реализации запросов в ui-приложении. Для этого необходимо провести анализ скорости выполнения запросов через ldapsearch к каждому из контроллеров.

Сценарий проверки:

1) Получаем список всех ldap-служб в домене:

$ host -t srv _ldap._tcp.domain.alt
_ldap._tcp.domain.alt has SRV record 0 100 389 dc0.domain.alt.
_ldap._tcp.domain.alt has SRV record 0 100 389 dc1.domain.alt.

2) Проверяем аналогичный запрос для kdc с каждого из полученных dc (не обязательно именно такой запрос, просто другой, можно разные попробовать):

$ host -t srv _kerberos._udp.domain.alt dc0.domain.alt
$ host -t srv _kerberos._udp.domain.alt dc1.domain.alt

3) Выполняем kinit (чистим кеш ключей для сервисов), проверяем через klist доступный tgt:

$ kinit
$ klist

4) Пробуем разные ldap-запросы к разным КД, наблюдаем за поведением (наличием задержек):

$ ldapsearch -LL -Y GSSAPI -H ldap://dc0.domain.alt -b "dc=domain,dc=alt" "objectClass=user" sAMAccountName | grep ^sAMAccountName

$ ldapsearch -LL -Y GSSAPI -H ldap://dc1.domain.alt -b "dc=domain,dc=alt" "objectClass=user" sAMAccountName | grep ^sAMAccountName

(разумеется правим domain.alt и dc=domain,dc=alt под свой домен)

5) Смотрим через klist вновь выданный набор сервисных ключей.

$ klist
__________________

Если задержки после обновления будут выявлены, то admc из рассмотрения проблемы исключаем, проблема локализуется.

PS: А что у вас тут ожидаемого?

> [FAIL] # diag-domain-controller is_resolve_local 
> Error: the resolv.conf file does not contain the nameserver 127.0.0.1 line.
> 
> (ожидаемо, `nameserver 127.0.0.1` убирается специально)

Зачем вы это специально делаете? Оно же нужно только на реплике момент её введения в домен. В штатном режиме другой dns на резолвере контроллера домена - это риски. В случае, если dns-резолвер внешний ляжет, то КД будет неработоспособен из-за этой "интересной" настройки. Так делают, когда сеть по-особенному настраивают. Ну, и принимают на себя все соответствующие риски.
Comment 8 Artem Varaksa 2025-07-30 11:19:10 MSK
Спасибо.

Про `nameserver 127.0.0.1`:

При разворачивании Samba dc + replica (internal dns) использовался `nameserver <dc-ip>`, т. е. DNS-сервер не внешний, но вероятно такая настройка тоже неидеальна.
* Поменял на 127.0.0.1 на DC.
* Поменял на 127.0.0.1 на реплике после введения её в домен (до этого используется <dc-ip>).
* На клиентах, если строка `nameserver 127.0.0.1` имеется, продолжает удаляться, используется DNS-сервер DC.

После этого тест `diag-domain-controller is_resolve_local` проходит успешно.

Про проверки с замедлением/ADMC напишу отдельно.
Comment 9 Artem Varaksa 2025-07-30 16:13:05 MSK
Created attachment 19232 [details]
Вывод тестовых шагов

С помощью комментарий #7 разобрался, в чём именно проблема с зависанием ADMC и как её воспроизвести.

Изначально проверял на snapshot (2) виртуальных машин с [p11+387440.5], где воспроизвелась ошибка (на .6 ещё не встретился с этой ошибкой), сравнивая с (1).

После этого воспроизвёл в [p11] [p11+387440.6] [sisyphus], т. е. не является регрессом.

---

На этапе выполнения ldapsearch (шаг 4) проверка затрудняется ошибкой https://bugzilla.altlinux.org/50727, поэтому перед проверкой требуется workaround вида (и для dc, и для dc2; выполняется только на dc):

[dc]# dc_ip="$(hostname -i)" dc2_ip="<ip>" auth="administrator%пароль" realm="samba.testdomain" && \
  apt-get install -y python3-module-setproctitle && \
  dc=(${dc_ip//./ })   dc_zone="${dc[2]}.${dc[1]}.${dc[0]}.in-addr.arpa"     && \
  dc2=(${dc2_ip//./ }) dc2_zone="${dc2[2]}.${dc2[1]}.${dc2[0]}.in-addr.arpa" && \
  samba-tool dns zonecreate "$(hostname)" "$dc_zone"  -U "$auth"; \
  samba-tool dns zonecreate "$(hostname)" "$dc2_zone" -U "$auth"; \
  samba-tool dns add        "$(hostname)" "$dc_zone"   "${dc[3]}" PTR "dc.$realm"  -U "$auth"; \
  samba-tool dns add        "$(hostname)" "$dc2_zone" "${dc2[3]}" PTR "dc2.$realm" -U "$auth"; \
  samba-tool dns query      "$(hostname)" "$dc_zone"   "${dc[3]}" PTR -U "$auth"; \
  samba-tool dns query      "$(hostname)" "$dc2_zone" "${dc2[3]}" PTR -U "$auth"

(Возможно, это требуется выполнять всегда при разворачивании Samba DC?)

Примечание: ADMC, GPUI работают и без данного workaround.

---

Для проверки использовал:

# admin_password="test" r1="samba" r2="testdomain" realm="$r1.$r2" time="time -f %es\\n --" && \
  echo "# 0."   && $time kdestroy && \
  echo "# 1."   && $time host -t srv "_ldap._tcp.$realm" && \
  echo "# 2."   && $time host -t srv "_kerberos._udp.$realm" "dc.$realm" && \
  echo "# 3.1." && $time echo "$admin_password" | kinit Administrator && \
  echo "# 3.2." && $time klist && \
  echo "# 4."   && $time ldapsearch -LL -Y GSSAPI -H "ldap://dc.$realm" -b "dc=$r1,dc=$r2" "objectClass=user" sAMAccountName | grep ^sAMAccountName && \
  echo "# 5."   && $time klist

Прикрепляю вывод, кратко результаты такие:
* На шаге 1 выводится только основной DC, а не 2; не уверен в причине этого.
* Когда ошибка воспроизводится, шаг 4 выполняется на ~3s дольше.
* Но основная проблема, похоже, на шаге 2 (см. подробнее ниже).

Где ошибка не воспроизводится, там до успешного завершения запроса `connection refused` к ipv6-адресу, занимает 0.02s:

> # 2.
> ;; communications error to <dc-ipv6>#53: connection refused
> ;; communications error to <dc-ipv6>#53: connection refused
> Using domain server:
> Name: dc.samba.testdomain
> Address: <dc-ipv4>#53
> Aliases:
>
> _kerberos._udp.samba.testdomain has SRV record 0 100 88 dc.samba.testdomain.
> 0.02s

А где воспроизводится, там `timed out`, занимает 10.02s (зависает именно до достижения timeout):

> # 2.
> ;; communications error to <dc-ipv6>#53: timed out
> ;; communications error to <dc-ipv6>#53: timed out
> Using domain server:
> Name: dc.samba.testdomain
> Address: <dc-ipv4>#53
> Aliases:
>
> _kerberos._udp.samba.testdomain has SRV record 0 100 88 dc.samba.testdomain.
> 10.02s

---

В `/etc/resolv.conf` клиента нет IPv6-адресов, поэтому сначала не понял, откуда клиент узнаёт IPv6-адрес DC.

Но с помощью `tshark` увидел, что `host` сначала спрашивает у DNS (в данном случае DC) IPv6-адрес (AAAA) `dc.samba.testdomain`, а потом уже по полученному адресу выполняет запрос `_kerberos._udp.samba.testdomain`:

> # tshark -f 'udp port 53'
> Running as user "root" and group "root". This could be dangerous.
> Capturing on 'ens19'
> ^Z
> [1]+  Остановлен    tshark -f 'udp port 53'

> # host -6 -t srv _kerberos._udp.samba.testdomain dc.samba.testdomain
> ;; communications error to 2a0c:88c0:2:2000:6465:c1ff:fe5f:fd9e#53: connection refused
> ;; communications error to 2a0c:88c0:2:2000:6465:c1ff:fe5f:fd9e#53: connection refused
> ;; no servers could be reached

> # fg
> tshark -f 'udp port 53'
>     1 0.000000000 <client-ipv4> → <dc-ipv4> DNS 79 Standard query 0xc22c AAAA dc.samba.testdomain
>     2 0.001058139 <dc-ipv4> → <client-ipv4> DNS 154 Standard query response 0xc22c AAAA dc.samba.testdomain AAAA <dc-ipv6> SOA dc.samba.testdomain
>     3 0.002631309 <client-ipv6> → <dc-ipv6> DNS 111 Standard query 0xab32 SRV _kerberos._udp.samba.testdomain
>     4 0.004063574 <client-ipv6> → <dc-ipv6> DNS 111 Standard query 0xab32 SRV _kerberos._udp.samba.testdomain

---

Далее, посмотрев `ip -c a`, увидел, что, когда воспроизводится ошибка, на DC нет IPv6-адреса (вообще).

Причина этого в том, что при проверке https://bugzilla.altlinux.org/51190 по шагам https://bugzilla.altlinux.org/show_bug.cgi?id=51190#c1 отключается IPv6 на DC:

# echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf && \
    sysctl -f

Похоже, это не столько необходимо, сколько сделано для упрощения проверки, чтобы не создавать ещё файл для IPv6-адреса DC. Улучшу эту проверку, чтобы не требовалось отключать IPv6.

После удаления строки `net.ipv6.conf.all.disable_ipv6 = 1` из `/etc/sysctl.conf` и выполнения `# reboot` проблема решается.

---

То, что когда ошибка не воспроизводится, к IPv6 DC `connection refused` - ожидаемо из-за настройки в `/etc/samba/smb.conf` на DC, которая делается для обхода ошибки https://bugzilla.altlinux.org/43863:

>    interfaces = <dc-ipv4> 127.0.0.1
>    bind interfaces only = yes

---

Остаются вопросы: должно ли быть такое замедление и корректно ли поведение Samba Internal DNS?

* Команда `host`, думаю, работает сама по себе корректно, предпочитая IPv6.
** Возможно ли как-то обойти эту проблему в ADMC? `host` поддерживает опцию `-4`, хотя использовать её всегда, думаю, не будет правильным.

* Однако корректно ли, что встроенный DNS Samba DC отдаёт в ответ на запрос AAAA свой IPv6-адрес, если он на нём не слушает (исходя из interfaces + bind interfaces only)?

* Более того, корректно ли, что такой ответ присутствует, даже если у Samba DC вообще нет IPv6-адреса в данный момент (IPv6 отключён через sysctl)?
** Возникает также дополнительный вопрос, что произойдёт, если IPv6-адрес DC поменяется - будет ли отдаваться старый?
Comment 10 Artem Varaksa 2025-11-05 17:43:37 MSK
> * Однако корректно ли, что встроенный DNS Samba DC отдаёт в ответ на запрос AAAA свой IPv6-адрес, если он на нём не слушает (исходя из interfaces + bind interfaces only)?

Стоит отметить, что при использовании BIND9_DLZ (замечено на samba-dc-4.21.9-alt1.x86_64, bind-9.18.39-alt1.x86_64) такого не происходит. Если Samba DC не настроен слушать на IPv6, IPv6-адрес не отдаётся в ответе.

Т. е. такое поведение именно у Internal DNS.