Next Previous Contents

3. Netzwerkverbindung automatisch konfigurieren

Nachdem unser System nun in der Lage ist, vorhandene Netzwerke als solche zu erkennen und im Falle eines WLAN auch eine Verbindung aufzubauen, kommen wir nun zum eigentlichen Kern: Wir wollen herausfinden, in welchem Netzwerk wir uns befinden.

Dazu werden wir zunächst guessnet installieren und konfigurieren. Die übrigen Konfiguration werden wir dann über spezielle Skripte automatisieren.

3.1 IP-Konfiguration

Zunächst einmal benötigen wir guessnet. Auch hier reicht ein einfaches

(sudo) apt-get install guessnet

völlig aus. Falls nicht bereits geschehen, empfiehlt es sich außerdem, resolvconf zu installieren. Da dieses Paket von dhcp3-client vorgeschlagen wird, sollte es in der Regel aber bereits installiert sein. Ansonsten hilft:

(sudo) apt-get install resolvconf

Nun machen wir erst einmal eine Sicherúngskopie unserer IP-Konfiguration

(sudo) cp -a /etc/network/interfaces /etc/network/interfaces.alt

und öffnen dann die Konfigurationsdatei

/etc/network/interfaces

Als nächstes entfernen wir alle bestehenden Einstellungen, so daß unsere Datei nur noch aus zwei Zeilen besteht:

auto lo
iface lo inet loopback

Diese Zeilen konfigurieren das Loopback-Interface und sind unabhängig davon, in welchem Netzwerk wir uns befinden. Wichtig ist, daß in der "auto"-Zeile nur das lo Interface aufgeführt ist und ansonsten keine auto-Zeilen existieren. Das Aktivieren der übrigen Interfaces übernimmt der ifplugd bei Bedarf. Im folgenden nehmen wir an, daß wir uns in folgenden Netzwerken aufhalten:

Wichtig ist es, eindeutige Charakteristika für die vorliegenden Netzwerke zu finden. Bei WLANs ist dies dank der ESSID meist sehr einfach. Auch hat man selten mehrere kabelgebundene Netzwerke, in denen exakt diesselben IP-Adressen und nur diese vergeben sind. In diesem Beispiel soll dies dennoch der Fall sein, um zu zeigen, daß notfalls ein Test der MAC-Adresse diese Eindeutigkeit immer liefern kann. Dafür ist allerdings die Kenntnis der MAC erforderlich. Diese läßt sich über Aufkleber auf dem Gerät, mittels ifconfig (lokal unter Linux) oder auch über das Netzwerk mittels "arping" (apt-get install iputils-arping) herausfinden.

In unserem Fall sieht die Datei /etc/network/interfaces dann so aus:

auto lo
#####################################################
### Definition des Loopback-Interfaces ##############

iface lo inet loopback


#####################################################
### Definition der bekannten eth0-Umgebungen ########

mapping eth0
    script /usr/sbin/guessnet-ifupdown
    map zuhause
    map kumpel
    map default: none
    map timeout: 20
    map verbose: true

iface zuhause inet dhcp
    iptables trusted
    test1 peer address 192.168.1.1 mac 00:30:F1:E5:3D:93

iface kumpel inet static
    iptables trusted
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 194.25.2.129
    test1 peer address 192.168.1.1 mac 00:50:D6:98:15:00


#####################################################
### Definition der bekannten wlan0-Umgebungen #######

mapping wlan0
    script /usr/sbin/guessnet-ifupdown
    map uni
    map offen
    map default: none
    map timeout: 20
    map verbose: true

iface uni inet dhcp
    iptables vpn
    test1 wireless essid UNIWL

iface offen inet dhcp
    iptables strict
    test1 wireless essid Any

Soweit, so gut. Was hier passiert, sollte recht einfach zu verstehen sein. Die beiden mapping-Blöcke beziehen sich auf die echten Netzwerkinterfaces. Die Skript-Zeile ruft beim Hochfahren guessnet auf, um die einzelnen Profile zu testen. Die möglichen Profile werden in den map-Zeilen referenziert und in den zugehörigen iface-Blöcken näher definiert.

