Mai 2014: Netzwerkkonfiguration mit dem Programm ip

Autoren: Michael Gisbers und Christian Hesse

Der Tipp des Monats hat sich im letzten Artikel der Serie mit dem Stream-Editor `sed` beschäftigt. Nun wenden wir uns der Netzwerktechnik zu. Dabei spielt das relativ neue Tool `ip` eine zentrale Rolle und löst nach und nach diverse in die Jahre gekommene Programme ab.

Geschichtsstunde: ifconfig

Vielen ist der Befehl `ifconfig` ein Begriff, ist er doch seit Jahrzehnten für die Konfiguration des Netzwerks unter Unix- oder Linux-Systemen zuständig. So sehen beispielsweise Aufrufe zum Setzen einer IP-Adresse und Anzeigen der Konfiguration aus

root@linux:~# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up
root@linux:~# ifconfig eth0
eth0: flags=4163  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::225:90ff:fec0:ffee  prefixlen 64  scopeid 0x20
        ether 00:25:90:c0:ff:ee  txqueuelen 1000  (Ethernet)
        RX packets 123346  bytes 120154576 (114.5 MiB)
        RX errors 0  dropped 2571  overruns 0  frame 0
        TX packets 126744  bytes 71491997 (68.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xfe120000-fe13ffff

Auf die Details gehen wir an dieser Stelle nicht ein. Inzwischen bietet der Linux Kernel neue Funktionen, die `ifconfig` nicht mehr bedient. Eine Anpassung hätte weitreichende Eingriffe erfordert und eine Änderung oder Erweiterung der Syntax mit sich gebracht. So hat man sich entschlossen, gleich ein neues Programm ins Leben zu rufen. Das Resultat is der Befehl mit dem kurzen und prägnanten Namen `ip`.

Netzwerkkonfiguration mit ip

Das Befehl `ip` bringt von sich aus eine einfache Hilfe mit. Ohne Parameter aufgerufen, verrät es uns weitere Optionen:

root@linux:~# ip
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
                   tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |
                   netns | l2tp | tcp_metrics | token }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
                    -4 | -6 | -I | -D | -B | -0 |
                    -l[oops] { maximum-addr-flush-attempts } |
                    -o[neline] | -t[imestamp] | -b[atch] [filename] |
                    -rc[vbuf] [size]}

So erfahren wir, dass `ip` auf jeden Fall ein Objekt als Parameter erwartet. Folgen kann diesem Objekt ein Kommando oder `help`.

Um eine Adresse zu setzen, interessiert uns im Speziellen das Objekt `addr`, kurz für `address`. Wir rufen einfach die entsprechende Hilfe auf:

root@linux:~# ip addr help
Usage: ip addr {add|change|replace} IFADDR dev STRING [ LIFETIME ]
                                                      [ CONFFLAG-LIST ]
       ip addr del IFADDR dev STRING [mngtmpaddr]
       ip addr {show|save|flush} [ dev STRING ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ] [up]
       ip addr {showdump|restore}
[...]

Mit dem Kommando `add` lassen sich also Adressen hinzufügen, die zusätzlich notwendigen Parameter sind ebenfalls bekannt. Die Adresse aus dem `ifconfig`-Beispiel setzt `ip` mit folgendem Befehl:

root@linux:~# ip addr add 192.168.1.1/24 dev eth0

Kehrt der Prompt ohne Fehlermeldung zurück, wurde `ip` ohne Fehler ausgeführt, die Adresse ist also gesetzt.

Netzwerkkommunikation ist jetzt allerdings noch nicht möglich. `ifconfig` konnte mit dem zusätzlichen Parameter `up` die Netzwerschnittstelle direkt aktivieren. Dafür ist nun ein zusätzlicher `ip`-Aufruf mit dem Objekt `link` notwendig.

root@linux:~# ip link set up dev eth0

Mit dem Kommando `show` zeigt `ip` nun die gerade angewandten Einstellungen an. Die Angabe des Interface ist nicht zwingend notwendig. Fehlt sie, werden die Informationen zu allen Netzwerschnittstellen angezeigt.

root@linux:~# ip addr show dev eth0
2: eth0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:25:90:c0:ff:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::225:90ff:fec0:ffee/64 scope link
       valid_lft forever preferred_lft forever

Die Menge der übertragenen Daten zeigt `ip` nur mit der zusätzlichen Option `-s` an:

root@linux:~# ip -s link show dev eth0
2: eth0:  mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:25:90:c0:ff:ee brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    124815731  132120   0       3820    0       0
    TX: bytes  packets  errors  dropped carrier collsns
    72327039   134225   0       0       0       0

Das Setzen einer weiteren IP-Adresse auf ein Interface überschreibt übrigens nicht die erste, sondern würde lediglich eine zusätzliche hinzufügen. Soll die Adresse geändert werden, muss zunächst die alte Adresse entfernt werden.

root@linux:~# ip addr del 192.168.1.1/24 dev eth0

Alternativ lassen sich auch alle IP-Adressen auf einen Schlag mit dem Kommando `flush` löschen.

root@linux:~# ip addr flush dev eth0

ip - was es sonst noch kann

Wir haben den Befehlt `ip` nun soweit kennengelernt, dass wir die Funktionen des Befehls `ifconfig` ersetzen können. `ip` kann allerdings noch deutlich mehr. Wie `ip` beispielsweise den Befehl `route` ersetzt, erfahren wir im nächsten Artikel der Serie.