orm@doc-tcpip.org

Erstellt: Mai 1999 - Letzte Modifikation: Juli 2001

[ Main | Local ]


Ifconfig - Interface Configure

Es geht auch um Ip-Aliase

Auf dieser Seite finden sich folgende Abschnitte:
Das Ifconfig Kommando (AIX - BSD)
Ein paar Beispiele zum Ifconfig
Die seltsamen Flags in der Ausgabe (UP, BROADCAST ...)
Unter AIX ist alles ein wenig anders
Ifconfig und IP-Aliase
IP-Aliase unter BSD (FreeBSD, AIX)
IP-Aliase unter System V (Solaris, Linux)
Das Anlegen ganz vieler Interfaces (zu Testzwecken)

Das Ifconfig Kommando (AIX - BSD)

Das ifconfig Kommando hat einige Schalter und eine ganze Reihe Keywörter. Zuerst die Schalter:

Die Keywörter erlauben, eine Reihe Einstellungen vorzunehmen und einige Dienste an- und abzuschalten. Anschalten geht durch einfaches Anhängen des Keywortes, Abschalten wird durch vorstellen eines Minus erzielt: ifconfig en0 -arp schaltet für das Interface en0 die Benutzung von ARP aus; ifconfig en0 arp schaltet es wieder ein.
Hier eine Liste der interessanten Keywörter: Jetzt noch die ISNO_Parameter, also die Interface spezifischen Parameter. Sind sie gesetzt, so werden sie benutzt. Wenn nicht, dann gelten die per no-Kommando eingestellten, generellen Settings. Applikationen können dieser Werte jederzeit per setsockopt für einen Socket überspielen.

Ein paar Beispiele

Zuerst die Ausgabe eines einfachen Aufrufes. Pro Interface wird der Name, die Flags und die mit dem Interface verknüpften Adressen ausgegeben. Zur Adresse gehört die IP, die Netzmaske und die Broadcast-Adresse. Eventuelle Alias-Adresse und IPv6-Adressen werden mit angezeigt.

 
doctcp@nimmaster# ifconfig -a
lo0: flags=e08084b
inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255
inet6 ::1/0
en0: flags=e080863
inet 192.168.140.3 netmask 0xffffff00 broadcast 192.168.140.255
tr0: flags=e0a0043
inet 9.39.0.74 netmask 0xfffff000 broadcast 9.39.15.255
 

Einige Beispiele für die Nutzung des ifconfig-Kommandos:
Einrichten eines Aliases auf das Interface en0:
ifconfig en0 10.16.32.8 netmask 255.255.240.0 alias
Verbindungen über das Token-Ring sollen den Nagle-Algorithmus nicht nutzen:
ifconfig tr0 tcp_nodelay 0

Unter System V abgeleiteten Unixen sieht es etwas anders aus .. siehe weiter unten.

Die seltsamen Flags in der Ausgabe (UP, BROADCAST ...)

Für jedes Interface gibt das ifconfig-Kommando eine Zeile "flags" aus. Diese Zeile beginnt mit einer Nummer, das ist die Darstellung der Flags in Hex, also es wird das entsprechende Register ausgelesen. Danach die Übersetzung in verständliche Form.
Einige Flags beziehen sich auf einstellbare Variablen des Adapters bzw. des Interfaces (UP, PROMISC), andere geben über feste Eigenschaften (SIMPLEX, 64BIT) des Adapters Auskunft. Hier einige Flags:

Unter AIX ist alles ein wenig anders

Im Fall von AIX ist das alles gleich, aber anders ;-). Wie sicher bekannt, verfügt AIX über die ODM, eine Datenbank, in der alle wichtigen Dinge über das System stehen, also auch Informationen zu den Netzwerk-Adaptern.

Wird nun ein Interface während des Bootens vom cfgmgr (der Configurations Manager) eingerichtet, dann werden die Informationen aus der ODM ausgelesen und es wird die entsprechende Kernel-Extension geladen. Das entspricht dem Kommando "mkdev -l en0".

Nachher kann man das Interface ganz "normal" mit dem Ifconfig bearbeiten, Adressen ändern, es "up" oder "down" setzen etc. Der Pferdefuß kommt jetzt: in dem Augenblick, wo man es mit der Option "detach" runterfahren will und dieses Interface das letzte seiner Art ist (also Ethernet, enX zum Beispiel), dann wird die Kernel-Extension entladen. Das Interface kommt dann nicht mehr hoch, da es alle Einstellungen "vergessen" hat. In diesem Moment ist ein "mkdev -l " angesagt...

Das gilt für AIX 4.3. Es mag sein, das später das Ifconfig aufgebohrt worden ist, um diesen Zustand zu checken und von sich aus einen "mkdev" durchzuführen, wenn das Interface keine gültige Adresse hat und auch kein DHCP machen möchte.

Ifconfig und IP-Aliase

Man kann auf einen Adapter mehrere Interfaces binden, die dann eigene IP-Adressen haben und über die normal geroutet werden kann. Das ist z.B. nötig, wenn man mehrere logische Subnetze auf einem physikalischen Netz fahren möchte oder wenn ein Server (nehmen wir einen Name-Server) ersetzt werden muß. Die alte Adresse wandert dann als Alias auf die neue Maschine, und der Betrieb geht weiter.

