Funktionen des Routers
Routing ins Internet vom LAN und WLAN
- NATting
DHCP-Server
- Mailserver (mittels fetchmail, Postfix, Spamassassin, amavisd, clamavd und courier-imapd)
Intranet-Server
Musik-Server
Einige Funktionen des Servers lassen sich mittels Telefonfernsteuerung erreichen.
Sonstige Wartungsmaßnahmen werden ausschließlich (außer in Notfällen) remote per ssh erledigt.
Hardware
Der Router ist ein Siemens Scenic xB PIII mit 866MHz. Die Kiste hat eine ausreichende Zahl PCI-Steckplätze und ist dennoch relativ flach. Das war mir wichtig, weil ich zwei gleiche Maschinen benötige, die ich auf einem im Keller vorhandenen Regal übereinander stellen wollte.
Zwei kleine Bilder dazu:
Warum ich zwei von den Kisten verwende, wird unter Backup-Konzept beschrieben. Hier ist jetzt lediglich interessant, dass beide Rechner so weit wie möglich identisch sind, je drei Ethernet-, eine ISDN/DSL- und eine WLAN-Karte eingebaut haben, sowie je zwei Festplatten (1x20GB fürs Betriebssystem und 1x250GB im Wechselrahmen [s. Vorderseite] für schwergewichtige Nutzdaten wie mp3's und Filme).
Als OS verwende ich Debian sarge. Funktioniert prächtig...
Routing
Der Router stellt über eine erste Ethernet-Karte zwei IP-Adressen zur Verfügung. Die erste ist seine "persönliche" (hier: 172.31.0.12), die zweite eine kanonische (ich habe 172.31.0.50 gewählt). Die dafür notwendigen Einstellungen in /etc/network/interfaces lauten:
# The loopback network interface auto lo eth0 eth0:0 eth1 iface lo inet loopback # The primary network interface iface eth0 inet static address 172.31.0.12 netmask 255.255.255.0 broadcast 172.31.0.0 iface eth0:0 inet static address 172.31.0.50 netmask 255.255.255.0 broadcast 172.31.0.0
Egal, welcher Rechner Router ist, diese kanonische Adresse hat immer nur dieser eine. Der Vorteil ist dann, dass im Netzwerk alle Rechner nur mit der .50-Adresse umgehen müssen. Als Name für die .50-Adresse habe ich "gateway" gewählt.
Die default-Route aller Clients im Netzwerk ist somit die 172.31.0.50.
Weitere Netzwerkinterfaces sind: Einmal pppoe mittels der zweiten Ethernet-Karte für die Internet-Verbindung, ein WLAN-Interface, sowie eine ISDN-Datenverbindung, die nur bei Bedarf eingeschaltet wird. Zwischen allen Interfaces wird "von innen nach außen" geroutet. Die Netzwerkadressübersetzung (NAT) wird dabei über iptables gesteuert. Da ich diese nicht wirklich verstehe, verlasse ich mich auf die Shorewall. Die shorewall baut gleichzeitig (das ist ihr primärer Sinn) eine Firewall auf. Ich habe mir angewöhnt, die korrekte Funktionsweise der firewall mit dem Portscanner von heise-Security zu verifizieren.
Das Interface, das über die dritte Ethernet-Karte zur Verfügung steht, wird übrigens nicht geroutet. Stattdessen steht dieses exklusiv (über ein gekreuztes Ethernet-Kabel) für das Backup bereit.
Nameserver
Auf den Clients im Netzwerk wird als Nameserver 172.31.0.50 angegeben.
Der Nameserver auf dem gateway wird durch bind9 bereitgestellt. Man muss dann halt nur die Tabellen für alle Rechner im Netz auf diesem gateway pflegen. Die Funktionsnamen aller hier beschriebenen Server (z.B. timehost, intranet, ...) werden in der aktuellen Konfiguration alle auf die IP-Adresse des gateways gelenkt. Sollten irgendwann einmal dedizierte Rechner dafür zum Einsatz kommen, trägt man natürlich deren Adressen ein. In jedem Fall sollten die Clients die jeweilige Funktion über den Namen ansprechen - der Nameserver sorgt jeweils für die richtige Namensauflösung. Bei Änderungen an den Nameserver-Einstellungen rndc reload nicht vergessen, damit die Tabellen neu geladen werden.
Das etwas Spannendere am Nameserver sind zwei Dinge: a) die Namensauflösung im Internet und b) die Namensauflösung von Rechnern unserer Domain, die beim Provider stehen.
Die Namensauflösung im Internet wird dadurch erreicht, dass die Datei /etc/bind/named.conf.options dynamisch angepasst wird, wenn eine IP über das DSL-Interface (pppoe) vom Provider zugeordnet wurde. Dazu habe ich in /etc/ppp/ip-up.d die Datei 0000usepeerdns disabled und stattdessen die folgende eingesetzt:
OPTIONSFILE=/etc/bind/named.conf.usepeerdns [ -n "$DNS1" ] || exit 1 echo "use Nameserver '$DNS1' and '$DNS2' as forwarders for bind..." # build an options file for named/bind cat >$OPTIONSFILE <<EOF options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you might need to uncomment the query-source // directive below. Previous versions of BIND always asked // questions using port 53, but BIND 8.1 and later use an unprivileged // port by default. query-source address * port 53; // restrict operation on Interface eth0 (172.31.0.50) listen-on port 53 { 127.0.0.1 ; 172.31.0.50 ; }; transfer-source 172.31.0.50 port 53; notify-source 172.31.0.50 port 53; // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. forwarders { $DNS1; $DNS2; }; auth-nxdomain no; # conform to RFC1035 }; EOF # make a link to this file ln -fs $OPTIONSFILE /etc/bind/named.conf.options # inform named/bind about that good news rndc reload
Das zweite "Problem" unserer vom Provider verwalteten Adressen www.* und ftp.* habe ich durch statische Einträge in den Nameserver-Datenbanken gelöst. Wie man das richtig, also dynamisch per Abfrage eines externen Nameservers macht, ist mir noch nicht so recht klar.
DHCP-Server
Zumindest Laptops werden per DHCP mit den notwendigen Netzwerkinformationen versorgt. Die dafür notwendigen Einstellungen in /etc/dhcp3/dhcpd.conf sind von folgender Art:
# The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the # behavior of the version 2 packages ('none', since DHCP v2 didn't # have support for DDNS.) ddns-update-style none; # option definitions common to all supported networks... option domain-name "unsere.domain.de"; default-lease-time 600; max-lease-time 7200; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). log-facility local7; subnet 172.31.0.0 netmask 255.255.255.0 { range 172.31.0.200 172.31.0.254; option routers 172.31.0.50; option domain-name-servers 172.31.0.50; option broadcast-address 172.31.0.255; } subnet 172.31.1.0 netmask 255.255.255.0 { range 172.31.1.200 172.31.1.254; option routers 172.31.1.50; option domain-name-servers 172.31.0.50; option broadcast-address 172.31.1.255; } # Fixed IP addresses can also be specified for hosts. These addresses # should not also be listed as being available for dynamic assignment. # Hosts for which fixed IP addresses have been specified can boot using # BOOTP or DHCP. Hosts for which no fixed address is specified can only # be booted with DHCP, unless there is an address range on the subnet # to which a BOOTP client is connected which has the dynamic-bootp flag # set. host kai { hardware ethernet 00:A0:CC:C4:F9:3D; fixed-address einrechner.unsere.domain.de; }
Das Subnetz 172.31.0.0 steht für die drahtgebundenen Verbindungen, das Subnetz 172.31.1.0 für die WLAN-Verbindungen zur Verfügung. Die Adressbereiche .200-.254 versorgt der Nameserver mit fortlaufend nummerierten Namen wie z.B. dc000 oder dc010-wlan.
Timeserver
Der Router ist mit einer Funkuhr verbunden, sodass er immer mit präziser Zeit versorgt wird. Wie man das macht, steht auf den Seiten zum pcf77. Obwohl der Rechner im Keller steht, klappt die Versorgung mit korrekter Zeit sehr zuverlässig. Daher wird der Router in unserem Netzwerk auch zum Timeserver (Rechnername: timehost).
Intranet
Das Intranet wird mit Apache realisiert. Das "Portal" für unsere Internet-Aktivitäten wird mittels eines kleinen cgi-Scripts realisiert. Damit können häufiger benötigte Links von jedem Benutzer abgelegt und für andere bereitgestellt werden.
Zusätzlich gibt es natürlich diverse Links, die lokale Funktionen/Seiten aufrufen.
Eine Besonderheit ist, dass der Intranetserver auch ein Wiki zur Verfügung stellt, welches über den virtuellen Webserver wiki erreichbar ist. Dieses wiki - auf Basis von MoinMoin - dient zur Generierung unserer Webseite. Letztere ist im Wesentlichen eine statische Kopie, die mittels wget und ein paar Script-Tricks aus dem wiki gezogen und zum Provider gesandt wird.
Musik
Als Musikserver dient unser "Wurlitzer" in Form einer mp3-Jukebox. Als Serversoftware dient dabei Ampache. Man könnte fast sagen, dass diese Jukebox (neben dem eigentlichen Routing ins Internet) die "Killerapplikation" des Routers darstellt. Jedenfalls wird sie von allen Familienmitgliedern sehr gern und sehr intensiv genutzt. Ein Client (ein Tablet-PC FSC Stylistic 3400) ist daher auch mit der Stereoanlage im Wohnzimmer verbunden und versorgt uns dort mit den mp3-Konserven aus dem Keller
Telefonfernsteuerung
Ein kleines Gimmick unseres Routers stellt die Tatsache dar, dass man ihn mittels Telefon fernsteuern kann. Dazu ist vbox installiert worden. Wie man das macht und wie man insbesondere eine ordentliche Sprachausgabe generiert, ist auf den Seiten von M. Wetz sehr gut beschrieben - vielen Dank dafür!
Ich steuere damit im Wesentlichen folgende Aktionen: Rechner herunterfahren oder neu booten, WLAN Start/Stop und Firewall Start/Stop. Als zentrales Aktionsprogramm gibt es dafür ein supersystemctrl, das über /etc/sudoers auch vom vbox-User (und vom apache-User für gleichartige Funktionalität übers intranet) ausgeführt werden darf. Dazu steht in /etc/sudoers folgendes:
# ein paar Sachen, die wir auf dem Webserver erldigen wollen: www-data gateway = NOPASSWD: /sbin/shutdown , /bin/netstat , /usr/local/bin/mailpoller , /usr/local/bin/supersystemctrl phone gateway = NOPASSWD: /sbin/shutdown , /usr/local/bin/supersystemctrl
supersystemctrl kann momentan folgendes:
Usage: /usr/local/bin/supersystemctrl {start|stop|restart|status} {WLAN|DSL|Shorewall}
Die vbox-Ansteuerung erfolgt mittels ISDN - der ISDN/DSL-Karte von fritz sei Dank.