Die Konfiguration in den Blöcken erfolgt so, wie man es auch sonst gewohnt ist. dhcp verwendet die automatische Konfiguration mittels DHCP-Server, static eine statische Konfiguration. Eine vollständige Übersicht über alle Konfigurationsmöglichkeiten bietet hier "man interfaces".

Die test1-Zeilen definieren für jeden Block einen Test. Es zeigt sich, daß die Tests bei WLANs sehr einfach ausfallen. Kabelgebundene Netzwerke erfordern eine kurze Analyse der verfügbaren Umgebung - wie hier z.B. ein Test nach den verfügbaren Routern. Es können dabei auch mehrere Tests definiert werden. Weitere Tests werden mit Zeilen test2, test3, test4, ... statt mit test1 eingeleitet. Es muß allerdings nur einer der angegebenen Tests erfolgreich sein. Guessnet wählt dabei immer das Netzwerk aus, bei dem der Test als erstes anschlägt.

Man kann auch ein Default-Profil anlegen. Dazu ergänzt man folgende Zeilen in der Datei /etc/network/interfaces:

#####################################################
### Definition einer unbekannten Default-Umgebung ###

iface none inet dhcp
    iptables strict

Sollte guessnet nicht in der Lage sein, ein Profil zu erkennen, wird einfach das Default-Profil geladen. Dies würde bei der vorliegenden Konfiguration dazu führen, daß der Rechner nach einem DHCP-Server sucht und diesen nach einer Konfiguration fragt. So hat man auch in unbekannten Netzwerken eine gewisse Chance, zumindest eine Basiskonfiguration des Netzwerkes zu erhalten.

Anpassen der MTU

Manche Netzwerke - z.B. solche, die über ein DSL-Modem ans Internet angebunden sind - erfordern eine Anpassung der Standard-MTU. Für statisch konfigurierte Schnittstellen fügt man dem betreffenden iface-Block die Zeile

mtu 1492

hinzu, um die MTU auf 1492 statt standardmäßig 1500 festzulegen. Dies funktioniert allerdings nicht, wenn das Interface via dhcp konfiguriert wird. Hier hilft ein

post-up ifconfig eth0 mtu 1492

um nach dem Zustandekommen der Verbindung die MTU mittels ifconfig auf 1492 festzulegen.

3.2 Angepaßte Firewall mit Iptables

Es gibt verschiedene Ansätze, Firewallregeln via iptables unter Linux zu konfigurieren. In unserem Beispiel fällt das Laden zum Bootzeitpunkt natürlich weg, da wir uns an die Netzwerkumgebung anpassen wollen und nebenbei auch nicht wissen, welches Interface wann aktiv ist. Außerdem wollen wir in verschiedenen Netzwerkumgebungen unsere Firewall unterschiedliche restriktiv konfigurieren. So empfiehlt sich im Falle unseres öffentlichen Accesspoints sicherlich keine allzu großzügige Freigabe von Diensten, während wir an der Universität zumindest für den VPN-Dienst einige Ports öffnen müssen. Umgekehrt wollen wir zuhause noch etliche weitere Netzwerkdienste verwenden.

Daher werden wir ein einfaches Skript zum Laden und Entfernen von Firewallregeln schreiben und dieses dynamisch starten, wenn ein Netzwerkinterface aktiviert bzw. deaktiviert wird.

Die Idee

Das Verzeichnis /etc/network/if-up.d enthält alle Skripte, die nach dem erfolgreichen Aktivieren einer Netzwerkschnittstelle (und zwar irgendeiner) geladen werden. Das Gegenstück /etc/network/if-down.d wird vor dem Deaktivieren ausgeführt.

Für das Laden angepaßter Regeln nutzen wir aus, daß in der Datei /etc/network/interfaces beliebige Variablen definiert werden können, die den Skripten biem Start übergeben werden. So erhalten wir mit der oben in unserem Beispiel definierten Zeile

iptables trusted

in unseren Skripte eine Variable