Beim Einrichten der Aliase gibt es Unterschiede, je nach dem, ob es ein BSD-Derivat (*BSD, AIX) oder ein Abkömmling von System V ist (Linux, Solaris). Das sind aber eher Äußerlichkeiten - in beiden Fällen ist die Bezeichnung "Alias" ein wenig irreführend. Es sind vollgültige Interfaces, die unabhängig voneinander an einen Adapter gebunden sind und die man einzelen löschen kann.

IP-Aliase unter BSD (FreeBSD, AIX)

Hier ist der Aufruf des ifconfig-Kommandos ganz normal, nur das Keyword alias muß angefügt werden. Will man ein IP-Alias wieder löschen, so kann man es direkt mit der IP-Ansprechen. In der FreeBSD Doku heißt es, daß man 256 dieser IP-Aliase anlegen kann. Unter AIX gibt es dort keine Beschränkung, es geht also solange, bis kein Netzwerkspeicher mehr zur Verfügung steht. Jetzt ein praktisches Beispiel:

elnuevo# ifconfig -a
ed0: flags=8943 mtu 1500
inet 172.168.140.6 netmask 0xffffff00 broadcast 172.168.140.255
inet6 fe80::240:5ff:fe6c:9d84%ed0 prefixlen 64 scopeid 0x2
ether 00:40:05:6c:9d:84
lo0: flags=8049 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0xc
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000

Ich lege jetzt mit den folgenden Befehlen 3 IP-Aliase für andere Netze an. Es könnten auch weitere Adressen für mein aktuelles Netz sein.
elnuevo# ifconfig ed0 166.66.66.66 alias
elnuevo# ifconfig ed0 188.88.88.88 alias
elnuevo# ifconfig ed0 199.99.99.99 alias
Das sieht dann so aus:

elnuevo# ifconfig -a
ed0: flags=8943 mtu 1500
inet 172.168.140.6 netmask 0xffffff00 broadcast 172.168.140.255
inet 166.66.66.66 netmask 0xffff0000 broadcast 166.66.255.255
inet 188.88.88.88 netmask 0xffff0000 broadcast 188.88.255.255
inet 199.99.99.99 netmask 0xffffff00 broadcast 199.99.99.255
inet6 fe80::240:5ff:fe6c:9d84%ed0 prefixlen 64 scopeid 0x2
ether 00:40:05:6c:9d:84
lo0: flags=8049 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0xc
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000

Unter BSD legt das ifconfig-Kommando auch die nötigen Netzroute pro Interface an. Ich war faul und habe keine keine Netzmasken spezifiziert bei meinen ifconfig-Aufrufen, sodaß ifconfig mit den normalen Klassen der IP-Adressen rechnet, wie man sowohl in der ifconfig- wie auch der netstat-Ausgabe sieht (166. und 188. sind Class B, während 199. Class C ist. 172. ist eigentlich auch Class B, aber das habe ich gändert).

elnuevo# netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use     Netif Expire
127.0.0.1          127.0.0.1          UH          1       26      lo0
166.66             link#2             UC          0        0      ed0 =>
172.168            link#2             UC          0        0      ed0 =>
188.88             link#2             UC          0        0      ed0 =>
192.168.140        link#3             UC          0        0      ed1 =>
199.99.99          link#2             UC          0        0      ed0 =>

Internet6:
Destination               Gateway                       Flags      Netif Expire
::1                       ::1                           UH          lo0
fe80::%ed0/64             link#2                        UC          ed0
fe80::%ed1/64             link#3                        UC          ed1
fe80::%lo0/64             fe80::1%lo0                   Uc          lo0
ff01::/32                 ::1                           U           lo0
ff02::%ed0/32             link#2                        UC          ed0
ff02::%ed1/32             link#3                        UC          ed1
ff02::%lo0/32             fe80::1%lo0                   UC          lo0

Meine IP-Aliase haben ihren Zweck erfüllt, und ich möchte sie löschen. Das geht mit demselben ifconfig-Aufruf, nur mit dem Keyword delete. Es sei nochmal darauf hingewiesen, das die "Aliase" gleichberechtigt sind. Ich kann jede beliebige Adresse (Interface) löschen. Das eigentliche Interface (eth0) fällt erst dann weg, wenn keine Adresse mehr darauf sitzt - es ist aber egal, welche das ist (Also ob sie über ein Alias eingerichtet wurde oder nicht).
elnuevo# ifconfig ed0 166.66.66.66 delete
elnuevo# ifconfig ed0 188.88.88.88 delete
Das ergibt folgende ifconfig-Ausgabe:

elnuevo# ifconfig -a
ed0: flags=8943 mtu 1500
inet 172.168.140.2 netmask 0xffff0000 broadcast 172.168.255.255
inet 199.99.99.99 netmask 0xffffff00 broadcast 199.99.99.255
inet6 fe80::240:5ff:fe6c:9d84%ed0 prefixlen 64 scopeid 0x2
ether 00:40:05:6c:9d:84
lo0: flags=8049 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0xc
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
elnuevo#

