Autokonfiguration des Netzwerks für Laptops #

Das Problem #

Ich (ThomasBayen) setze meinen Laptop an unterschiedlichen Orten ein. Wenn ich z.B. beim LUG-Treffen sitze, bringe ich das Gerät mit und möchte mich dort gerne ins LUG-Netz einloggen. An sich kein Problem: PCMCIA-Netzwerkkarte einstecken und loslegen... aber Halt! So geht das leider nicht. Die Umgebung ist eine ganz andere, die Netzwerkparameter unterscheiden sich, etc. Da die Netzwerkkonfiguration immer auch Besonderheiten innerhalb der Distributionen bietet, ist diese Anleitung hier sehr Debian-spezifisch. Dennoch müssten die hier vorgestellten Ideen grundsätzlich auch auf anderen Distris umsetzbar sein.

Die sicherlich eleganteste Lösung ist, wenn man in jedem Netz, in dem man sich befindet, einen funktionierenden DHCP-Server hat. Dann wird die gesamte Konfiguration automatisch erledigt. Leider sind DHCP-Server nicht so verbreitet, wie es wünschenswert wäre, also ist diese Lösung nicht praktikabel genug.

Darüberhinaus gibt es besonderen Konfigurations-Bedarf bei WLAN-Netzen. Hier muss ggf. eine SSID und ein Schlüssel eingestellt werden. Dies geht nicht automatisch (wo kämen wir da hin, wenn man sich an einem verschlüsselten Netz automatisch anmelden könnte, ohne vorherden Schlüssel zu kennen...?).

Debian Woody #

Die Interface-Parameter für die Karte (und einige andere Netzwerk-Parameter) sind in /etc/pcmcia/network.opts festgelegt. Will ich also eine IP-Adresse im LUG-Netz bekommen, muss ich diese Datei von Hand ändern. Bin ich wieder zu Hause, ist eine erneute Änderung fällig.

Einfache Lösungen #

Eine Lösung, die ich vorher praktiziert habe, besteht darin, mehrere, jeweils richtig konfigurierte Dateien wie z.B. network.opts.lug und network.opts.home zu haben und diese jeweils vor dem Einstöpseln der PCMCIA-Karte auf den richtigen Platz zu kopieren.

Möglich wäre auch, die PCMCIA-Schemes zu benutzen. Dem Skript network.opts wird als erster Parameter ein Schema-Name übergeben, nach dem verschiedene Konfigurationen ausgewählt werden können. Der Schema-Name muss mit cardctl gesetzt werden. Dabei bleibt allerdings die Frage, wer cardctl aufruft. Das Schema muss nämlich schon gesetzt sein, bevor die Karte eingesteckt wird.

mögliche andere Lösungen #

Dennoch wäre es schön, wenn der Laptop selber erkennen könnte, wo er sich befindet. Bei genauerer Überlegung sollte es möglich sein, das herauszufinden. Auf meiner Suche bin ich dabei über folgende Debian-Pakete gestolpert, die sich mit dem Thema beschäftigen:

  • divine - (Beschreibung bezieht sich auf PCMCIA)
  • guessnet - (basiert auf laptop-netconf)
  • intuitively - (Beschreibung bezieht sich auf PCMCIA, basiert lt. manpage auf divine)
  • laptop-net
  • laptop-netconf
  • whereami
Ich habe mich mit diesen Paketen etwas beschäftigt und habe meine Erfahrungen auf LaptopNetzwerkAutokonfiguration/Pakete erfasst.

zu Bedenken #

...ist, das PCMCIA-Netzwerkkarten, jederzeit ein- und ausgestöpselt werden können. Die dynamische Konfiguration dieser Karten (in /etc/pcmcia/network.opts) läuft völlig anders ab, als die Konfiguration normaler, fest eingebauter Interfaces (über /etc/interfaces). Wer also einen Laptop mit einem integrierten Netzwerkanschluß hat, muss womöglich anders vorgehen. Unten sieht man jedoch, wie man die Konfiguration auf das normale Debian-System "umbiegen" kann.

Meine Lösung #

Für mich war wichtig, so wenig wie möglich neue Konfigurationsdateien und -formate einzuführen. Daher habe ich mich entschieden, zuerst mal die übliche PCMCIA-Netzwerk-Konfiguration auf das Verfahren für normale Devices, also die Datei /etc/network/interfaces umzustellen. Dort habe ich dann guessnet benutzt, um die Standorterkennung zu machen. Auf diese Art und Weise habe ich alle benötigten Einstellungen übersichtlich in nur einer einzigen Datei. Diese Methode funktioniert ohne Änderungen auch ohne PCMCIA, also z.B. bei einem Laptop mit integrierter Netzwerkkarte.

Diese Lösung ist übrigens auch genau die, auf die die Debian-Maintainer dann später auch gekommen sind, d.h. in späteren Debian-Versionen (Sarge) ist das genau so geregelt.

einmalige Anpassung von /etc/pcmcia/network.opts