IF_IPTABLES="trusted"

Mit diesem Wissen können wir die folgenden Dateien anlegen:

/etc/network/if-up.d/010iptables_load

#!/bin/sh

# Dieses Skript lädt die Firewall-Regeln für ein definiertes Interface

############################
### Variablendefinitionen

IPTABLES="/sbin/iptables"
IFCONFIG="/sbin/ifconfig"
AWK="/usr/bin/awk"
GREP="/bin/grep"
UNIVERSE="0.0.0.0/0"
VPNSERVER="131.246.250.250"
TRUSTED=0
VPN=0
STRICT=0

echo "Lade Netzwerkcharakteristika: "

##############################
### Netzwerkdaten ermitteln

if [ "$IF_ADDRESS" = "" ]; then
   IF_ADDRESS="`$IFCONFIG $IFACE | $AWK /$IFACE/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
fi

IF_NETWORK="$IF_ADDRESS/24"

echo "  Schnittstelle:               $IFACE"
echo "  Adresse der Schnittstelle:   $IF_ADDRESS"
echo "  Netzwerk der Schnittstelle:  $IF_NETWORK"

################################
### Iptables-Profil bestimmen

case $IF_IPTABLES in
   trusted)
      TRUSTED=1
      VPN=1
   ;;
   vpn)
      VPN=1
   ;;
   *)
      STRICT=1
   ;;
esac

echo "  Netzwerkprofil:              $IF_IPTABLES"

#############################
### Setze Default Policies

echo -en "Setze Standardregel: "
echo -en "[INPUT] "
$IPTABLES -P INPUT DROP
echo -en "[OUTPUT] "
$IPTABLES -P OUTPUT ACCEPT
echo -e "[FORWARD]"
$IPTABLES -P FORWARD DROP

echo -en "Lade Regeln: "

#############################################################
### Erstelle Drop-And-Log Chain, falls sie nicht existiert

if [ ! -n "`$IPTABLES -nL | $GREP drop-and-log-it`" ]; then
   echo -en "[CHAINS] "
   $IPTABLES -N drop-and-log-it
   $IPTABLES -A drop-and-log-it -j LOG --log-level info
   $IPTABLES -A drop-and-log-it -j DROP
fi
########################################################################
### Falls die Catch-All-Regel schon existiert, diese vor dem Anhängen
### weiterer Ausnahmen löschen!

if [ -n "`$IPTABLES -nL | $GREP "drop-and-log-it  all  --  0.0.0.0/0            0.0.0.0/0"`" ]; then
   $IPTABLES -D INPUT -j drop-and-log-it
fi
echo -en "[INPUT] "

#######################
### Regeln erstellen

case $IFACE in
   lo)
      # localhost darf alles
      $IPTABLES -A INPUT -i lo -j ACCEPT
   ;;
   wlan0|eth0)
      #########################################
      ### Diese Regeln sind unbedingt notwendig

      # ICMP im lokalen Netzwerk erlauben
      $IPTABLES -A INPUT -i $IFACE -s $IF_NETWORK -d $IF_ADDRESS -p ICMP -j ACCEPT

      # ICMP vom eigenen Rechner erlauben
      $IPTABLES -A INPUT -i $IFACE -s $IF_ADDRESS -d $IF_NETWORK -p ICMP -j ACCEPT

      # Existierende Verbindungen erlauben
      $IPTABLES -A INPUT -s $UNIVERSE -d $IF_ADDRESS -m state --state ESTABLISHED,RELATED -j ACCEPT

      ##############################
      ### Regeln für Profil: TRUSTED

      if [ $TRUSTED -eq 1 ]; then
         # Samba erlauben
         $IPTABLES -A INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p UDP --dport 137:139 -j ACCEPT
         $IPTABLES -A INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p TCP --dport 137:139 -j ACCEPT

         # CUPS-Broadcasts erlauben
         $IPTABLES -A INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p UDP --dport 631 -j ACCEPT
      fi

      ###########################
      ### Regeln für Profile: VPN

      if [ $VPN -eq 1 ]; then
         # VPN ins Rechenzentrum erlauben
         $IPTABLES -A INPUT -s $VPNSERVER -d $IF_ADDRESS -p UDP --dport 500 -j ACCEPT
         $IPTABLES -A INPUT -s $VPNSERVER -d $IF_ADDRESS -p UDP --dport 10000 -j ACCEPT
         $IPTABLES -A INPUT -s $VPNSERVER -d $IF_ADDRESS -p TCP --dport 10000 -j ACCEPT
         $IPTABLES -A INPUT -s $VPNSERVER -d $IF_ADDRESS -p 50 -j ACCEPT
      fi

      ##################
      ### Catchall-Regel

      $IPTABLES -A INPUT -j drop-and-log-it

   ;;
