Skip to content

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.

Trackbacks

Die wunderbare Welt von Isotopp on : guessnet-ifupdown

Show preview
Zugschlus hat in seinem Blog die sehr nützliche Kategorie Debian Package of the Week, bei der mich weniger das Debian als vielmehr das Package interessiert. Hauptsächlich deswegen, weil er aus irgendeinem Grund immer genau das Package bewirbt, daß mir di

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

Add Comment

Markdown format allowed
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
Form options