Debian und die /etc/network/interfaces

Ach ja, Debian...

Seit einiger Zeit hat ifupdown die Möglichkeit, nicht alle Netzwerk-Interfaces in /etc/network/interfaces zu pflegen, sondern diese z.B. in /etc/network/interfaces.d/ als kurze Dateien abzulegen. Gerade wenn man mal 10 VLANs und dazu jeweils eine Bridge hat (ja, ein Virtualisierungsserver), macht das die Sache IMHO deutlich übersichtlicher.

Wenn ich mich richtig erinnere, dann gab es zuerst die Möglichkeit per source /etc/network/interfaces.d/* einzelne Dateien bzw. Wildcards einzulesen. Später kam dann noch ein source-directory /etc/network/interfaces.d/ dazu.

Leider hat man es von Anfang an versäumt, statt nur "*" ein Suffix für die Schnippsel zu definieren, also z.B. source /etc/network/interfaces.d/*.iface - somit wird auch bei einem frisch installiertem Debian/Buster alles gelesen, was in diesem Verzeichnis liegt.

Das führt jetzt zu der dämlichen Situation, dass der Editor (der hoffentlich automatisch Backup-Files anlegt), nachdem man statt DHCP eine feste IP-Adresse eingetragen hat, folgendes hinterlässt:

root@buster:/etc/network/interfaces.d# ls
eth0.cfg  eth0.cfg~

Und was macht ein ifup eth0 draus? Das da:

root@buster:/etc/network/interfaces.d# ip a ls dev eth0
2: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:ac:16:f0:00:bb brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.10.10/28 brd 10.10.10.15 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.22.240.100/24 brd 172.22.240.255 scope global dynamic eth0
       valid_lft 3086sec preferred_lft 3086sec
    inet6 fe80::fcac:16ff:fef0:bb/64 scope link
       valid_lft forever preferred_lft forever

Die Lösung? Eigentlich GANZ einfach. Es gäbe ja sogar zwei...

  1. Entweder man definiert ein Suffix (z.B. *.iface, siehe oben) und macht dann source /etc/network/interfaces.d/*.iface, ignoriert also alles andere.
  2. Man stellt (zumindest bei Neuinstallationen) auf source-directory /etc/network/interfaces.d/ um, welches nur folgende RegExp zulässt: ^[a-zA-Z0-9_-]+$

Ich bin ein Freund von Zweiterem, deswegen stell ich das auch mit meiner Ansible-Grundinstallation um.

Gestern allerdings fiel mir das auf die Füße. Nach einem Reboot kam der vServer nicht mehr hoch. Warum? Darum:

root@buster:/etc/network/interfaces.d# ls
50-cloud-init.cfg

In der RegExp für source-directory ist kein Punkt dabei! Daher werden Dateien mit einem Suffix nicht gelesen. Darüber lässt sich jetzt auch streiten, ob das sinnvoll ist, klar. An anderer Stelle ist das aber (im Debian-System, z.B. Cron-Scripte, die per run-parts aufgerufen werden) dann auch wieder so, es zieht sich also durch. Ich fände es als Default immer noch besser, als Backup-Dateien (welche auf "~" enden) wie Schnippsel zu behandeln und sie einzulesen.

An anderer Stelle hat man gelernt: War es bei Apache 2 in Debian möglich, im Verzeichnis /etc/apache2/sites-enabled/ beliebige Dateinamen abzulegen, werden inzwischen nur noch Schnippsel mit der Endung "*.conf" inkludiert.

Fazit:
Durch eine unbedachte Default-Einstellung bei der Einführung eines eigentlich SEHR coolen Features (source mit "*" als Wildcard), hat man Probleme in der Zukunft vorprogrammiert.