esac
echo -e "[OK]"
exit 0

Was macht dieses Skript? Wenn ein neues Interface (lo, eth0 oder wlan0) aktiviert wird, bestimmt es die zugehörige Netzwerkkonfiguration und konfiguriert die Firewall. Dazu wird zuerst eine Default-Policy festgelegt. Hierbei werden eingehende Pakete immer abgelehnt, ausgehende Pakete immer zugelassen. Danach wird die Chain "drop-and-log-it" erstellt (falls diese nicht schon vorher angelegt wurde). Sollte bei einem früheren Aufruf des Skripts bereits die Catch-All-Regel angelegt worden sein, müssen wir diese nochmal entfernen, bevor wir neue Firewall-Regeln einfügen können.

Bei den übrigen Regeln ist dieses Skript sehr einfach gehalten. Wird das Interface lo (Loopback) hochgefahren (normalerweise automatisch während dem Booten), erhält es die Erlaubnis, allen eingehenden Verkehr zu akzeptieren.

Wird eines der beiden Netzwerkinterfaces (eth0 oder wlan0) aktiviert, werden der ICMP-Verkehr für das lokale Netzwerk, für den eigenen Rechner sowie bestehende Verbindungen erlaubt. Diese drei ersten Regeln sollten nicht entfernt werden. Danach wird überprüft, ob irgendwelche speziellen Profile für die Firewall ausgewählt wurden. Wurde z.B. "trusted" angegeben, werden zusätzlich beispielhaft die Ports für Samba und CUPS-Broadcasts freigegeben. Wurde "vpn" angegeben, werden Firewallregeln für den $VPNSERVER geladen (hier beispielhaft für eines der häufig eingesetzten Cisco-Geräte). Man sollte beachten, daß in diesem Skript die VPN-spezifischen Regeln auch bei Angabe von "trusted" geladen werden. Wer dies nicht möchte, kann dies im Abschnitt "Iptables-Profil bestimmen" des Skripts ändern.

Am Ende folgt wieder die Catch-All-Regel: Alles, was vorher nicht erlaubt wurde, wird in die Chain "drop-and-log-it" weitergeleitet. Diese schreibt eine Information ins Protokoll und verwirft das Paket dann.

Einfache (und weniger einfache) Anpassungen an diesem Beispielskript sollten kein Problem sein. Eine sehr umfangreiche Einführung in iptables findet sich z.B. unter http://iptables-tutorial.frozentux.net/.

Wenn das Skript erstellt wurde, müssen die Rechte noch entsprechend gesetzt werden, damit das Skript auch ausführbar ist:

(sudo) chmod 750 /etc/network/if-up.d/010iptables_load

/etc/network/if-down.d/030iptables_unload

#!/bin/sh

# Dieses Skript löscht die Firewall-Regeln für ein definiertes Interface

############################
### Variablendefinitionen

IPTABLES="/sbin/iptables"
IFCONFIG="/sbin/ifconfig"
AWK="/usr/bin/awk"
UNIVERSE="0.0.0.0/0"
VPNSERVER="131.246.250.250"
TRUSTED=0
VPN=0
STRICT=0

echo "Lade Netzwerkcharakteristika: "

##############################
### Netzwerkdaten ermitteln

if [ "$IF_ADDRESS" = "" ]; then
   IF_ADDRESS="`$IFCONFIG $IFACE | $AWK /$IFACE/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
fi

IF_NETWORK="$IF_ADDRESS/24"

echo "  Schnittstelle:               $IFACE"
echo "  Adresse der Schnittstelle:   $IF_ADDRESS"
echo "  Netzwerk der Schnittstelle:  $IF_NETWORK"

################################
### Iptables-Profil bestimmen

case $IF_IPTABLES in
   trusted)
      TRUSTED=1
      VPN=1
   ;;
   vpn)
      VPN=1
   ;;
   *)
      STRICT=1
   ;;
esac

echo "  Netzwerkprofil:              $IF_IPTABLES"

echo -en "Lösche Regeln: "
echo -en "[INPUT] "

#####################
### Regeln löschen

case $IFACE in
   lo)
      # localhost darf alles
      $IPTABLES -D INPUT -i lo -j ACCEPT
   ;;
   wlan0|eth0)
      #########################################
      ### Diese Regeln sind unbedingt notwendig

      # ICMP im lokalen Netzwerk erlauben
      $IPTABLES -D INPUT -i $IFACE -s $IF_NETWORK -d $IF_ADDRESS -p ICMP -j ACCEPT

      # ICMP vom eigenen Rechner erlauben
      $IPTABLES -D INPUT -i $IFACE -s $IF_ADDRESS -d $IF_NETWORK -p ICMP -j ACCEPT

      # Existierende Verbindungen erlauben
      $IPTABLES -D INPUT -s $UNIVERSE -d $IF_ADDRESS -m state --state ESTABLISHED,RELATED -j ACCEPT

      ##############################
      ### Regeln für Profil: TRUSTED

      if [ $TRUSTED -eq 1 ]; then
         # Samba erlauben
         $IPTABLES -D INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p UDP --dport 137:139 -j ACCEPT
         $IPTABLES -D INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p TCP --dport 137:139 -j ACCEPT

         # CUPS-Broadcasts erlauben
         $IPTABLES -D INPUT -i $IFACE -s $IF_NETWORK -d $IF_NETWORK -p UDP --dport 631 -j ACCEPT
      fi

      ###########################
      ### Regeln für Profile: VPN

      if [ $VPN -eq 1 ]; then
         # VPN ins Rechenzentrum erlauben
         $IPTABLES -D INPUT -s $VPNSERVER -d $IF_ADDRESS -p UDP --dport 500 -j ACCEPT
         $IPTABLES -D INPUT -s $VPNSERVER -d $IF_ADDRESS -p UDP --dport 10000 -j ACCEPT
         $IPTABLES -D INPUT -s $VPNSERVER -d $IF_ADDRESS -p TCP --dport 10000 -j ACCEPT
         $IPTABLES -D INPUT -s $VPNSERVER -d $IF_ADDRESS -p 50 -j ACCEPT
      fi
   ;;
esac
echo -e "[OK]"
exit 0

Dieses Skript macht nun praktisch alles umgekehrt. Es löscht die Regeln (Paramter -D statt -A im iptables-Befehl), die für das Interface vorher erstellt wurden und beachtet dabei auch wieder die spezifizierten Profile. Alle anderen Firewall-Regeln bleiben unberührt. Dazu müssen alle Regeln, die im vorherigen Skript angelegt wurden, hier auch wieder explizit zum Entfernen aufgeführt werden. Daran sollte man denken, wenn man das vorhergehende Skript an eigene Bedürfnisse angepaßt hat.

Auch hier sollte man nicht vergessen:

(sudo) chmod 750 /etc/network/if-down.d/030iptables_unload

/etc/network/iptables_clear

#!/bin/sh
# Lösche alle Firewall-Regeln und setze eine Default-Policy.

# Variablendefinitionen
IPTABLES="/sbin/iptables"
GREP="/bin/grep"

case $1 in
   DROP|ACCEPT)
      echo -en "Setze Default Policy und lösche Regeln: "

      echo -en "[INPUT] "
      $IPTABLES -P INPUT $1
      $IPTABLES -F INPUT

      echo -en "[OUTPUT] "
      $IPTABLES -P OUTPUT $1
      $IPTABLES -F OUTPUT

      echo -e "[FORWARD]"
      $IPTABLES -P FORWARD DROP
      $IPTABLES -F FORWARD

      echo -en "Leere übrige Chains: "
      if [ -n "`$IPTABLES -nL | $GREP drop-and-log-it`" ]; then
         $IPTABLES -F drop-and-log-it
      fi

      # Lösche alle selbst erstellten Chains
      $IPTABLES -X

      # Setze alle IPTABLES Counters zurück
      $IPTABLES -Z
      echo -e "[$1]"
   ;;
   *)
      echo "Verwende $0 DROP|ACCEPT"
   ;;
esac
exit 0

Dieses Skript dient mehr zu Test-Zwecken. Sollte mit einem der vorher erstellten Firewall-Skripte ein Problem auftreten, kann man mit einem bequemen

/etc/network/iptables_clear ACCEPT

alle Regeln löschen und das Netzwerk vollständig freigeben (oder mit DROP vollständig sperren). Auch hier gilt wieder

(sudo) chmod 750 /etc/network/iptables_clear

3.3 Weitere Anpassungen

Weitere Anpassungen der Netzwerkumgebung wie z.B. Proxy-Server, Mail-Server oder ähnliches können auf diesselbe Art und Weise vorgenommen werden. Neben einfachen Sachen wie dem Starten oder Stoppen von Diensten lassen sich mit den entsprechenden Shell-Skripten auch Samba-Freigaben oder komplexere Server-Konfigurationen dynamisch anpassen. Hier sollen noch einige einfache Ideen beispielhaft angeführt werden. Die Möglichkeit, Skripte aller Art (nicht nur Shell-Skripten) in die Netzwerkkonfiguration einbinden zu können, setzt der Phantasie nahezu keine Grenzen - das nötige eigene Know-How natürlich vorrausgesetzt.

Die nachfolgenden Ideen und Skripte können auch als Basis für eigene Skripte dienen und dürften alle für den durchschnittlichen Anwender interessanten Fälle bereits abdecken.

einfache Proxy-Konfiguration

Hier kann u.U. ein einfaches

post-up export http_proxy=http://proxy:3128

schon helfen. Natürlich läßt sich auch dies mit einem angepaßten Skript erledigen, das z.B. auch die Proxy-Einstellungen spezieller Software ändert, die mit der Umgebungsvariable $http_proxy nichts anfangen kann/will.

Dienste starten/stoppen

Nehmen wir an, das eigene Notebook soll zuhause via Samba mit Windows-Rechnern kommunizieren, soll aber z.B. in einer anderen Umgebung keine Daten freigeben. Man könnte die betreffenden Ports via Firewall dichtmachen. Sicherer ist es aber natürlich, den betreffenden Dienst gar nicht erst laufen zu lassen. Außerdem spart es uns u.U. noch ein wenig Zeit beim Hochfahren des Rechners. Dazu schalten wir zunächst den Autostart ab. Unerfahrene Anwender seien hier auf "rcconf" für die Konsole oder ksysv für KDE verwiesen. Für die Kommandozeile bietet sich hierzu z.B. "update-rc.d" an.

einfache Lösung:

Für alle Netzwerkkonfigurationen, die Samba benötigen, fügen wir die beiden folgenden Zeilen ein:

post-up /etc/init.d/samba start
pre-down /etc/init.d/samba start

flexiblere Lösung:

Statt alle Anwendungen über einzelne Skript-Zeilen zu starten, können wir stattdessen - analog zum Firewall-Beispiel - verschiedene Profile definieren, für die unterschiedliche Dienste gestartet werden. Außerdem läßt sich zusammen mit dem Ansatz aus angepaßte Serverkonfigurationen hiermit ein mächtiges Werkzeug zur Diensteanpassung schreiben.

