Bug 26469 - notifier startet nicht wenn ipv6.disable=1
notifier startet nicht wenn ipv6.disable=1
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: Notifier (univention-directory-notifier)
UCS 3.0
Other Linux
: P5 normal (vote)
: UCS 3.0-2
Assigned To: Jürgen Kahrs
Arvid Requate
: interim-3
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2012-03-13 09:49 CET by Janis Meybohm
Modified: 2012-07-20 15:25 CEST (History)
4 users (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional): IPv6
Max CVSS v3 score:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Janis Meybohm univentionstaff 2012-03-13 09:49:50 CET
UCS 3.0-1

Wird IPv6 im Kernel deaktiviert, startet der Notifier nicht mehr:
---
socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = -1 EAFNOSUPPORT (Address family not supported by protocol)
setsockopt(-1, SOL_SOCKET, SO_REUSEADDR, [1], 4) = -1 EBADF (Bad file descriptor)
bind(-1, {sa_family=AF_INET6, sin6_port=htons(6669), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=134537494}, 28) = -1 EBADF (Bad file descriptor)
dup(2)                                  = 4
fcntl64(4, F_GETFL)                     = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat64(4, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76ed000
_llseek(4, 0, 0xbf945548, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
write(4, "bind: Bad file descriptor\n", 26bind: Bad file descriptor
) = 26
close(4)
---
Comment 1 Sönke Schwardt-Krummrich univentionstaff 2012-03-13 09:55:43 CET
Das betrifft auch UCS 3.0-0. Der Listener macht jetzt explizit einen IPv6-TCP-Socket auf, über den auch die IPv4-Verbindungen behandelt werden. Ist IPv6 komplett deaktiviert, kann er den Socket nicht mehr aufbauen.

Workaround: sämtlichen IPv6-Traffic via Firewall verbieten und IPv6 im Kernel aktiviert lassen.
Comment 2 Janis Meybohm univentionstaff 2012-03-13 10:46:03 CET
Ungetesteter Workaround:

cat - >/etc/security/packetfilter.d/99_disable_ipv6_traffic.sh <<__EOF__
#!/bin/sh
/sbin/ip6tables -F
/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP
__EOF__

chmod +x /etc/security/packetfilter.d/99_disable_ipv6_traffic.sh
/etc/init.d/univention-firewall restart
Comment 3 Janis Meybohm univentionstaff 2012-03-13 11:04:19 CET
(In reply to comment #2)
> Ungetesteter Workaround:

cat - >/etc/security/packetfilter.d/99_disable_ipv6_traffic.sh <<__EOF__
#!/bin/sh
/sbin/ip6tables -F
/sbin/ip6tables -P INPUT -i eth* DROP
/sbin/ip6tables -P OUTPUT -o eth* DROP
/sbin/ip6tables -P FORWARD DROP
__EOF__

chmod +x /etc/security/packetfilter.d/99_disable_ipv6_traffic.sh
/etc/init.d/univention-firewall restart
Comment 4 Tobias Scherer univentionstaff 2012-05-31 14:31:25 CEST
erneut aufgetreten an Ticket#: 2012052921002525
Comment 5 Jürgen Kahrs univentionstaff 2012-06-08 14:57:01 CEST
Es geht in diesem Bug (wie von Janis berichtet) um den /usr/sbin/univention-directory-notifier, nicht um den Listener.

Wir reproduziere ich den bug ?
  ucr set grub/append=ipv6.disable=1
  cat /boot/grub/menu.lst       # nur zur Kontrolle
  reboot
  strace /usr/sbin/univention-directory-notifier -o -d 1 -F

Nun sieht man genau die Meldung EAFNOSUPPORT, die Janis oben berichtet hat.
Comment 6 Jürgen Kahrs univentionstaff 2012-06-08 15:52:33 CEST
Der Notifier kann nicht starten, wenn ipv6 abgeschaltet ist. Der Listener kann starten. Die Ursache ergibt sich vermutlich aus dem Vergleich der beinden Quellkode-Dateien:
  ucs/management/univention-directory-notifier/src/network.c
  ucs/management/univention-directory-listener/src/network.c

Der Listener lässt sich durch ucr steuern, wenn er den socket öffnet.

        /* limit address resolution to IPv4 XOR IPv6 */
        ucrvalue = univention_config_get_string("listener/network/protocol");
        if (ucrvalue) {
            if (!strcmp(ucrvalue, "ipv4")) {
                    hints.ai_family = AF_INET;
                } else if (!strcmp(ucrvalue, "ipv6")) {
                    hints.ai_family = AF_INET6;
                }
        }

Im Notifier fehlt sowas, der Notifier will unbedingt einen ipv6-socket öffen.

        server_socketfd = socket(PF_INET6, SOCK_STREAM, 0);

        i=1;
        setsockopt(server_socketfd,SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));

        server_address.sin6_family = AF_INET6;
        server_address.sin6_addr = in6addr_any;;
        server_address.sin6_port = htons(port);

        if( (bind(server_socketfd,(struct sockaddr*)&server_address,sizeof(server_address))) == -1) {
                perror("bind");
                univention_debug(UV_DEBUG_TRANSFILE, UV_DEBUG_ERROR, "bind failed, exit");
                exit(1);
        }

Also muss im Notifier eine Fallunterscheidung analog zum Listener nachgerüstet werden.

Ist das richtig so Stefan ?
Comment 7 Jürgen Kahrs univentionstaff 2012-06-11 08:48:47 CEST
(In reply to comment #5)

Wenn man den Bug ohne strace reproduzieren will, dann geht das durch einfachen restart des service. Während der listener das kann, bricht der notifier seinen restart mit Fehlermeldung ab:

/etc/init.d/univention-directory-listener restart
Restarting univention-directory-listener daemon.
ok: run: univention-directory-listener: (pid 3763) 0s, normally down
done.

/etc/init.d/univention-directory-notifier restart
Restarting univention-directory-notifier daemon: .
timeout: finish: univention-directory-notifier: (pid 3741) 18s, normally down
failed.
Comment 8 Jürgen Kahrs univentionstaff 2012-06-11 11:56:17 CEST
(In reply to comment #7)

Das Testen durch restart des notifier ist doch nicht so einfach wie es zunächst scheint. Es gibt scheinbar Probleme mit alten Prozessen, die noch laufen und das Testergebnis kaputt machen. Deshalb sollte der notifier besser explizit mit "stop" herunter und mit "start" wieder hoch gefahren werden und zwischendurch sollte man 1 Minute warten.
Comment 9 Jürgen Kahrs univentionstaff 2012-06-11 12:45:46 CEST
Nach Absprache mit Stefan habe ich den notifier so geändert, dass er wie bisher erst mal einen IPv6 socket zu öffnen versucht. Falls das nicht klappt, versucht er nun neuerdings, ob sich ein IPv4 socket öffnen lässt. Diese Logik ist unabhängig von den ucr-Variablen, die bezüglich IPv6 für den listener existieren.

Ich habe das neu gebaute Paket auf einer VM getestet. Beim Testen mit strace sieht man das geänderte Verhalten sofort.

Im changelog des Handbuchs habe ich diese Änderung eingetragen.
Comment 10 Arvid Requate univentionstaff 2012-07-12 17:52:36 CEST
Verified:
 * Code Review: OK
 * Funktion OK (strace, notifier_id wird hiochgezählt, Änderung im listener.log)
 * Changelog OK
Comment 11 Stefan Gohmann univentionstaff 2012-07-20 15:25:04 CEST
UCS 3.0-2 has been released: 
  http://forum.univention.de/viewtopic.php?f=54&t=1905

If this error occurs again, please use "Clone This Bug".