= 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|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 ====
<pre><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></pre>

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! :-)