In unserem bisher verwendeten Beispiel galten die Netzwerke "kumpel" und "zuhause" als vertrauenswürdig und haben entsprechend in unserem Firewallskript auch Portfreigaben für Samba erhalten. Wir passen die beiden Blöcke in der /etc/network/interfaces nun weiter an:

iface zuhause inet dhcp
    iptables trusted
    services trusted
    test1 peer address 192.168.1.1 mac 00:30:F1:E5:3D:93

iface kumpel inet static
    iptables trusted
    services trusted
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 194.25.2.129
    test1 peer address 192.168.1.1 mac 00:50:D6:98:15:00

Man bemerke die ergänzte Zeile "services trusted". Wieder benötigen wir zwei Skripte:

/etc/network/if-up.d/020services

#!/bin/sh
# Dieses Skript startet - falls nötig - verschiedene Dienste abhängig
# von der vorhandenen Netzwerkumgebung.

############################
### Variablendefinitionen

PS="/bin/ps"
GREP="/bin/grep"
SAMBA_FILE="/tmp/autoservice_samba"
SAMBA_INIT="/etc/init.d/samba"
TRUSTED=0

echo "Lade Dienste für Profil: $IF_SERVICES"

################################
### Services-Profil bestimmen

case $IF_SERVICES in
   trusted)
      TRUSTED=1
   ;;
   *)
      exit 0
   ;;
esac

######################
### Dienste starten

###############################
### Dienste für Profil: TRUSTED

if [ $TRUSTED -eq 1 ]; then

   ################
   ### Starte Samba

   if [ -n "`$PS -A | $GREP smbd`" ]; then
      echo "($IFACE) Starte Samba neu..."
      $SAMBA_INIT restart
      echo $IFACE >> $SAMBA_FILE
   else
      echo "($IFACE) Starte Samba..."
      $SAMBA_INIT start
      echo $IFACE > $SAMBA_FILE
   fi
fi

exit 0

Das Skript funktioniert prinzipiell wie das Firewall-Skript. Wurde "services trusted" angegeben, wird zunächst geprüft, ob Samba bereits gestartet wurde und evtl. nur neugestartet werden muß - ansonsten wird Samba regulär gestartet. In allen anderen Fällen, wird das Skript direkt beendet.

Das Skript schreibt nach dem (Neu-)Start von Samba den Namen der gerade aktivierten Netzwerkschnittstelle in die Datei "/tmp/autoservice_samba". Genauer wird sie an die Datei angehängt, wenn bereits ein Samba läuft, und ersetzt die Datei, wenn Samba nicht bereits läuft. Wieso wir das tun, wird im nächsten Skript deutlich. Auch hier sollte man wieder nicht vergessen:

(sudo) chmod 750 /etc/network/if-up.d/020services

/etc/network/if-down.d/020services

#!/bin/sh
# Dieses Skript beendet - falls nötig - verschiedene Dienste abhängig
# von der vorhandenen Netzwerkumgebung.

############################
### Variablendefinitionen

GREP="/bin/grep"
SAMBA_FILE="/tmp/autoservice_samba"
SAMBA_INIT="/etc/init.d/samba"
TRUSTED=0

echo "Beende Dienste für Profil: $IF_SERVICES"

################################
### Services-Profil bestimmen

case $IF_SERVICES in
   trusted)
      TRUSTED=1
   ;;
   *)
      exit 0
   ;;
esac

######################
### Dienste beenden

###############################
### Dienste für Profil: TRUSTED

if [ $TRUSTED -eq 1 ]; then
#!/bin/sh
# Dieses Skript startet - falls nötig - verschiedene Dienste abhängig
# von der vorhandenen Netzwerkumgebung.

############################
### Variablendefinitionen

PS="/bin/ps"
GREP="/bin/grep"
SAMBA_FILE="/tmp/autoservice_samba"
SAMBA_INIT="/etc/init.d/samba"
TRUSTED=0

echo "Lade Dienste für Profil: $IF_SERVICES"

################################
### Services-Profil bestimmen

case $IF_SERVICES in
   trusted)
      TRUSTED=1
   ;;
   *)
      exit 0
   ;;
esac

######################
### Dienste starten