Die Datei bleibt fast vollständig im unkonfigurierten Zustand, d.h. bootp, dhcp, etc. werden auf "n" gestellt und alle Netzwerk-Parameter stehen auf "". Dann wird ganz unten folgendes geändert:

  # Extra stuff to do after setting up the interface
  start_fn () { ifup $DEVICE; return; }
  # Extra stuff to do before shutting down the interface
  stop_fn () { ifdown $DEVICE; return; }

Durch diese Änderungen wird die normale PCMCIA-Konfiguration nicht mehr aufgerufen, dafür aber die normalen ifup/ifdown-Befehle. Jetzt geschieht die Konfiguration wie unter Sarge.

Erkennung von Netzwerken ohne DHCP unter Debian Sarge #

Konfiguration von /etc/network/interfaces #

  mapping eth0
        script /usr/bin/guessnet
        map 192.168.10.13 1:2:3:4:5:6 192.168.10.1 eth0-home
        map 192.168.11.13 7:8:9:0:1:2 192.168.11.1 eth0-lug
  iface eth0-home inet static
        address 192.168.10.13
        netmask 255.255.255.0
        broadcast 192.168.10.255
        gateway 192.168.10.1
        up echo -e "nameserver 192.168.10.1\ndomain bayen.loc" >/etc/resolv.conf
        down rm /etc/resolv.conf
  iface eth0-lug inet static
        address 192.168.11.13
        netmask 255.255.255.0
        broadcast 192.168.11.255
        gateway 192.168.11.1
        up echo -e "nameserver 192.168.11.1\ndomain lug.loc" >/etc/resolv.conf
        down rm /etc/resolv.conf
  iface eth0-none inet dhcp

Wie man sieht, befinden sich sowohl alle Netzwerk-Parameter der verschiedenen Standorte (inklusive Nameserver) als auch die Informationen zur Standorterkennung (MAC-Adresse) übersichtlich in nur einer einzigen Datei. Voila! -- ThomasBayen

Erkennung von WLAN-Zellen #

Während ich oben mit "guessnet" arbeite, um die Netze zu erkennen, gibt es kein vergleichbares Programm, um Access Points zu erkennen. Also habe ich eines geschrieben:

/etc/network/detect-ap

<nowiki>
  #!/usr/bin/perl
  # Access Point Erkennung von Thomas Bayen
  open STDIN, '-';
  $erg='wlan';
  while(<STDIN>){
    chomp;
    # macht man die Abfrage zweimal hintereinander, werden die
Ergebnisse besser:
    system "( iwlist $ARGV[0] scan; sleep 1; ) >>/dev/null";
    open CELLS, "iwlist $ARGV[0] scan | grep ESSID |";
    $mapping=$_;
    @erg= grep $_, map {/ESSID:"($mapping)"/ ? $1 : undef}
<CELLS>;
    $erg .= "-$erg[0]" if @erg;
  }
  system "logger 'known wireless cell detected: $erg'";
  print $erg;
</nowiki>

Jetzt muss dieses Skript noch ausführbar gemacht werden und kann dann aus /etc/network/interfaces aufgerufen werden:

  chmod a+x /etc/network/detect-ap

Auszug aus /etc/network/interfaces

  # WLAN-Erkennung von Access Points:
  mapping eth1
        script /etc/network/detect-ap
        map homeLAN
        map LUG
  # Einstellungen für zu Hause:
  iface wlan-homeLAN inet dhcp
        WIRELESS_ESSID homeLAN
        WIRELESS_KEY 1234-5678-90
  # Einstellungen, wenn ich in der LUG bin:
  iface wlan-LUG inet dhcp
        WIRELESS_ESSID LUG
        WIRELESS_KEY 1234-5678-9012-3456-7890-1234-56
        # hier kann ich z.B. ein VPN zu mir nach Hause aufbauen:
        up /etc/init.d/openvpn start
        down /etc/init.d/openvpn stop
  # Standard-Einstellung: Finde ich nichts, gibts vielleicht ein unverschlüsseltes WLAN:
  iface wlan inet dhcp

Als Name des Netzwerkes bei map ... und bei iface wlan-... dient die ESSID des Netzes. Wer übrigens seine ESSID versteckt (was ja aus Sicherheitsgründen immer empfohlen wird), kann dieses Skript nicht benutzen. Wer sein WLAN versteckt, braucht sich nämlich nicht zu wundern, wenn man es dann nicht finden kann... -- ThomasBayen

Kabelstöpseln #

Alles oben gesagte geht davon aus, daß wir irgendein Netzwerk haben und dann herausfinden wollen, welches das denn nun ist. Alle diese schönen Programme laufen aber nur, wenn sie gestartet werden, d.h. normalerweise beim hochfahren des Rechners. Falls dann jedoch kein Netzwerkkabel eingestöpselt ist, passiert erstmal nichts. Hier hilft ifplugd. Dieser beobachtet ein Interface und sobald ein Netzwerkkabel ein- oder ausgestöpselt wird (was fast alle modernen Netzwerkkarten merken), startet es ifup/ifdown. Dieses einfache und praktische Tool kann man einfach mit

  aptitude install ifplugd

installieren und fertig! :-)

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-3) was last changed on 15-Nov-2006 08:40 by MarkusMonderkamp