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.
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:
Das WLAN hat dort die ESSID "UNIWL". Die IP-Konfiguration erfolgt via DHCP. Zusätzlich zwingt uns das Rechenzentrum zum Aufbau einer VPN-Verbindung.
Außerdem kennen wir einen öffentlichen, frei zugänglichen AP mit der ESSID "Any". Auch hier werden die Adressen via DHCP vergeben.
Hier steht unser Router mit der Adresse 192.168.1.1 und der MAC-Adresse 00:30:F1:E5:3D:93. DHCP hilft uns auch hier weiter.
Auch hier hat der Router leider die Adresse 192.168.1.1, aber dafür eine andere MAC-Adresse 00:50:D6:98:15:00. Hier erfolgt unsere Konfiguration leider statisch: IP 192.168.1.10, Subnet-Maske: 255.255.255.0, Nameserver 194.25.2.129.
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.
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.
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.
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:
#!/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
#!/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
#!/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
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.
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.
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.
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
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:
#!/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
#!/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
Ein anderer Fall wären z.B. verschiedene Freigaben für Samba in verschiedenen Netzwerkumgebungen. Hier hilft das Anlegen mehrere, spezialisierter Konfigurationsdateien, z.B.
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.