Univention Bugzilla – Bug 26469
notifier startet nicht wenn ipv6.disable=1
Last modified: 2012-07-20 15:25:04 CEST
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) ---
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.
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
(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
erneut aufgetreten an Ticket#: 2012052921002525
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.
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 ?
(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.
(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.
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.
Verified: * Code Review: OK * Funktion OK (strace, notifier_id wird hiochgezählt, Änderung im listener.log) * Changelog OK
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".