Dieses Verhalten liegt an der Implementierung dieser Geschichte unter den BSD-Unixen. Es gibt eine Datenstruktur, ifnet, die für jedes Interface angelegt wird. Die Datenstrukturen mehrerer Interfaces werden verkettet (eine linked list). Pro Interface sind mehrere Adresse möglich, einfach dadurch, das man im Feld if_addrlist einen neuen Verweis erzeugt und dort die Adresse ablegt - wieder eine verkettete Liste. Hier ein Bild, ich hoffe, es wird damit klarer:

.	ifnet			 pf1_addr	         pf2_addr
.	  |		            |		            |
.	[en0]  - if_addrlist -> [1. Addr] - ifa_next -> [2. Addr] -=>
.	  |			    |   		    |
.	ifnext			 ia_next		 ia_next
.	  |			    |		            |
.	[en1]  - if_addrlist -> [1. Addr] - ifa_next -> [2. Addr] -=>
.	  |			    |		            |
.	ifnext			 ia_next		 ia_next
.	  |			    |		            |
.	[lo0]  - if_addrlist -> [1. Addr] - ifa_next -> [2. Addr] -=>
.         |			    |                       |
Damit ist dann auch einsichtig, warum man eine beliebige Adresse bzw. ein beliebiges Interface einfach löschen kann: Es wird aus der Kette entfernt, und die Reste werden wieder zusammen gefügt.

IP-Aliase unter System V (Solaris, Linux)

Das Handling ist hier ein wenig anders. Das IP-Alias wird nicht mit dem Eintrag für den Link verbandelt, sondern es werden eigene Einträge mit einem eigenen Interface-Namen erstellt, also Aliase auf eth0 wären dann eth0:0, eth0:1 etc. Das original Interface ist gegenüber den anderen hervorgehoben, es kann erst gelöscht werden, wenn die IP-Aliase nicht mehr existieren (unter BSD sind die Adressen völlig gleich). Inwieweit das mit den zugrundeliegenden Datenstrukturen einhergeht, weiss ich nicht.
Jedenfalls rufe ich zum Einrichten eines IP-Alias auf System V abgeleiteten Systemen das ifconfig-Kommando mit dem erweiterten Interface-Namen auf und gebe ihm eine Adresse. Das "alias" Keyword gibt es hier nicht. Wieder ein Beispiel für das alles, zuerst die Ausgangssituation:

linux:/tmp # ifconfig
eth0      Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:192.168.1.9  Bcast:192.168.1.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:1088 errors:0 dropped:0 overruns:0 frame:0
TX packets:1069 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:10 Base address:0x8000

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:3924  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

Jetzt lege ich meine beiden IP-Aliase an:
linux:/tmp # ifconfig eth0:0 188.88.88.88
linux:/tmp # ifconfig eth0:1 199.99.99.99
Und so sieht das System danach aus. Es wird für jedes Alias ein neuer Eintrag erstellt, die Flags etc. sind kopiert. Die Statistiken bleiben beim original Eintrag, der den Adapter representiert:

linux:/tmp # ifconfig
eth0      Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:192.168.1.9  Bcast:192.168.1.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:1089 errors:0 dropped:0 overruns:0 frame:0
TX packets:1069 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:10 Base address:0x8000

eth0:0    Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:188.88.88.88  Bcast:188.88.255.255  Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Interrupt:10 Base address:0x8000

eth0:1    Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:199.99.99.99  Bcast:199.99.99.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Interrupt:10 Base address:0x8000

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:3924  Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

Jetzt lösche ich meine Aliase. Die Aliase kann ich in beliebiger Reihenfolge löschen, das originale Interface erst, wenn alle Aliase verschwunden sind.
linux:/tmp # ifconfig eth0 del 188.88.88.88
Der Ifconfig danach:

linux:/tmp # ifconfig
eth0      Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:192.168.1.9  Bcast:192.168.1.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:1089 errors:0 dropped:0 overruns:0 frame:0
TX packets:1069 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:10 Base address:0x8000

eth0:1    Link encap:Ethernet  HWaddr 00:06:29:F1:96:81
inet addr:199.99.99.99  Bcast:199.99.99.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
Interrupt:10 Base address:0x8000

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:3924  Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

linux:/tmp #
Wieder rechnet Ifconfig mit den alten Klassen die Netzmasken aus, wenn man ihn nicht eines besseren belehrt (via netmask Keyword).

Das Anlegen ganz vieler Interfaces (zu Testzwecken)

Manchmal ist es nötig, viele Interface (Aliase) anzulegen. Das geht schnell und einfach mit einem Skript dieser Art:

 
for y in `seq 0 63` ; do for x in `seq 1 254` ; do echo $y $x ; ifconfig
eth0:$[ ( $y * 256 ) + $x ] 10.0.$y.$x broadcast 10.0.$y.255 netmask
255.255.255.0 up ; done ; done
 


[ Main | Local ]

[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | SMTP | Tracing | GPS ]

Copyright 2001-2014 by Orm Hager - Es gilt die GPL
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )