Netzwerke verbinden

Rechner kommunizieren untereinander, indem sie Datenpakete über Kabel und Funk austauschen. Nach Außen empfängt und versendet der Kernel diese Datenpakete über einen Netzwerk-Adapter. Nach Innen kommuniziert er über die Systemaufrufe send() und recv() mit dem richtigen Prozess. Ein Netzkoppler (engl.: Gateway), wie zum Beispiel die Fritz!Box, verbindet verschiedenartige Netzwerke untereinander und mit dem Internet.

Hostnamen auflösen

Wir Menschen identifizieren Rechner anhand ihres Namens, daher brauchen es einen Mechanismus, der Namen auf Adressen abbildet. Der NSS legt fest, in welcher Reihenfolge verschiedene Datenbanken befragt werden. Die erste Anlaufstelle ist meist die lokale Hosts-Datei gefolgt vom DNS. Ein sogenanter Recursive Resolver hangelt sich, beginnend bei einem der Root-Nameserver, bis zum für die Domäne zuständigen authoritativen Nameserver durch und merkt sich die Antworten.

Für die Datenbank hosts stehen folgende Service-Module zur Verfügung:

files
Statische Hostnamen (/etc/hosts)
nis, nisplus
Network Information System (Sun Yellow Pages)
myhostname
Eigener Hostname (/etc/hostname) sowie localhost und _gateway
mymachines
Container auf diesem Host (systemd-nspwan)
mdns
Multicast DNS für .local Domäne (avahi-autoipd)
resolve
Resolver-Daemon (systemd-resolved)
dns
Domain Name System (/etc/resolv.conf)

Der Kernel stellt die verfügbaren Adapter unter /sys/class/net zur Verfügung. Der udev(7) Daemon benennt diese nach folgemdem Schema:

Benennung von Netzwerk-Adaptern
Präfix Controller Beispiel Verwendung
lo Loopback (virtuelles Schleifengerät)
en Ethernet (kabelgebundener RJ45-Adapter)
oNumber eno1 On-board (oft bei Servern)
sSlot ens1 Hotplug-Slot
pBussSlot enp0s25 PCI-Bus (0000:00:19)
xMacAddress enx23ee4711d34fHardware-Addresse
wl pBussSlot wlp4s0 Wireless (drahtloses Funknetz)
ww pBussSlot wwp0s2… Wide Area (SIM-Karte)
br br0 Bridge (Punkt-zu-Punkt Verbindung)
tun Number tun0 Tunnel (VPN)
ve- Name ve-debian Virtuelle Maschine

Um die klassischen Namen wie eth0 zu reaktivieren, gibt man auf der Kommandozeile des Kernels net.ifnames=0 an. Individuelle Namen wie dmz0 kann man über persistente Regel vergeben:

/etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="dmz0"

Adapter manuell konfigurieren

Das Kommando ip(8) aus dem Paket iproute2 dient der manuellen Einrichtung von Adaptern, Adressen, Tunneln und Routen. Damit ersetzt es die veralteten Werkzeuge aus dem Paket net-tools wie zum Beispiel arp(8), ifconfig(8), route(8) etc. Das ist praktisch zum Testen, die Einstellungen gehen aber bei einem Neustart verloren.

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue…
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

Jedem Adapter lassen sich eine oder mehrere Adressen zuordnen.

ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue…
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo

In der ARP-Tabelle sammelt er die Zuordnung von IP- zu MAC-Adressen.

ip neighbour
10.0.0.1 dev eno1 lladdr de:ad:ca:fe:ba:be REACHABLE

Die Routing-Tabelle steuert, welchen Weg Datenpakete durch das Netzwerk nehmen.

ip route
default via 10.0.0.1 dev eno1  metric 1024

Auf einem Netzkoppler mit mehreren Schnittstellen gibt es auch mehr Routen:

ip route
default via 10.0.0.1 dev eno1
10.0.0.0/24 dev eno1  proto kernel  scope link  src 10.0.0.2
10.0.0.0/24 dev eno2  proto kernel  scope link  src 10.0.0.1
10.8.0.0/24 via 10.8.0.2 dev tun0
10.8.0.2    dev tun0  proto kernel  scope link  src 10.8.0.1

Debian ifupdown

Standardmäßig werden unter Debian die Einstellungen in einer Konifigurationsdatei für ifupdown() persistiert.

/etc/network/interfaces
auto lo iface lo inet loopback allow-hotplug wlp1s0 iface wlp1s0 inet dhcp wpa-driver wext wpa-ssid Name wpa-psk Password

Systemd-networkd

Systemd bringt einen Dienst mit, der das Netzwerk beim Start des Systems einrichtet. Ich nutze ihne gerne auf Servern.

/etc/systemd/networkd/en0.network
[Match] Name=eno1 [Network] Address=192.168.23.2/24 Gateway=192.168.23.1

Das Programm networkctl(1) steuert den Daemon.

networkctl
IDX LINK            TYPE     OPERATIONAL SETUP    
  1 lo              loopback carrier     unmanaged
  2 wwan0           wwan     off         unmanaged
  3 enp0s31f6       ether    no-carrier  unmanaged
  5 wlp0s20f3       wlan     routable    unmanaged

NetworkManager

Auf einem Arbeitsplatz-Rechner sorgt normalerweise der Network Manager für eine bestmögliche Verbindung zum Internet, entweder per Ethernet oder über ein Funknetz.

/etc/NetworkManager/system-connections/Fnord.nmconnection
[connection] type=wifi id=Fnord uuid=2227879f-8741-4029-a668-2835bec58ea8 interface-name=wlp0s20f3 [wifi] mode=infrastructure ssid=Fnord [wifi-security] auth-alg=open key-mgmt=wpa-psk psk=Password

Unter Gnome kann man Verbindungen über das Kontextmenü in der oberen rechten Ecke bearbeiten. Auf der Kommandozeile konfiguriert man Verbindungen mit nmcli(1) oder nmtui(1). Diese Programme kommunizieren via D-Bus mit einem privilegierten Daemon.

nmcli con show
NAME                         UUID                                  TYPE      DEVICE    
Fnord                        2227879f-8741-4029-a668-2835bec58ea8  wifi      wlp0s20f3
lo                           9b4de805-af42-431f-963f-193f364b3520  loopback  lo
Kabelgebundene Verbindung 1  88d907d5-8ec7-3ae4-9165-d098920209ca  ethernet  --
Kabelgebundene Verbindung 2  ab12924b-da9a-3a87-a05a-bd9aac6b59d8  ethernet  --

Netfilter

Wenn der Kernel ein Datenpaket empfängt oder sendet, durchläuft es eine Reihe von Filtern.

/etc/nftables.conf
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority filter; } chain forward { type filter hook forward priority filter; } chain output { type filter hook output priority filter; } }

Regeln in Datei schreiben oder laden.

nft list ruleset > /etc/nftables.conf
nft --file /etc/nftables.conf

Die Systemd-Unit nftables lädt die persistierten Regeln beim Systemstart.

systemctl enable --now nftables

IP-Tables

Lokal zugestellte Datenpakete durchlaufen die Tabelle INPUT; lokal gesendete Datenpakete durchlaufen die Tabelle OUTPUT; und durchgeleitete Datenpaket die Tabelle FORWARD. Die Tabellen PREROUTING und POSTROUTING werden hauptsächlich für NAT verwendet.

Mit iptables(8) erstellt oder ändert man die Regeln.

Befehl Option Parameter Beschreibung
iptables [-t] filter|nat|mangle|raw|security Tabelle
-A INPUT|OUTPUT|FORWARD
|PREROUTING|POSTROUTING
Anhängen an Kette
[-i] eno1|ppp0|… Eingehende Schnittstelle
[-o] eno1|ppp0|… Ausgehende Schnittstelle
[-p] tcp|udp|icmp|…|all Protokoll
[-s] SourceAddr[/Mask] Client-Adresse
[-d] DestAddr[/Mask] Server-Adresse
-j ACCEPT|DROP|RETURN Aktion

Literatur

  1. Debian Wiki: NetworkConfiguration
  2. Debian Wiki: Debian Firewall
  3. Daniil Baturin: Task-centered iproute2 user guide
  4. Doug Vitale: Deprecated Linux networking commands and their replacements
  5. Ilya Grigorik: High Performance Browser Networking, O'Reilly