DPotW: guessnet-ifupdown
guessnet-ifupdown ist die von mir präferierte Lösung für das Problem eines mobilen Hosts, der mal dort und mal dort ans Netz angeschlossen wird, und die DHCP-Server in den verschiedenen Netzen einem zwar IP und Defaultgateway geben mögen, aber andere Einstellungen trotzdem lokal geregelt werden müssen.
Ich mag guessnet-ifupdown aus der guessnet-Package deswegen, deswegen, weil es sich schön in die Debian-Philosophie der Netzkonfiguration einfügt: Es wird über /etc/network/interfaces konfiguriert:
mapping eth0
script /usr/sbin/guessnet-ifupdown
map default: default
map timeout: 3
map verbose: true
iface l21 inet dhcp
scheme l21
route_silo silo unreachable
route_lilo lilo unreachable
exim4_smarthost smtp 25
web_proxy web.proxy 8080
ntp ntp
cron_apt yes
cups yes
test-peer address 192.168.130.1
iface expensive inet manual
scheme expensive
route_silo silo unreachable
route_lilo lilo unreachable
exim4_smarthost q.bofh.de 25
web_proxy none
cron_apt refrain
iface disconnected inet manual
scheme disconnected
route_unreach 0.0.0.0/0 unreachable
up ip link set dev eth0 down
exim4_smarthost defer_always
web_proxy none
test missing-cable
Zusätzlich verwende ich ifplugd, um das Interface beim Einstecken des Netzwerkkabels "up" zu setzen. In der Folge wird guessnet-ifupdown aufgerufen, das einige Prüfungen durchführt (das sind die test-Klauseln in der /e/n/i). Als Tests stehen zur Verfügung:
- Wird ein System mit bestimmter IP/MAC-Adresse gefunden?
- Ist ein Kabel gesteckt?
- Welchen Wert liefert ein Kommando zurück?
- Ist ein PPPoE?-Server im Netz?
Abhängig von den Tests wird das Interface dann so initialisiert, wie in der entsprechenden Stanza genannt. In meinem Beispiel L21 ist das DHCP, wobei es auch möglich ist, bei Abwesenheit eines DHCP-Servers nach einem System mit bestimmter IP-Adresse zu suchen, um dann eine zum Gegenstück passende statische IP-Adresse zu konfigurieren.
Die anderen Zeilen in den Stanzas steuern Scripte, die in /etc/network/if-up.d und /etc/network/if-down.d dafür sorgen, dass die Einstellungen bei der Interfaceinitialisierung ins System geprügelt werden. Hier ein Beispiel:
$ cat web-proxy
#!/bin/bash
# Environment:
# MODE = { start | stop }
# IF_WEB_PROXY = hostname port
# TODO: Exceptions
USEFILE="/etc/use-proxy"
PACFILE="/etc/proxy.pac"
if [ -z "$IF_WEB_PROXY" ]; then
exit 0
fi
if [ "$MODE" = "stop" ]; then
rm -f $USEFILE
rm -f $PACFILE
exit 0
fi
if [ "$IF_WEB_PROXY" = "none" ]; then
rm -f $USEFILE
rm -f $PACFILE
exit 0
fi
PORT="${IF_WEB_PROXY#\* }"
HOST="${IF_WEB_PROXY% *}"
cat < $USEFILE
#!/bin/bash
export http_proxy=http://$HOST:$PORT/
export ftp_proxy=$http_proxy
export no_proxy=127.0.0.1,localhost
# the following is a local fix for #255742
export NO_PROXY="$no_proxy"
EOF
cat < $PACFILE
function FindProxyForURL(url, host) {
if( isInNet(host, "127.0.0.1", "255.0.0.0")) {
return "DIRECT";
} else {
return "PROXY $HOST:$PORT";
}
}
EOF
Das Script steht sowohl in if-up.d als auch in if-down.d und setzt abhängig von den aus /e/n/i übergebenen Werten die entsprechenden Daten in die Dateien /etc/use-proxy und /etc/proxy.pac. Das eine wird von den User-Init-Scripts gesourced, das andere steht als file://-URL in den Proxyeinstellungen der Browser.
Die anderen Scripts sind auf Anfrage verfügbar, und werden von mir vielleicht irgendwann mal zur guessnet-Package als examples veröffentlicht.
Das Interface "expensive" wird nicht von guessnet bedient, sondern steht manuell als "ifup expensive" in /etc/ppp/ip-up.d für "Provider", die "teuer" sind, also z.B. die GPRS-Verbindung. Ich verhindere somit, dass trafficintensive Dinge wie cron-apt gerade dann loslaufen, wenn IP richtig teuer ist. Da die Methode "manual" verwendet wird und keine Änderungen an der direkten Netzkonfiguration durchgeführt werden, ist der "ifup"-Aufruf aus der PPP-Initialisierungsphase unschädlich.
Noch nicht angegangen bin ich die Automatik für wireless LAN, die wegen der notwendigen Verschlüsselungsmechanismen nicht 1:1 wie ein Ethernetinterface abbildbar ist. Dafür gibt es mit waproamd auch einen gut integrierenden Helfer, den ich allerdings bisher noch nicht ausprobiert habe: Wireless ist für mich nach wie vor kein Vorrangthema.
Comments
Display comments as Linear | Threaded
dietz proepper on :
Nunja, waproamd riecht schon etwas, ährm, abgestanden.
spiney on :
wenn man jetzt noch automatisch den Firefox dazu bringen koennte, die .pac Datei erneut zu laden ohne dafuer manuell in die Preferences gehen zu muessen, dann waere die Sache wirklich perfekt...
istaon on :
Danke für diesen Hinweis, auch wenn ich die ein oder andere Stunde brauchte um alles genau zu verstehen, vorallem die Vererbung..... grr ggg
Warum wird beim stoppen des Dienstes (ifdown eth0) nicht der Parameter "stop" mit übertragen?
Könntest Du mir auch Deine anderen Scripte zukommen lassen?
Br Dominik