[[Vorlage(Getestet, focal,)]] [[Vorlage(fortgeschritten)]] {{{#!vorlage Wissen [:Editor: Einen Editor öffnen] [:sudo: Root-Rechte erlangen] [:Pakete_installieren: Installation von Programmen] optional [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(3)]] Dieser Artikel beschreibt die Datei '''/etc/network/interfaces''', die Konfigurationsdatei für den Debian ifupdown-Mechanismus. {{{#!vorlage Hinweis Ab Version 17.10 verwendet Ubuntu ifupdown nicht mehr, sondern * bei einer Server-Installation [:systemd/networkd:systemd-networkd], * bei einer Desktop-Installation [:NetworkManager:NetworkManager]. In beiden Fällen wird der Netzwerk-Konfigurator über [:Netplan:] gesteuert. Man kann das Netzwerk bei Ubuntu-Systemen ab 18.04 immer noch mit ifupdown konfigurieren, wenn man wie im Artikel [:Netplan/Deaktivieren:„Netplan deaktivieren“] beschrieben vorgeht. }}} = Installation = 1. Das Paket '''ifupdown''' muss installiert werden[1]: \\ {{{#!vorlage Paketinstallation ifupdown }}} 1. Man kontrolliere, ob die systemd-Unit '''networking.service''' aktiviert wurde (enabled) bzw. aktiviere diese. 1. systemd-networkd sollte beim Hochlauf nicht gestartet werden. 1. Die Datei '''/etc/network/interfaces''' gemäß den eigenen Anforderungen bearbeiten. Insbsondere muss man die Netzwerk-Konfiguration aus den Netplan-Dateien hier umformuliert hinterlegen. Ubuntu-Desktops verwenden in einer Standard-Installation zur Konfiguration der Netzwerk-Schnittstellen den NetworkManager. In diesem Artikel werden auch mögliche Wechselwirkungen zwischen '''/etc/network/interfaces''' und NetworkManager beschrieben. Bei Verwendung einer anderen Netzwerk-Management-Software, z.B. [:NetworkManager:NetworkManager] (NM) oder [:systemd/networkd:systemd-networkd], sollte von einer Bearbeitung der '''/etc/network/interfaces''' abgesehen werden. Diese Programme verwenden eigene Konfigurationsdateien, weshalb die Bearbeitung der Datei '''/etc/network/interfaces''' zur Konfiguration von Netzwerk-Verbindungen nicht sinnvoll ist. Es ist jedoch möglich, eine Konfiguration zu erstellen, die den „klassischen Weg“ und bei Bedarf die Verwendung des NetworkManagers erlaubt. Siehe hierzu [#NetworkManager-deaktivieren NetworkManager deaktivieren] und [#Aufbau Aufbau]. Die beiden Methoden verwenden gegensätzliche Strategien: * '''ifupdown''' macht genau das, was man ihm über die Datei '''/etc/network/interfaces''' erlaubt. * NetworkManager macht, was ihm sinnvoll erscheint und man ihm nicht explizit verbietet. Die Wahl zwischen einer Konfiguration über '''/etc/network/interfaces''' oder NetworkManager kann für jede Netzwerk-Schnittstelle separat getroffen werden. Dem NetworkManager muss unbedingt mitgeteilt werden, um welche Schnittstellen er sich __nicht__ kümmern darf, da eine unklare Zuständigkeitsverteilung in der Regel zu gar nicht oder nicht zufriedenstellend funktionierendem Netzwerk führt. Siehe hierzu: [#NetworkManager-deaktivieren NetworkManager deaktivieren] Die in der Datei '''/etc/network/interfaces''' hinterlegten Konfigurationen werden mit dem Programm `ifup` aktiviert („Schnittstelle starten“) bzw. mit dem Programm `ifdown` deaktiviert („Schnittstelle stoppen“). Siehe hierzu die Abschnitte: [#Anwendung-der-Konfigurationen Anwendung der Konfigurationen] und [#Aktivierung Aktivierung] {{{#!vorlage Hinweis Im folgenden Text wird die Schreibweise `SEMANTIK` zur Kennzeichnung einer semantischen Variablen verwendet. An diesen Stellen ist unbedingt die Zeichenfolge in Großbuchstaben zu ersetzen durch die Angabe eines Namens für ein Objekt mit der geforderten Bedeutung, also beispielsweise: `SCHNITTSTELLEN-NAME` ist zu ersetzen durch den Namen einer Schnittstelle wie `eth0`. }}} = Aufbau = Die Datei '''/etc/network/interfaces''' kann in einem Editor [1] mit Root-Rechten [2] bearbeitet werden. In dieser Datei können folgende [#Schluesselworte Schlüsselworte] verwendet werden: * [#iface iface] * allow-auto (Synonym zur Spezialform auto), allow-hotplug, [#allow-Gruppenname allow-GRUPPENNAME] * [#mapping mapping] * [#source-und-source-directory source, source-directory] * [#no-auto-down no-auto-down] * [#no-scripts no-scripts] Kommentarzeilen werden mit einem Rauten-Zeichen # in der ersten Spalte eingeleitet. Zeilenend-Kommentare sind in dieser Datei nicht möglich. Leerzeilen können zur Gliederung verwendet werden. Für eine benutzbare Datei '''/etc/network/interfaces''' benötigt man nur Konfigurationsblöcke vom Typ `iface` und ggf. – nur wenn man Schnittstellen beim Rechnerstart automatisch einrichten lassen möchte – die `allow-GRUPPENNANME`-Anweisungen. Hier folgt ein Beispiel einer solchen Datei: {{{#!code # /etc/network/interfaces - Beispieldatei 1 aus wiki.ubuntuusers.de # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback iface dhcp inet dhcp iface lan inet static address 192.168.0.97/24 gateway 192.168.0.1 dns-nameservers 192.168.0.1 203.0.113.203 dns-search example.net iface enp63s0 inet manual hwaddress random # hwaddress 12:34:56:78:9a:bc up dhclient $IFACE auto enp63s0 }}} Zeilen 3 und 4: Jede interfaces-Datei beginnt traditionell mit den Einträgen für [wikipedia:Loopback:lo] (Loopback). Obwohl diese Angaben in Ubuntu 16.04 nicht mehr grundsätzlich erforderlich sind, sollte man sie nicht entfernen oder verändern. {{{#!vorlage Warnung Die Netzwerkschnittstelle lo ist elementarer Bestandteil von Linux. Fehlt diese Schnittstelle oder ist sie falsch konfiguriert, so können Programme nicht mehr untereinander kommunizieren. }}} Jeder Konfigurationsblock beginnt mit einer Zeile nach folgendem Muster: {{{ iface KONFIGURATIONS-NAME PROTOKOLL METHODE }}} Er kann ggf. zusätzliche Zeilen umfassen und endet vor einer Zeile mit einem der o.g. Schlüsselwörter. Die Beispieldatei enthält also vier Konfigurationsblöcke mit den Namen lo (nur Zeile 4), dhcp (nur Zeile 6), lan (Zeilen 8-12) und enp63s0 (Zeilen 14-17). Es ist gute Praxis, zur Verbesserung der Lesbarkeit die Folgezeilen zu einer iface-Zeile einzurücken; dies wird aber von der Software ignoriert. * Für `KONFIGURATIONS-NAME` kann eine beliebige Bezeichnung verwendet werden. Grundsätzlich kann jede Konfiguration für jede vorhandene Schnittstelle verwendet werden. Bei einer Konfiguration, die nur für eine ganz bestimmte physische Schnittstelle `SCHNITTSTELLEN-NAME` angewendet werden soll, wählt man zweckmäßigerweise als `KONFIGURATIONS-NAME` den Namen dieser Schnittstelle. [[Vorlage(Hinweis, "Exkurs: Eine Liste aller Netzwerk-Schnittstellen erhält man mit dem Befehl: `ip link`")]] * Für `PROTOKOLL` muss ein Netzwerkprotokoll ausgewählt werden, welches `ifup` beherrscht (`inet`, `inet6`, `ipx` oder `can`). Dies ist abhängig von den Geräten, mit denen kommuniziert werden soll. Außerdem muss `ifup` ein low-level-Konfigurationsprogramm zur Verfügung stehen: Für `inet` und `inet6` ist dies das auf jedem Standard-Ubuntu-System installierte Programm `ip`, für die anderen Protokolle müsste es noch installiert[3] werden. * Die zulässigen Werte für `METHODE` sind abhängig vom gewählten Wert für `PROTOKOLL`: * `inet` kennt u.a. `static` für eine statische Konfiguration, `dhcp` für eine dynamische Konfiguration via DHCP, `manual` als allgemeinste Form. * `inet6` kennt zusätzlich zu den für `inet` genannten Methoden noch `auto` für die bei IPv6 mögliche [wikipedia:IPv6#Autokonfiguration:„zustandslose Autokonfiguration“ (SLAAC)] nach RFC4862. - Weiterhin sind auch Sonderfälle wie `ppp` (für [wikipedia:Point-to-Point_Protocol: Point-to-Point-Protocol]) als `METHODE` möglich, werden in diesem Artikel jedoch nicht weiter behandelt. {{{#!vorlage Tabelle <-2 tablestyle="width: 97%;" rowclass="titel"> Protokoll +++ Netzwerkprotokoll Beschreibung +++ inet [wikipedia:Ipv4: IP Version 4] IPv4 nach IETF Standard RFC791 +++ inet6 [wikipedia:Ipv6: IP Version 6] IPv6 nach IETF Standard RFC2460 +++ ipx [wikipedia:Internetwork_Packet_Exchange: IPX/SPX] Netzwerkprotokoll von Novell +++ can [wikipedia:Controller_Area_Network: Controller Area Network] CAN-Bus, serielles Feldbus-System }}} {{{#!vorlage Hinweis Im Folgenden beschränkt sich dieser Artikel, aus Gründen der Übersichtlichkeit und Verbreitung, auf IP. }}} == Statische IP-Konfiguration (static) == Beispiel `lan`, Zeilen 8-12: Für eine statische IP-Konfiguration wählt man die Methode `static`. Eine statische IP-Konfiguration ist nötig, wenn es im lokalen Netzwerk keinen DHCP-Server gibt. Dazu muss man in der Konfiguration mindestens zwei, in der Praxis aber oft bis zu fünf Angaben machen: * `address` – Die Adresse des eigenen Rechners. Diese Angabe ist erforderlich. Bei Heimnetzen wählt man meistens eine Adresse aus dem Bereich der [wikipedia:Private_IP-Adresse:Privaten IP-Adressen], also beispielsweise aus dem Bereich `192.168.0.1` bis `192.168.0.254`. Die erste und die letzte Adressse eines IP-Netzwerks, also im Beispiel `192.168.0.0` und `192.168.0.255`, gehören zwar ebenfalls zum Netzwerk `192.168.0.0/24`, sind aber beide als „Broadcast-Adresse“ reserviert und grundsätzlich nicht als Unicast-Adressen nutzbar. Man sollte die moderne Schreibweise `192.168.0.97/24` mit Angabe der Länge des Netzwerkteils bzw. der Prefixlänge (hier /24) benutzen, da man dann keine Netzmaske angeben muss. * `netmask` – Bezeichnet die [wikipedia:Netzmaske:] des Netzwerks. Diese Angabe ist nur dann erforderlich, wenn man unter `adresse` die Prefixlänge nicht angegeben hat. Im Beispiel lautet die Netzmaske `255.255.255.0`, d.h. alle Rechner, bei denen die ersten drei Tripel (also in diesem Beispiel `192.168.0.`) der IP-Adresse identisch sind, gehören zum selben Netzwerk. Mit anderen Netzmasken sind andere Bereiche möglich, siehe hierzu [wikipedia:CIDR:Classless Internet Domain Routing] * `gateway` – Die IP des [wikipedia:Gateway_(Computer):Gateways], also im Normalfall die IP des Routers, über den man in das Internet geht, oder sich mit anderen IP-Netzwerken verbindet. Diese optionale Angabe ist funktionaler Sicht sehr oft erforderlich, weil mit dieser Angeabe die Default-Route des Systems definiert wird. * `dns-nameservers` – Optional kann man noch die Auflösung von DNS-Namen zu IP-Adressen durch Angabe von einem oder bis zu drei DNS-Server (vgl. Zeile 11) und ggf. durch Angabe von Suchdomänen (vgl. Zeile 12, `dns-search`) konfigurieren. Das hierfür erforderliche Paket '''resolvconf''' ist bei Ubuntu bereits installiert. {{{#!vorlage Warnung NetworkManager überwacht die Default-Route des Systems und wird jede fremde Änderung korrigieren; aus diesem Grund muss man bei der Einrichtung eines Gateway über '''interfaces''' den NetworkManager deaktivieren. Auch der NetworkManager benutzt '''resolvconf''' und beeinflusst darüber die Datei '''/etc/resolv.conf''' – dies kann zu unübersichtlichen Konfliktsituationen mit Störung der Namensauflösung führen. Wenn man über die Datei '''/etc/network/interfaces''' DNS-Server definieren möchte, sollte man deshalb vorher den NetworkManager deaktivieren. }}} == Dynamische IP-Konfiguration (dhcp) == Beispiel `dhcp`, Zeile 6: Für eine dynamische IP-Konfiguration wählt man die Methode `dhcp` (siehe auch [wikipedia:DHCP:]). Weitere Einträge in der '''/etc/network/interfaces''' sind für eine solche Konfiguration nicht erforderlich, aber möglich. Der DHCP-Client benutzt ebenfalls '''resolvconf''' zur Konfiguration der Namensauflösung; somit sind auch in diesem Fall Konflikte mit NetworkManager möglich! {{{#!vorlage Warnung Methode `dhcp` kann in Verbindung mit dem Schüsselwort `auto` dazu führen, dass der Rechner beim Start hängen bleibt oder erst nach einer langen Wartezeit den Startvorgang fortsetzt. Dies geschieht, wenn der DHCP-Client keine Adresse erhält. }}} == Manuelle Konfiguration (manual) == Beispiel `enp63s0`, Zeilen 14-17: Wählt man als `METHODE` `manual`, so wird `ifup` keine IP-Adresse konfigurieren, aber die Schnittstelle operativ und administrativ einschalten. Dies ist z.B. sinnvoll, wenn eine Netzwerkschnittstelle entweder keine IP-Adresse benötigt (z.B. bei Ports von bridges), oder man die Adresse selbst (z.B. durch eine Berechnung in einem Skript) festlegen will oder auch, wenn man einer Schnittstelle mehrere Adressen zuweisen möchte. Siehe Abschnitt über die [#Start-Stopp-Skripte Start/Stopp-Skripte] für weitere Beispiele. {{{#!vorlage Experten Bei den Methoden `static`, `dhcp` und `manual`, aber nicht bei `auto` kann man die [wikipedia:MAC-Adresse:MAC-Adresse] der Netzwerkkarte ändern durch Hinzufügen folgender Zeile zum iface-Konfigurationsblock: (vgl. Zeilen 14ff der Beispieldatei) [[Vorlage(Code, "hwaddress 12:34:56:78:9a:bc")]] Die hier beispielhaft genannte MAC-Adresse ist nach eigenem Bedarf anzupassen. Wichtig ist es, eine unicast-Adresse zu verwenden, d.h. der erste (ganz links stehende) Wert muss gerade (hier 12) sein. Anstelle einer konkreten Adresse kann man auch durch Angabe des Spezialwortes `random` sich eine pseudozufällige Adresse generieren lassen. }}} == Automatische Konfiguration (auto) == Dies ist nur beim Protokoll `inet6` möglich und bedeutet die automatische Konfiguration der IPv6-Addressen nach Angaben des Routers ([wikipedia:Neighbor_Discovery_Protocol#Router_Advertisement_.E2.80.93_Type_134:router advertisement]). Über Zusatzangaben kann man die Methode der Adressgenerierung beeinflussen: * EUI64 nach IETF-Standard RFC4291 * `privext 0` – Der schnittstellenspezifische Teil der Adresse (''"interface identifier"''), also die niederwertigen 64 Bit werden aus der Ethernet-Adresse abgeleitet. Beim Surfen mit einer solchen Adresse ist man leicht verfolgbar. Für Server ist in aller Regel aber eine zeitlich konstante Adresse vorteilhaft. * Privacy extensions nach IETF-Standard RFC4941 * `privext 1` – Es werden zwei global gültige Adressen erzeugt, und zwar zum ersten die zuvor beschriebene zeitlich konstante Adresse und eine zweite mit pseudozufälligem "interface identifier". Die zeitlich konstante Adresse wird bevorzugt, was diese Variante meist uninteressant macht. * `privext 2` – Es werden wie bei `privext 1` zwei Adressen erzeugt, jedoch wird die mit pseudozufälligem "interface identifier" bevorzugt. * Stable privacy nach IETF RFC7217 (seit 16.04) * ohne "stable secret": Diese Methode benutzt unter Ubuntu 16.04 der NetworkManager als Vorgabe. Bei der Konfiguration über '''interfaces''' erreicht man diesen Modus über {{{ pre-up ip link set addrgenmode none dev $IFACE }}} Solange man kein dauerhaftes "stable secret" definiert, wird bei jedem Rechnerstart ein pseudozufälliges erzeugt. Die hieraus abgeleiteten Adressen, sowohl die link-local wie die globalen, sind also – entgegen der Benennung als "stable" – höchst variabel! * mit "stable secret": Ein permanentes "stable secret" setzt man mit Root-Rechten[2] in einer Datei im Verzeichnis '''/etc/sysctl.d/''' {{{ # /etc/sysctl.d/60-ipv6-stable-secret.conf net.ipv6.conf.default.stable_secret=fd00:1:2:3:4:5:6:7 # IPv6-Adresse beliebig wählbar, sollte vertraulich bleiben! }}} oder in der Datei '''/etc/network/interfaces''' per `sysctl`: {{{ # /etc/network/interfaces iface RFC4291 inet6 auto privext 0 iface RFC4941fix inet6 auto privext 1 iface RFC4941var inet6 auto privext 2 iface RFC7217var inet6 auto privext 0 pre-up ip link set addrgenmode none dev $IFACE iface RFC7217fix inet6 auto privext 0 pre-up ip link set addrgenmode none dev $IFACE pre-up sysctl -w net.ipv6.conf.$IFACE.stable_secret=fd00:1:2:3:4:5:6:7 }}} {{{#!vorlage Hinweis * Die Methode `auto` hat nichts mit dem Schlüsselwort `auto` zu tun! * Die Methode `manual` darf nicht als Gegensatz zum Schlüsselwort `auto` aufgefasst werden! }}} = Anwendung der Konfigurationen = * Mit einer Zeile in der Datei '''/etc/network/interfaces''' der folgenden Form wird die Schnittstelle beim Bootvorgang durch den Init-Prozess gestartet, vgl. Zeilen 3 und 18 der Beispieldatei. {{{ auto SCHNITTSTELLEN-NAME }}} Für `SCHNITTSTELLEN-NAME` ist der richtige Name zu verwenden und man benötigt einen iface-Konfigurationsblock, dessen `KONFIGURATIONS-NAME` gleich lautet mit `SCHNITTSTELLEN-NAME`. * Soll eine Schnittstelle nicht beim Bootvorgang gestartet werden, so lässt man diese Zeile weg. * Jede noch nicht konfigurierte Schnittstelle (hier beispielhaft `enp7s9`) kann im laufenden Betrieb über einen Befehl nach folgendem Muster konfiguriert werden [4]: [[Vorlage(Befehl, "#sudo ifup SCHNITTSTELLEN-NAME=KONFIGURATIONS-NAME sudo ifup enp7s9=lan # verwendet Zeilen 8-12 aus Beispieldatei 1")]] [[Vorlage(Warnung, "Zu Beachten ist: Der Name der Schnittstelle `enp7s9` kommt in der Beispieldatei gar nicht vor! NetworkManager wird deshalb diese Schnittstelle als seine Aufgabe betrachten, sofern man es ihm nicht verbietet. Beachte [#NetworkManager-deaktivieren NetworkManager deaktivieren], sonst Fehlfunktion möglich!")]] * Wenn man eine Konfiguration mit dem Namen der Schnittstelle benannt hat, kann man den Start dieser Schnittstelle vereinfachten zu: [[Vorlage(Befehl, "sudo ifup enp63s0 # Kurzform von ifup enp63s0=enp63s0")]] * Zum Stoppen einer Schnittstelle verwendet man '''ifdown''': [[Vorlage(Befehl, "sudo ifdown enp63s0")]] * Man kann im laufenden Betrieb die Konfiguration jeder Schnittstelle ändern, indem man sie zuerst mit `ifdown` stoppt und dann mit anderer Konfiguration mittels `ifup` wieder startet: {{{#!vorlage Befehl sudo ifdown enp63s0 sudo ifup enp63s0=lan }}} `ifup` und `ifdown` kann man mit den zusätzlichen Optionen `--force` und `-v` aufrufen: * `ifup --force SCHNITTSTELLEN-NAME` wird die Schnittstelle konfigurieren, obwohl diese bereits durch '''ifupdown''' konfiguriert wurde. * `ifdown --force SCHNITTSTELLEN-NAME` wird die Schnittstelle dekonfigurieren, obwohl sie nach Meinung von '''ifupdown''' nicht konfiguriert ist. * `ifup -v SCHNITTSTELLEN-NAME` bzw. `ifdown -v SCHNITTSTELLEN-NAME` (`-v` wie verbose) berichten ausführlich, was sie machen. Die Befehle `ifup` und `ifdown` funktionieren nur bei Netzwerk-Schnittstellen mit Eintrag in '''/etc/network/interfaces'''. Bei Schnittstellen, die mit einem anderen Netzwerk-Konfigurationsprogramm verwaltet werden, sind sie unwirksam. Die vorstehenden Ausführungen reichen bereits aus, um mit der Datei '''/etc/network/interfaces''' sinnvoll arbeiten zu können. Die diesem Hinweis folgenden Informationen richten sich an fortgeschrittene und erfahrene Benutzer. = Schlüsselworte = Im Folgenden werden Schlüsselworte und ihre Verwendung erklärt: == iface == Mit dem Schlüsselwort `iface` leitet man einen Konfigurationsblock ein. Er kann ggf. zusätzliche Zeilen umfassen und endet vor einer Zeile mit einem der o.g. Schlüsselwörter. In den zusätzlichen Zeilen kann man Konstante mit symbolischem Namen und Wert vereinbaren sowie für jede Phase des Konfigurationsvorganges (`pre-up`, `post-up`, `pre-down`, `post-down`) ausführbare Kommandos hinterlegen. Man darf ausserdem `up` als Synonym für `post-up` und `down` als Synonym für `pre-down` verwenden. Die vereinbarten Konstanten und einige weitere Informationen werden als Shell-Variablen an die ausführbaren Kommandos und die Start/Stopp-Skripte übergeben; zur Erläuterung dient folgendes Beispiel: {{{ iface config1 inet dhcp const-1 Muster-ohne-Wert pre-up sysctl -w net.ipv6.conf.$IFACE.disable_ipv6=0 up ip -6 addr replace 2001:db8::1/64 dev $IFACE || true up ip -4 addr replace 192.168.255.255/32 dev $IFACE || true up ip -4 addr replace 192.168.178.22/24 dev $IFACE || true down ip addr flush dev $IFACE }}} Als ausführbare Programme sind prädestiniert: `sysctl` zur Änderung von Kernel-Variablen und `ip`, das allgemeine Dienstprogramm für Netzwerkaufgaben unter Linux. Im Grunde ist jede ausführbare Datei möglich, ausgenommen jedoch `ifup` und `ifdown`! Das Beispiel zeigt die Zuweisung mehrerer – hier insgesamt vier – IP-Adressen; eine wird beim Start mit `ifup` per DHCP bezogen und 3 weitere werden statisch über die Kommandos in den mit `up` beginnenden Zeilen definiert. Die Kernel-Variable `disable_ipv6=0` ist erforderlich, weil sonst keine IPv6-Adresse zugewiesen werden kann. Beim Stopp mit `ifdown` werden wegen der mit `down` beginnenden Zeile alle IP-Adressen von der Schnittstelle entfernt. {{{#!vorlage Hinweis Die Form `up BEFEHL || true` ist ein oft angewendetes Idiom. Es verhindert den Fehlschlag des gesamten Konfigurationsvorgangs, wenn ein einzelner Befehl fehlschlägt. }}} Bei der Aktivierung dieser Konfiguration, z.b. für eine Schnittstelle enp63s0 mittels {{{#!vorlage Befehl sudo ifup enp63s0=config1 }}} werden von '''ifup''' zunächst die Konstanten als Shell-Variablen gesetzt: {{{#!vorlage Tabelle <-3 tablestyle="width: 97%;" rowclass="titel">Shell-Variablen für Start-/Stopp-Skripte +++ Konstante Shell-Variable Wert im Beispiel +++ <>KONFIGURATIONS-NAME $LOGICAL `config1` +++ <>PROTOKOLL $ADDRFAM `inet` +++ <>METHODE $METHOD `dhcp` +++ <>SCHNITTSTELLEN-NAME $IFACE `enp63s0` +++ Phase $PHASE `pre-up`, `post-up`, `pre-down`, `post-down` (in zeitlicher Folge) +++ const-1 $IF_CONST_1 `Muster-ohne-Wert` +++ <>EIGENE KONSTANTE <-2>Bildung des Namens der Shell-Variablen: Aus dem Namen der Konstanten werden alle nicht-ASCII-Buchstaben und alle Sonderzeichen außer Binde- und Unterstrich entfernt. Kleinbuchstaben werden zu Großbuchstaben. Der Bindestrich „-“ wird zum Unterstrich „_“. „$IF_“ wird voran gestellt. }}} Es gibt noch einige weitere, hier nicht behandelte Konstanten. Anschließend werden die ausführbaren Kommandos in folgender Reihenfolge durchlaufen: {{{#!vorlage Tabelle <-3 tablestyle="width: 97%;" rowclass="titel">Reihenfolge der Befehle beim Start (ifup) einer Schnittstelle +++ Phase Aktion +++ <|2>pre-up Kommandos aus der Datei '''interfaces''', die mit `pre-up` beginnen +++ Skripte im Verzeichnis '''/etc/network/if-pre-up.d/''' +++ <|4>up interne Aktionen von `ifup` gemäß `PROTOKOLL` und `METHODE`, insbesondere: +++ stets: `/bin/ip link set dev $IFACE up 2>/dev/null || true` +++ zusätzlich bei Methode `dhcp`: DHCP-Client starten +++ zusätzlich bei Methode `static`: Setzen von IP-Adresse und Leitwegen aus den Variablen $ADDRESS und $GATEWAY +++ <|2>post-up Kommandos aus der Datei '''interfaces''', die mit `post-up` oder nur mit `up` beginnen +++ Skripte im Verzeichnis '''/etc/network/if-up.d/''' }}} {{{#!vorlage Tabelle <-3 tablestyle="width: 97%;" rowclass="titel">Reihenfolge der Befehle beim Stopp (ifdown) einer Schnittstelle +++ Phase Aktion +++ <|2>pre-down Kommandos aus der Datei '''interfaces''', die mit `pre-down` oder nur mit `down` beginnen +++ Skripte im Verzeichnis '''/etc/network/if-down.d/''' +++ <|2>down interne Aktionen von `ifdown` gemäß `PROTOKOLL` und `METHODE`, insbesondere: +++ `/bin/ip link set dev $IFACE down 2>/dev/null || true` +++ <|2>post-down Kommandos aus der Datei '''interfaces''', die mit `post-down` beginnen +++ Skripte im Verzeichnis '''/etc/network/if-post-down.d/''' }}} Beispiele zur Anwendung selbst definierter Konstanten finden sich im Abschnitt [#mapping Schlüsselwort mapping] und im Abschnitt [#Start-Stopp-Skripte Start/Stopp-Skripte]. == allow-GRUPPENNAME == Schnittstellen können mit Hilfe des Schlüsselwortes `allow-` zu Gruppen zusammengefasst werden. Im folgenden Beispiel werden die beiden Gruppen `auto` und `hotplug` definiert: {{{ auto lo allow-auto eth0 enp63s0 auto wlp3s0 allow-hotplug wlp3s0 wlan1 }}} Zur Gruppe `auto` gehören als Mitglieder die Schnittstellen lo, eth0, enp63s3 und wlp3s0; zur Gruppe `hotplug` gehören die Schnittstellen wlp3s0 und wlan1. Beim Gruppennamen `auto` gilt die Besonderheit, dass `allow-auto` und `auto` Synonyme sind. Der Gruppenname ist aus Sicht von ifupdown beliebig und haben für ifupdown selbst keinerlei Bedeutung, abgesehen dass man Konfigurationen für alle Gruppenmitglieder mit einem Befehl auslösen kann: {{{#!vorlage Befehl sudo ifup -a --allow=hotplug }}} Voraussetzung hierfür ist, dass `ifup` für jede Schnittstelle aus der Gruppe eine Konfiguration ermitteln kann. Dies erreicht man entweder, indem man als Konfigurationsname den Namen der Schnittstelle wählt oder über einen im nächsten Abschnitt beschriebenen mapping-Block. Dennoch sind insbesondere die Gruppennamen `auto` und `hotplug` wichtige Elemente in der Datei '''/etc/network/interfaces''', da * der Init-Prozess [:systemd:] `ifup -a --allow=auto` ausführt und - das für Hotplug zuständige Subsystem ('''udev''' mit '''systemd''') die Schnittstellen aus der Gruppe `hotplug` betreut und diese automatisch durch Aufruf von `ifup` konfiguriert. {{{#!vorlage Hinweis Die Bezeichnung `allow` nimmt Bezug auf folgende Semantik: * `ifup -a --allow=hotplug` bedeutet: „Ich erlaube (`allow`) die Bearbeitung aller (`-a`) Schnittstellen, sofern diese zur Gruppe `hotplug` gehören.“ * `ifup enp63s0 --allow=hardware` bedeutet: „Ich erlaube die Bearbeitung der Schnittstelle `enp63s0`, sofern diese zur Gruppe `hardware` gehört.“ }}} Zu beachten ist die inkonsistente Schreibweise! * In der Datei '''/etc/network/interfaces''' wird `allow-` mit einem Bindestrich geschrieben. * Im Terminal benutzt man beim Aufruf mit `ifup` traditionell ein Gleichheitszeichen: `ifup -a --allow=auto`. (Das Gleichheitszeichen darf man durch ein Leerzeichen ersetzen.) == mapping == Die beim Start einer Schnittstelle zu verwendende Konfiguration wird entweder explizit angegeben (`ifup SCHNITTSTELLEN-NAME=KONFIGURATIONS-NAME`) oder sie wird von ifupdown automatisch berechnet. Diese Berechnung ist durch einen mapping-Block in der Datei '''interfaces''' beeinflussbar. Falls man dort keinen mapping-Block definiert, so verwendet ifupdown effektiv als Vorgabe: {{{ # Vorgabe-Mapping von ifup: mapping * script echo # Allgemeine Struktur eines mapping-Blocks: # mapping SUCHMUSTER # script PROGRAMM # map DATEN # map … }}} Als Suchmuster kann man alles verwenden, was die Shell als solches versteht ([wikipedia_en:Glob_(programming): Shell Glob]).`SUCHMUSTER` wird mit `SCHNITTSTELLEN-NAME` verglichen; nur falls es passt, wird der mapping-Block auf diese Schnittstelle angewendet, indem das nach `script` angegebene Programm mit `SCHNITTSTELLEN-NAME` als einzigem Argument aufgerufen wird. Das Programm muss auf seine Standard-Ausgabe den für diese Schnittstelle zuständigen `KONFIGURATIONS-NAME` drucken und darf dort sonst nichts ausgeben. Beim Vorgabe-Mapping passt natürlich `*` auf jede Schnittstelle und `echo` als Programm sorgt dann dafür, dass aus dem Aufruf `ifup SCHNITTSTELLEN-NAME` effektiv `ifup SCHNITTSTELLEN-NAME=SCHNITTSTELLEN-NAME` wird. Der mapping-Block kann noch um beliebig viele mit `map` beginnende Zeilen ergänzt werden. Das für das Mapping zuständige Programm bzw. Skript kann die Angaben nach dem Wort `map` von seiner Standard-Eingabe lesen und in seiner Entscheidung berücksichtigen. Hier folgt ein etwas anspruchsvolleres Beispiel, welches viele kabelgebundene Schnittstellen mit derselben Konfiguration versorgt: {{{ mapping en* script /root/Skripte/conf-mapper map uplink enp63s0 map bridge-port iface uplink inet dhcp iface bridge-port inet manual master switch pre-up ip link add name $IF_MASTER type bridge || true pre-up ip link set dev $IF_MASTER up || true pre-up ip link set dev $IFACE master $IF_MASTER post-down ip link set dev $IFACE nomaster }}} Im Beispiel wird von den vielen physischen Schnittstellen eine (`enp63s0`) vom Router per DHCP konfiguriert, alle anderen werden zu Ports einer Bridge. Auch die Bridge als Schnittstelle wird mit dem Namen `switch` durch diese Datei automatisch erzeugt. Die Magie steckt im Skript '''conf-mapper''': {{{ #!/bin/sh -e # /root/Skripte/conf-mapper : ${1:?} while read conf pattern _ # erwarte Zeilen ' ' do case $1 in ( ${pattern:-*} ) break; esac; done echo ${conf:-$1} }}} {{{#!vorlage Hinweis Man kann hinter `script` nur einen Programm-Namen (ggf. inklusive Pfad), aber keine Verkettung von Programmen und auch kein Programm mit irgendeiner Option oder einem Parameter angeben – man muss die Logik der Konfigurationsfindung leider in ein separates Skript packen! }}} == source und source-directory == Mit Hilfe der Schlüsselworte `source` bzw. `source-directory` kann eine andere Text-Datei in die Datei '''interfaces''' eingebunden werden bzw. es können alle Dateien aus einem Verzeichnis eingebunden werden. Durch die Aufteilung ergeben sich aber keine neuen Konfigurationsmöglichkeiten. NetworkManager ist auf eine derartige Aufteilung der Datei '''/etc/network/interfaces''' nicht vorbereitet; daher wird von einer Nutzung dieser Möglichkeiten abgeraten. == no-auto-down == Eine Schnittstelle mit dieser Kennzeichnung wird beim Herunterfahren des Rechners von der Wirkung des dann ausgeführten Befehls `ifdown -a --allow=auto` ausgenommen. Dies kann bei Netzwerk-Laufwerken wichtig sein. == no-scripts == Mit `no-scripts` beginnende Zeilen listen die Schnittstellen auf, für die die Start/Stopp-Skripte in den Verzeichnissen '''/etc/network/ip-*.d/''' nicht ausgeführt werden sollen. = Anwendungsbeispiele = In diesem Abschnitt werden mehrere Punkte, die in der Praxis relevant sein können, zusammengefasst. == Roaming == Dies betrifft Rechner, die sich mit ein- und derselben Netzwerk-Schnittstelle (hier beispielhaft `eth0`) wechselweise mit unterschiedlichen Netzwerken verbinden sollen. Für jedes Netzwerk kann man eine eigene Konfiguration in der Datei '''/etc/network/interfaces''' hinterlegen. {{{ ### "auto eth0" darf nicht aktiviert sein! ### "iface eth0" darf nicht aktiviert sein! iface home inet dhcp iface work inet static address 10.51.20.42/20 }}} Hierbei wird die Netzwerkschnittstelle `eth0` beim Systemstart unkonfiguriert belassen (Keine Zeile `auto eth0`, keine Zeile `iface eth0`!). * Manuelles Roaming: Nun kann mit dem Befehl [4] [[Vorlage(Befehl, "sudo ifup eth0=work")]] die statische Konfiguration, für das Netzwerk am Arbeitsplatz, gestartet werden. Alternativ dazu ist es auch möglich, mit [[Vorlage(Befehl, "sudo ifup eth0=home")]] die dynamische Konfiguration (z.B. für das Netzwerk zu Hause) zu starten. * Ein Wechsel zwischen den Konfigurationen, sofern gleichzeitig mehrere Netze grundsätzlich verfügbar sind, erfolgt nach dem Muster: (Hier beispielhaft: work --> home) {{{#!vorlage Befehl #sudo ifdown SCHNITTSTELLEN-NAME sudo ifdown eth0 #sudo ifup SCHNITTSTELLEN-NAME=NEUER_KONFIGURATIONS-NAME sudo ifup eth0=home }}} * Automatisches Roaming ermöglicht z.B. ein [#mapping mapping-Block]. == Mehrere IP-Adressen == Möglichkeiten, einer Schnittstelle gleichzeitig mehr als eine IP-Adresse zuzuweisen: * Adressen durch Aufruf des Programmes `ip` in mehreren mit `up` beginnenden Optionszeilen konfigurieren, siehe Beispiel beim [#iface Schlüsselwort iface]. * Mehrere iface-Zeilen mit demselben Konfigurations-Namen in Kombination mit mehreren Optionen `address` verwenden, zum Beispiel: {{{ iface multi-addr inet static address 192.0.2.44/24 iface multi-addr inet6 static address 2001:db8:dead:beef::197/64 iface multi-addr inet static address 192.168.255.254/30 }}} * Zur physischen Schnittstelle (hier beispielhaft `eth0`) sogenannte virtuelle Schnittstellen definieren: Dieses Verfahren ist veraltet, bietet aber den Vorteil gegenüber den vorgenannten Verfahren, dass man hier für jede Adresse einen eigenen symbolischen Namen erhält. Die virtuellen Schnittstellen müssen mit einem Doppelpunkt und Folgenummer (hier beispielhaft `eth0:1`) notiert werden: {{{ iface eth0 inet static address 192.0.2.254/24 iface eth0:1 inet static address 198.51.100.1/24 auto eth0 eth0:1 }}} Eine solche Konfiguration könnte man für einen Server verwenden, der gleichzeitig auf mehreren IP-Adressen unterschiedliche Dienste bereitstellt, z.B. auf `192.0.2.254` einen Webserver und auf `198.51.100.1` einen E-Mail-Server. `iptables` ist in der Lage, die Schnittstellen über die Namen voneinander zu unterscheiden und ermöglicht damit dienst-spezifische Filtersätze. Für die physische Schnittstelle `eth0` wäre auch eine dynamische Konfiguration per DHCP denkbar. Die virtuellen Schnittstellen können nur statische Konfigurationen erhalten und keine andere Rahmenlänge als die physikalische Schnittstelle haben. * Eine weitere Möglichkeit zur Konfiguration mehrerer IP-Adressen bietet das im Abschnitt [#Start/Stopp-Skripte Start/Stopp-Skripte] erläuterte Beispiel. == Bündeln von Netzwerkschnittstellen == Zur Erhöhung der Bandbreite kann man mehrere physische Schnittstellen bündeln und dies auch über die Datei '''/etc/network/interfaces''' konfigurieren, siehe hierzu: [:Netzwerkkarten_bündeln:] == Netzwerkbrücke == Siehe [:Netzwerkbrücke:] zum Verbinden mehrerer Netzwerke oder auch das [#mapping Beispiel beim Schlüsselwort mapping]. == WLAN-Konfiguration == Die Einrichtung von Funknetzwerken erfolgt über das Programm [:WLAN/wpa_supplicant:wpa_supplicant], welches auch vom NetworkManager verwendet wird und auch direkt über die Datei '''/etc/network/interfaces''' aufgerufen werden kann. `wpa_supplicant` arbeitet mit dem Treiber der WLAN-Interface-Hardware zusammen und kümmert sich selber nur um die Bereitstellung des Netzwerkmediums (layer 2), nicht um die IP-Konfiguration (layer 3). Die IP-Konfiguration erfolgt über Angaben in der Datei '''/etc/network/interfaces'''; dabei muss der Name der Konfiguration mit dem Namen der Schnittstelle übereinstimmen: * Grundschema einer '''interfaces''' für ein einziges WLAN (managed-mode von `wpa_supplicant`): {{{ iface wlan0 inet dhcp wpa-conf /root/wpa_supplicant.conf auto wlan0 }}} Man gibt einfach über die Konstante `wpa-conf` dem Skript von `wpa_supplicant` den (grundsätzlich beliebigen, sofern beim Rechnerstart erreichbaren) Speicherort einer Konfigurationsdatei für ein einzelnes WLAN an. Diese Konfigurationsdatei muss man natürlich gemäß dem [:WLAN/wpa_supplicant:Wiki-Artikel für wpa_supplicant] mit Inhalt füllen. * mehrere WLAN (roaming-mode von `wpa_supplicant`) {{{ iface wlan1 inet manual wpa-roam /root/wpa_supplicant_multi.conf auto wlan1 iface default inet6 auto iface default inet dhcp }}} Die Konfigurationsdatei '''wpa_supplicant_multi.conf''' enthält die Daten (SSID, Passwort, etc.) für mehrere Netzwerke. Die Netzwerke kann man in dieser Datei mit einem eigenen ID-String (id_str) kennzeichnen; `wpa_supplicant` startet dann `/sbin/ip -v --force $IFACE=ID-STR-WERT`. Andernfalls verwendet `wpa_supplicant` den Wert `default` als `id_str` und startet `/sbin/ip -v --force $IFACE=default`. Die iface-Konfigurationen mit dem jeweiligen, dem `id_str` entsprechendem Namen müssen in der Datei '''interfaces''' existieren. Der [:WLAN/wpa_supplicant:Wiki-Artikel für wpa_supplicant] enthält weitere Angaben. Die Konstante `wpa-roam` funktioniert nur in einer iface-Konfiguration mit der Methode `manual`. * Bei der Verwendung von `wpa_supplicant` ist es ebenfalls möglich, die gesamte Konfiguration in der '''/etc/network/interfaces''' zu hinterlegen. Hierzu werden die Optionen, die üblicherweise in die '''wpa_supplicant.conf''' eingetragen werden, mit einem vorangestelltem `wpa-` eingetragen. [[Vorlage(Warnung, "Von dieser Vorgehensweise wird abgeraten, weil dann die WLAN-Passworte für jeden lesbar in der (traditionell world-readable!) Datei '''/etc/network/interfaces''' stehen.")]] {{{#!vorlage Hinweis Zur Nutzung von `wpa_supplicant` muss manchmal noch ein „Treiber“ (driver) gewählt werden. Hiermit ist nicht das Kernel-Modul für die Hardware der WLAN-Schnittstelle gemeint, sondern die „Sprache“, die `wpa_supplicant` zur Kommunikation mit diesem Hardware-Treiber und dem Kernel verwendet. `wpa_supplicant` kennt die in folgender Tabelle genannten Treiber. Wird kein Treiber angegeben, wird das Start/Stopp-Skript von `wpa_supplicant` automatisch den NETLINK-Treiber `nl80211` und den generischen Treiber `wext` (in dieser Reihenfolge) aussuchen. Das funktioniert bei vielen Karten sehr gut (und ist auch empfohlen). Wenn es mit dieser Standardeinstellung nicht funktioniert, kann man einen in der Tabelle genannten Treiber mittels der Konstante `wpa-driver` explizit angeben oder `wpa_supplicant` selbst aus den Quellen übersetzen: {{{ iface wlan4 inet dhcp wpa-driver wext wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf \}}} }}} {{{#!vorlage Tabelle <-2 tablestyle="width: 97%;" rowclass="titel">Software-Schnittstellen (driver) von wpa_supplicant +++ Treiber Beschreibung +++ nl80211 Linux nl80211/cfg80211 +++ wext Linux wireless extensions (generic) +++ wired wired Ethernet driver +++ none no driver (RADIUS server/WPS ER) +++ (weitere) erfordert Kompilierung von wpa_supplicant aus den Quellen }}} == VPN == Es gibt sehr viele Verfahren für VPN. Gemeinsam ist allen der Aufbau einer [wikipedia:Tunnel_(Rechnernetz):getunnelten Verbindung] über eine gesonderte Netzwerk-Schnittstelle und eine Änderung der Default-Route. Meistens will man den getunnelten Verkehr auch verschlüsseln. Wegen der Vielfalt der Verfahren ist hier nur ein allgemeiner Überblick zur Konfiguration über '''interfaces''' möglich. {{{#!vorlage Warnung Bei der Konfiguration eines VPN über die Datei '''/etc/network/interfaces''' darf NetworkManager auf keinen Fall parallel mitlaufen! NetworkManager überwacht die Default-Route des Systems und wird jede fremde Änderung korrigieren; aus diesem Grund wird eine VPN-Einrichtung über '''interfaces''' bei aktivem NetworkManager höchstens fehlerhaft funktionieren. }}} Grundschema: {{{ iface VPN inet manual # pre-up ip link add dev CHNITTSTELLEN-NAME type SCHNITTSTELLEN-TYP up down # post-down ip link del dev SCHNITTSTELLEN-NAME }}} Die Befehle zum Auf- und Abbau des VPN sind spezifisch für die ausgewählte VPN-Technik und enthalten auch die benötigten Optionen und Angaben zu Konfigurationsdateien. Meistens übernehmen diese Befehle auch die Aufgabe der vorherigen Erzeugung und nachträglichen Vernichtung der Tunnel-Schnittstelle, so dass die `pre-up`- und `post-down`-Zeilen entfallen. Der Artikel [:WireGuard:] enthält [:WireGuard/#Start-per-ifupdown: konkrete Beispiele]. Für das bei deutschen Hochschulen oft verwendete Verfahren Cisco-IPsec sieht das konkret z.B. so aus: {{{ iface UNI inet manual up vpnc-connect VPN-UNI down vpnc-disconnect }}} Die Programme '''vpnc-connect''' und '''vpnc-disconnect''' gehören zum Paket '''vpnc''', welches zusätzlich zum Standard installiert[3] werden muss. Seine Konfiguration liest `vpnc` aus der Datei '''/etc/vpnc/VPN-UNI.conf''', welche man gemäß dem [:VPNC:Wiki-Artikel zu vpnc] mit Inhalt füllen muss. Bei einer bereits bestehenden IP-Verbindung, beispielsweise über `wlan0`, verbindet man sich mit dem VPN der Uni über den Befehl[4]: {{{#!vorlage Befehl sudo ifup UNI }}} Man kann das VPN als zusätzliche Verbindung auf- und dann auch wieder mittels `sudo ifdown UNI` sanft abbauen und zur Verbindung über wlan0 zurückkehren. VPN-Roaming wird im Beispiel zu `inherits` im Abschnitt Start/Stopp-Skripte behandelt. {{{#!vorlage Warnung Bei der Nutzung eines VPN: Vergiss IPv6 nicht! }}} = Start/Stopp-Skripte = Es gibt mehrere Methoden, über die Datei '''interfaces''' Skripte oder Shell-Befehle auszuführen. Dieser Abschnitt stellt die Methoden durch Beispiele vor. Für das Verständnis werden die Abschnitte [#iface Schlüsselwort iface] und [#mapping Schlüsselwort mapping] benötigt. == Befehle in interfaces == * Mit dem Beispiel {{{ iface wan inet static address 203.0.113.99/32 up systemctl restart apache2 down systemctl stop apache2 }}} wird der Webserver `apache2` neu gestartet, sobald eine Netzwerkschnittstelle mit der Konfiguration `wan` gestartet wurde. * Weitere Beispiele siehe beim [#iface Schlüsselwort iface] und [#mapping Schlüsselwort mapping]. == Skripte in /etc/network/if-*.d/ == Dies sind Start/Stopp-Skripte im engeren Sinne. Etliche Programme hinterlegen ihre Skripte in den Verzeichnissen '''/etc/network/if-*.d/''' und man kann dort auch eigene Skripte ablegen. Diese Skripte werden von der System-Shell, bei Ubuntu `dash` (nicht: `bash`!), ausgeführt. Hier folgt beispielhaft ein Skript zur Zuweisung mehrerer Adressen zu einer Netzwerkschnittstelle, welches aus der '''interfaces''' aufgerufen wird durch: {{{ iface config inet manual addresses 2001:db8::1/64 192.168.255.255/32 192.168.178.22/24 }}} Das folgende Skript muss in alle vier Verzeichnisse '''/etc/network/if-*.d/''' kopiert werden oder besser durch Symlinks verfügbar sein; es wertet die Konstante `addresses` aus '''interfaces''' als Shell-Variable `$IF_ADDRESSES` aus: {{{ #!/bin/sh -e # assign addresses from line 'addresses …' in iface-stanza to interface test -n "$IF_ADDRESSES" || exit 0 case "$PHASE" in ( pre-up ) # enable IPv6 iff IPv6-address given echo "$IF_ADDRESSES" | grep -q -e':' \ && sysctl -w net.ipv6.conf.$IFACE.disable_ipv6=0 ;; (post-up ) for addr in $IF_ADDRESSES do ip addr replace "$addr" dev "$IFACE" || true ; done ;; ( pre-down) ip addr flush dev "$IFACE" ;; (post-down) # reset disable_ipv6 to default X=$( sysctl -n net.ipv6.conf.default.disable_ipv6 ) sysctl -w net.ipv6.conf.$IFACE.disable_ipv6=$X esac }}} Dieses Skript verzichtet bewusst auf einige sinnvolle Blockierungen unsinniger Eingaben, damit das Prinzip dieser Skripte deutlich wird. == inherits – Konfigurationen vererben == ifupdown kennt das Spezialwort `inherits`, mit dessen Hilfe man aus einem iface-Konfigurationsblock auf einen anderen, bereits definierten iface-Konfigurationsblock verweisen und dessen Konstanten und Optionen einbinden kann. Damit ist beispielsweise leicht eine Umschaltung zwischen mehreren VPN-Konfigurationen von `vpnc` möglich: {{{ iface VPNC inet manual up vpnc-connect --ifname $LOGICAL $IF_VPN_CONF down vpnc-disconnect iface UNI inherits VPNC VPN-conf UNI iface work inherits VPNC VPN-conf Arbeit iface R2D2 inherits VPNC VPN-conf Kino }}} Nach diesem Schema macht man beliebig viele VPN-Konfigurationen in der '''interfaces''' verfügbar und spart sich das Kopieren der gemeinsamen Aktivierungs-/Deaktivierungsbefehle in jede Konfiguration. Die Aktivierung des einzelnen VPN erfolgt wie gewohnt über „`sudo ifup UNI`“ usw. Luxus, aber manchmal hilfreich ist hier die Benennung der Tunnel-Schnittstelle nach dem VPN über den optionalen Zusatz `--ifname $LOGICAL`. Das hier gezeigte Muster kann man auch auf das WLAN-Roaming übertragen. = Aktivierung = * Damit die neuen Einstellungen sofort wirksam werden, wird oft empfohlen, den Job `networking` mit einem '''SysV-Init'''-Befehl neu zu starten [4]: {{{#!vorlage Befehl sudo /etc/init.d/networking restart # Nicht verwenden! Veraltet, gefährlich und unnötig }}} Diese Methode ist veraltet, gefährlich und unnötig. Bei über Netzwerk eingebundenen Dateisystemen besteht die Gefahr von Datenverlusten. Dies betrifft sowohl den Rechner, dessen Datei '''interfaces''' man ändern möchte als auch jeden Rechner, der mit diesem verbunden ist! * Auch die Dienstprogramme von '''upstart''' bzw. '''systemd''' sollte man nicht verwenden. * Stattdessen sollte man für jede einzelne Schnittstelle, deren Konfiguration man verändern will, vor der Bearbeitung der Datei '''interfaces''' * alle Netzwerkverbindungen beenden und danach * die Schnittstelle stoppen und * nach der Bearbeitung wieder starten: {{{#!vorlage Befehl # sudo umount NETZWERK-DATEISYSTEM # für jedes eingebundene Netzwerk-Dateisystem sudo ifdown eth0 # (jetzt Konfiguration für eth0 in der interfaces bearbeiten.) sudo ifup eth0 }}} * Wenn man nach sorgfältigem Nachdenken wirklich alle Schnittstellen in der Gruppe `auto` neu starten möchte, sollte man dabei jedenfalls die Schnittstelle lo nicht stoppen: {{{#!vorlage Befehl sudo ifdown -a --exclude=lo sudo ifup -a }}} {{{#!vorlage Hinweis Der Jobname `networking` bezieht sich bei SysV, Upstart und systemd nur auf das ifupdown-System. NetworkManager und andere Netzwerk-Konfigurationsprogramme werden durch einen Neustart von `networking` entgegen seines mehr versprechenden Namens __nicht__ neu gestartet. }}} = Zusätzliche Aspekte = Die folgenden Abschnitte enthalten Zusatzinformationen und Grundlagenwissen. Sie können für die Bearbeitung der Datei '''/etc/network/interfaces''' hilfreich sein. == Eigenschaften der beiden Methoden == Die beiden bei Ubuntu verwendeten Methoden zur Netzwerk-Konfiguration haben sehr unterschiedliche Eigenschaften und ergänzen sich daher: ifupdown … * ist die klassische Methode von Debian und dessen Derivaten, somit auch Ubuntu, * besteht aus den Komponenten * dem Programm `ifup` (welches auch als `ifdown` bzw `ifquery` aufgerufen werden kann), * dessen Konfigurationsdatei '''/etc/network/interfaces''', * einen Satz von Skripten in den Unterverzeichnissen '''if-pre-up.d/, if-up.d/, if-down.d/ und if-post-down.d/''' im Verzeichnis '''/etc/network/''', die spezielle Aufgaben bei die Initialisierung einer Netzwerkverbindung übernehmen, * einigen weiteren Dateien, mit denen sich '''ifupdown''' seinen inneren Status merkt, * ermöglicht eine sehr „systemnahe“ Konfiguration mit allen überhaupt vom Linux-Kernel bereitgestellten Feinheiten, * macht nichts von sich aus, sondern nur nach explizitem Aufruf, * hat selbst kaum Netzwerk-Knowhow fest eingebaut, * kümmert sich nur um die ihm explizit genannten Netzwerk-Schnittstellen, * ist nur über eine Kommandozeile bedienbar. NetworkManager … * besteht aus * einem daemon, also ständig aktivem Hintergrund-Prozess und * mehreren Front-ends zur Beobachtung und Bedienung des Hintergrund-Prozesses, * versucht sich, um alle Netzwerk-Schnittstellen des Systems zu kümmern, konfiguriert diese und überwacht sie auch im Betrieb, * versucht eine einmal aktivierte Verbindung ständig verfügbar zu erhalten und weitere mögliche Verbindungen aufzubauen, * verfügt über eigene nichttriviale Prozeduren zum Aufbau von Verbindungen, * ist über eine Kommandozeile bedienbar, bietet zusätzlich aber auch eine grafische Bedienschnittstelle, * benutzt einige vom ifupdown-Mechanismus bereitgestellte Ressourcen: die o.g. Skripte in '''/etc/network/if-up.d/''' (bzw. '''/etc/network/if-post-down.d/''') werden auch vom NetworkManager aufgerufen. ==Entscheidungskriterien== Für die Entscheidung, ob man eine Netzwerk-Schnittstelle über `ifup` oder über den NetworkManager konfigurieren sollte, können folgende Hinweise hilfreich sein: Für Arbeitsstationen ist in der Regel der NetworkManager die bessere Wahl. Dies trifft in besonderem Maße zu für Laptops bzw. bewegliche Geräte, mit denen man bewusst wechselweise verschiedene WLANs benutzen möchte; jedoch ist auch in diesem Fall eine Netzwerk-Konfiguration über '''interfaces''' möglich, sogar mit graphischer Unterstützung. Bei Desktop-Rechnern, die stets über ein LAN-Kabel mit immer demselben Netzwerk gekoppelt werden, kann auch eine Konfiguration über '''interfaces''' nützlich sein. Bei Servern und Routern ist meist NetworkManager eine schlechte Idee, da man hier Wert auf eine präzise Kontrolle aller Netzwerk-Eigenschaften legt. ==NetworkManager deaktivieren== Hierfür gibt es mehrere Möglichkeiten: * Den NetworkManager kann man über das Dienstprogramm des Init-Prozesses zeitweise stoppen und wieder starten. Von dieser Methode wird bei der Arbeit mit '''interfaces''' ausdrücklich abgeraten, da NetworkManager beim Stopp sich kompliziert verhält: * Netzwerk-Schnittstellen werden nicht wieder in den Zustand beim Rechnerstart zurück versetzt. * Verbindungen werden manchmal, aber nicht immer beendet. * Die von ihm gestarteten Dienste (dnsmasq, resolvconf) werden manchmal, aber nicht immer beendet. * Das konkrete Verhalten des NetworkManagers hängt ab von seiner Programmversion, aber auch von der konkreten Situation des Systems. * NM komplett abschalten: Wenn der NetworkManager beim Rechnerstart nicht wieder starten soll, muss man den Init-Prozess konfigurieren [4]: {{{#!vorlage Befehl sudo systemctl disable MetworkManager.service sudo systemctl disable network-manager }}} Alternativ kann man auch den NetworkManager komplett deinstallieren. * NM für bestimmte Schnittstellen deaktivieren: Hierfür benötigt man den Namen oder die aktive Ethernet-Adresse der Schnittstelle. {{{#!vorlage Hinweis Exkurs: Eine Liste aller Schnittstellen des Systems erhält man mit dem Befehl [4]: `ip link` }}} * Man legt man im Verzeichnis '''/etc/NetworkManager/conf.d/''' mit Root-Rechten [2] mittels eines Editors [1] eine Datei (hier als Beispiel mit dem Namen '''unmanaged-devices.conf''', der Name vor der obligatorischen Endung '''.conf''' kann aber beliebig lauten) an: {{{#!code # /etc/NetworkManager/conf.d/unmanaged-devices.conf [keyfile] unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth2 }}} NetworkManager muss nun seine geänderte Konfiguration neu einlesen. Dies erreicht man im laufenden Betrieb durch {{{#!vorlage Befehl sudo systemctl restart NetworkManager }}} * NM für alle in '''interfaces''' genannten Schnittstellen deaktivieren: Dies ist durch die Standardeinstellung des NM vorgeben: NM wertet die Datei '''/etc/network/interfaces''' aus und verwaltet die dort genannten Schnittstellen nicht. Man sollte allerdings beachten, dass man durchaus Netzwerk-Schnittstellen über die Datei '''/etc/network/interfaces''' konfigurieren kann, obwohl der Name der Schnittstelle nicht in der Datei auftaucht (s.o. [#mapping Mapping])! = Programm-Dokumentation = Die [:man:manpages] zu '''ifupdown''' auf dem eigenen Rechner liefern wertvolle Informationen und sollten vor einer Bearbeitung der Datei '''/etc/network/interfaces''' stets konsultiert werden. Dies ist insbesondere wichtig, wenn man mit unterschiedlichen Versionen arbeitet. {{{#!vorlage Befehl man ifup man interfaces }}} {{{#!vorlage Tabelle Verwendete Programmversionen beim Test im Feb. 2017 bzw. März 2021 +++ Abfrage der Programmversion Ausgabe für 16.04 Ausgabe für 20.04 +++ `lsb_release -ds` `Ubuntu 16.04.2 LTS` `Ubuntu 20.04.2 LTS` +++ `date -I` `2017-02-28` `2021-03-07` +++ `ifup --version | head -n1` `ifup version 0.8.10ubuntu1.2` `ifup version 0.8.35ubuntu1` +++ `nmcli --version | head -n1` `nmcli-Werkzeug, Version 1.2.2` `nmcli-Werkzeug, Version 1.22.10` +++ `ip -V | head -n1` `ip utility, iproute2-ss151103` `ip utility, iproute2-ss200127` +++ `wpa_supplicant -v | head -n1` `wpa_supplicant v2.4` `wpa_supplicant v2.9` +++ `sysctl -V | head -n1` `sysctl von procps-ng 3.3.10` `sysctl von procps-ng UNKNOWN` +++ `vpnc --version | head -n1` `vpnc version 0.5.3r550-2build1` }}} = Links = == Intern == * [:NetworkManager:] – Standardprogramm bei Ubuntu-Desktops zur automatischen Einrichtung von Netzwerk-Verbindungen * [:systemd/networkd:systemd-networkd] – Standardprogramm bei Ubuntu-Servern zur Netzwerk-Konfiguration * [:WLAN:] – Übersicht zum Thema WLAN == Extern == * [http://www.debian.org/doc/manuals/reference/ch-gateway.de.html Kapitel 5. Netzwerkkonfiguration] {de} – Debian-Referenz * [wikipedia:Netzklasse:Netzklassen] * [wikipedia:CIDR:Classless Internet Domain Routing] # tag: System, Netzwerk