Bug 41408 (pve-common)

Summary: /usr/bin/pvecm updatecerts не работает если есть ipv6 link-local адреса
Product: Branch p10 Reporter: Anton Shevtsov <shevtsov.anton>
Component: pve-commonAssignee: qa-team <qa-team>
Status: CLOSED FIXED QA Contact: qa-p10 <qa-p10>
Severity: normal    
Priority: P5 CC: afonin.pb, andy, shaba
Version: не указана   
Hardware: x86_64   
OS: Linux   

Description Anton Shevtsov 2021-11-22 14:29:28 MSK
столкнулся с тем, что не стартует pve.
пошел смотреть и выяснил, что у /lib/systemd/system/pveproxy.service
есть ExecStartPre=-/usr/bin/pvecm updatecerts 
который падает, если на интерфейсе есть ipv6

падает вот так
/usr/bin/pvecm updatecerts
(re)generate node files
Error Loading request extension section v3_req
140516354099008:error:220A4076:X509 V3 routines:a2i_GENERAL_NAME:bad ip address:crypto/x509v3/v3_alt.c:478:value=fe80::3a68:ddff:fe5b:d900%eno1
140516354099008:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:crypto/x509v3/v3_conf.c:47:name=subjectAltName, value=IP:127.0.0.1,IP:::1,DNS:localhost,IP:fe80::3a68:ddff:fe5b:d900%eno1,DNS:host-pve
unable to generate pve certificate request:
command 'openssl req -batch -new -config /tmp/pvesslconf-6224.tmp -key /etc/pve/nodes/host-pve/pve-ssl.key -out /tmp/pvecertreq-6224.tmp' failed: exit code 1

отключил ipv6  echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
сразу все заработало.
Comment 1 Andrew Vasilyev 2021-11-22 15:21:43 MSK
  А в /etc/hosts что-то про адрес fe80::3a68:ddff:fe5b:d900 есть?
Comment 2 Anton Shevtsov 2021-11-22 15:55:34 MSK
(Ответ для Andrew Vasilyev на комментарий #1)
>   А в /etc/hosts что-то про адрес fe80::3a68:ddff:fe5b:d900 есть?

нет

[root@host-pve ~]# cat /etc/hosts
127.0.0.1       localhost.localdomain localhost
Comment 3 Alexey Shabalin 2021-11-22 16:36:59 MSK
Покажите /etc/nsswitch.conf
Comment 4 Alexey Shabalin 2021-11-22 16:42:19 MSK
А вообще это не баг, и не связано с ipv6. Как только хост будет резолвиться нормально (DNS или hosts), так и сертификаты сгенерируются успешно.
В документации этот момент описан.
Comment 5 AF 2024-05-30 00:36:44 MSK
(Ответ для Alexey Shabalin на комментарий #4)
> А вообще это не баг, и не связано с ipv6. Как только хост будет резолвиться
> нормально (DNS или hosts), так и сертификаты сгенерируются успешно.
> В документации этот момент описан.

Сегодня, впервые устанавливая для теста вашу систему виртуализации (10.2 версия, самые дефолтные настройки), столкнулся с подобной проблемой и решил ее правкой perl кода

Эта проблема связана с ipv6 link-local адресами. А именно: функция perl Socket::getaddrinfo (с которой и берутся адреса в случае, если ip ноды не были установлены) выдает массив служебных данных с ip адресами. Все корректно, когда адреса IPv4 (любые) или IPv6, но НЕ link-local. К IPv6 link-local в конце добавляется префикс в виде имени интерфейса, к которому привязан этот адрес. Например, как в случае ТС-а это %eno1. В самой функции PVE::Network::get_ip_from_hostname идет отброс только по localhost адресам и забирается первый полученный адрес. А по порядку они в массиве: 1 - localhost (добавляется, только если вообще нет других адресов), 2 - IPv6 link-local,  3 - IPv6, и только в конце IPv4. Соответственно, функция захватывает первый link-local адрес с префиксом и затем функция PVE::Cluster::Setup::gen_pve_ssl_cert пытается через openssl создать самоподписанный SSL сертификат сервера, вписав этот "неправильный" адрес в расширение Subject Alternative Name: IP, что и вызывает ошибку.

Т.к. эта ошибка может возникнуть сразу же после установки Alt Server-V, это делает невозможным дальнейшее (пере)конфигурирование Proxmox VE
Самое простое решение - добавить в regex-проверку отброску по знаку процент '%', что я и сделал:  

/usr/share/perl5/PVE/Network.pm:
813:  if ($ip !~ m/^127\.|^::1$|%/) {
Comment 6 Repository Robot 2024-05-30 19:50:04 MSK
pve-common-8.1.2-alt1 -> sisyphus:

 Thu May 30 2024 Andrew A. Vasilyev <andy@altlinux> 8.1.2-alt1
 - 8.1.2
 - fix for pvecm updatecerts to work with IPv6 link-local addrs (ALT #41408)