###############################
### Dienste für Profil: TRUSTED

if [ $TRUSTED -eq 1 ]; then
   ################
   ### Beende Samba

   OPEN_IFACE=`$GREP "$IFACE" $SAMBA_FILE`
   OPEN_OTHER=`$GREP -v "$IFACE" $SAMBA_FILE`

   if [ "$OPEN_OTHER" != "" ]; then
      echo "($IFACE) Starte Samba neu..."
      $SAMBA_INIT restart
      echo $OPEN_OTHER > $SAMBA_FILE
   else
      echo "($IFACE) Beende Samba..."
      $SAMBA_INIT stop
      rm $SAMBA_FILE
   fi
fi

exit 0

Dieses Skript macht wieder fast alles in umgekehrter Reihenfolgen. Doch wozu benötigen wir nun /tmp/autoservice_samba?

Das vorherige Skript in if-up.d schreibt die aktivierte Schnittstelle in diese Datei, um dem System mitzuteilen, daß diese Schnittstelle den Samba-Dienst verwenden will. Bei Deaktivieren einer Schnittstelle prüft das Skript in if-down.d nun zunächst, ob eine andere Netzwerkschnittstelle als die, die gerade deaktiviert wird, ihren Anspruch auf den Samba-Dienst geltend gemacht hat. Ist das der Fall, wird Samba nur kurz neugestartet und der Anspruch der Schnittstelle auf Samba wird aus der Datei /tmp/autoservice_samba entfernt. Ansonsten wird Samba beendet und die genannte Datei gelöscht.

Doch wozu dieser Umstand? Hat man zwei Netzwerkschnittstellen gleichzeitig in verschiedenen Netzwerken aktiv, die beide den Samba-Dienst benötigen und man klinkt sich nun aus einem der Netzwerke aus (z.B. indem man das Netzwerkkabel herauszieht), soll der Dienst für das andere Netzwerk trotzdem noch erhalten bleiben. Ansonsten macht der gleichzeitige Einsatz in mehreren Netzwerken aber noch einige andere Probleme, wie man unter Mehrere verfügbare Verbindungen nachlesen kann. Wenn man einen solchen Einsatz ohnehin nicht einplant, kann man die betreffenden Zeilen ohne Bedenken aus dem Skript entfernen.

Und hier sollte man ebenfalls nicht vergessen:

(sudo) chmod 750 /etc/network/if-down.d/020services

angepaßte Serverkonfigurationen

Ein anderer Fall wären z.B. verschiedene Freigaben für Samba in verschiedenen Netzwerkumgebungen. Hier hilft das Anlegen mehrere, spezialisierter Konfigurationsdateien, z.B.

  1. /etc/samba/smb_zuhause.conf
  2. /etc/samba/smb_kumpel.conf

Die eigentliche "Konfigurationsdatei" smb.conf ist dann nur ein Symlink auf die gerade benötigte Konfiguration, z.B. smb_zuhause.conf. Dies läßt sich prinzipiell mit jeder Software machen und erlaubt sehr einfach, spezialisierte Konfigurationen zu erstellen - wenn man sie benötigt.

Wird das betreffende Interface hochgefahren, löscht ein Skript den alten Symlink und legt einen neuen auf die benötigte Konfigurationsdatei an. Dieser Ansatz läßt sich auch sehr einfach in das vorherige Skript integrieren, indem man folgenden Code direkt vor dem Neustart von Samba ausführt:

rm /etc/samba/smb.conf
ln -s /etc/samba/smb_$IF_PROFIL.conf /etc/samba/smb.conf

Vorausgesetzt wird hier, daß die betreffenden iface-Blöcke in der /etc/network/interfaces entsprechend durch eine Zeile "profil zuhause" bzw. "profil kumpel" ergänzt wurden.

Für den vorhin beschriebenen Fall des Betriebs in mehreren Netzwerken gleichzeitig, sollte man beachten, daß dies aus naheliegenden Gründen mit angepaßten Serverkonfigurationen nicht ohne weiteres vereinbar ist.


Next Previous Contents