Linux Router

Im Gegensatz zum Desktop ist Linux im Serverbereich fest etabliert. Das gilt für Webserver und große Rechenzentren ebenso wie für kleine Hardware-Router vom Discounter. Das hat einige gute Gründe:

  1. Obwohl Linux ein modernes Betriebssystem ist, braucht es keine grafische Oberfläche
  2. Es lässt sich alles realisieren was mit der vorhandenen Hardware möglich ist. Es gibt keinerlei Bevormundung oder künstliche Einschränkungen wegen "betriebswirtschaftlicher Vorgaben" d.h. keiner stopft sich die Taschen voll...
  3. Sämtliche benötigte Software ist quelloffen, d.h. keiner kann unbemerkt irgendwelche Hintertüren einbauen. Weiterhin können findige Nutzer die Software individuell anpassen (wozu sich in vielen Foren Anleitungen bzw. Patches finden)
  4. Linux ist gratis :-)
Grund genug für uns, unseren WG-Router mit Linux zu betreiben. Und da ja alles möglich ist, haben wir auch alles Mögliche darauf eingerichtet:

Als Basissystem habe ich Fedora Core 2 installiert. Natürlich geht das beschriebene auch mit jeder anderen Linux-Distribution, ich kenne mich halt mit Fedora am besten aus.

Ganz unten habe ich meine Versionen der hier besprochenen Konfigurationsdateien zum herunterladen

Hardware:

Es gibt keinen Bildschirm und keine Tastatur. Konfiguriert wird der Server mittels ssh oder webmin. Der Stromverbrauch liegt zwischen 30 und 40W.

Software:


Installation von Fedora Core 2:

Hat man alle iso-Images heruntergeladen und mittels der md5-Summe deren Integrität überprüft, so kann man die Images auf CD brennen und mit der Installation beginnen. Es gibt auch Alternativen (fast) ohne CD brennen, vielleicht stelle ich die weiter unten noch vor. Die Installation von Fedora startet von CD1 wenn der Router sowas kann. Jeden Schritt möchte ich hier nicht besprechen, nur auf wichtige Punkte aufmerksam machen:


Nach der Installation:

Ist die Installation durchgelaufen, könnte man den Rechner theoretisch schon in den Keller, Kleiderschrank oder wohin auch immer verbannen. Das sollte man erstmal noch seinlassen, denn wenn durch eine Konfigurationspanne das Netzwerksystem ausfällt, muss man wieder Monitor und Tastatur zücken. Als ersten Schritt sollte man die Dienste abschalten, die man nicht braucht. Dazu gibt es den Befehl chkconfig. chkconfig Dienst on schaltet einen Dienst an, chkconfig Dienst off schaltet ihn ab. chkconfig --list zeigt eine Liste aller verfügbaren Dienste und deren Status an.
Ausschalten kann man: kudzu, anacron, nscd, acpid, irqbalance, isdn, autofs und yum

Dann steht erstmal ein Update des Systems an. Dazu richtet man wie weiter unten beschrieben zunächst die Internetverbindung ein und gibt dann yum update ein.

Dann installiert man in einem Rutsch alle Pakete die man später noch braucht und die in Fedora enthalten sind mit

yum install dhcp samba dovecot fetchmail perl-libwww-perl fontconfig gcc patch bison flex postgresql-libs openssl-devel

Neu starten um den neuen Kernel in Betrieb zu nehmen.


Installation der Netzwerkkarten:

Als nächtes sollte man die Netzwerkkarten ans Laufen bringen. Wurde eine Netzwerkkarte nicht erkannt, so sind folgende Schritte durchzuführen:

  1. Was ist das für eine Karte und welches Kernelmodul braucht sie? (In meinem Beispiel eine 3COM 3C509 mit Kernelmodul 3c509)
  2. Das Kernelmodul einmal probeweise mit modprobe modul laden und dann einen Blick in /var/log/messages werfen. Gibts dort Fehlermeldungen oder wurde die Karte gefunden? Evtl. werden Parameter wie irq= o.ä. gebraucht.
  3. Welches ist die nächste freie ethX Nummer? Bitte mit ifconfig prüfen. (In meinem Beispiel eth2)
  4. Manche Treiber wollen eine ganz bestimmte ethX Nummer. Welche das ist, steht nach dem probeweisen Laden des Kernelmoduls auch in /var/log/messages. Diese muss man dann verwenden. In meinem Beispiel war das eth1 weswegen ich der WLAN-Karte dann eth2 zuweisen musste.
  5. Jetzt kommt in /etc/modprobe.conf: alias eth1 3c509 (für mein Beispiel)
  6. In /etc/sysconfig/network-scripts/ifcfg-eth1:
    # 3Com 3C509B EtherLink III:Unknown
    DEVICE=eth1
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.128.1
    NETMASK=255.255.255.0
  7. In /etc/modprobe.conf sollte jetzt stehen:
    alias eth0 via-rhine
    alias eth1 3c509
    alias eth2 orinoco_pci
    und in /etc/sysconfig/network-scripts sollten dazu passende ifcfg-eth0 bis ifcfg-eth2 stehen.
  8. Nach einem service network restart sollte die neue Karte bei ifconfig angezeigt werden. Notfalls neustarten.

Internet, Routing

Jetzt wird es Zeit, den Router ins Internet zu bringen. Dazu schließt man zunächst das DSL-Modem an die dafür vorgesehene LAN-Karte an (bei mir eth1, also die 3COM) und testet mit pppoe -I eth1 -A ob man eine Verbindung zum Access-Concentrator erhält. Wenn nicht, dann ist entweder die Netzwerkkarte kaputt, nicht richtig eingerichtet oder das Zusammenspiel Modem <-> Netzwerkkarte funktioniert nicht (bei mir manchmal der Fall). Dann einfach mal eine andere Netzwerkkarte probieren. Funktioniert hingegen alles, gilt es pppd zu konfigurieren. Dazu legt man die Datei /etc/ppp/peers/dsl mit folgendem Inhalt an:

pty "pppoe -m 1452 -I eth1"
connect /bin/true
user "benutzername"
usepeerdns
noipdefault
defaultroute
noccp

Dass Passwort kommt in die /etc/ppp/chap-secrets:

"benutzername" * "kennwort"

Nach Eingabe von pppd call dsl sollte ein ping 217.72.195.42 (web.de) eine funktionierende Verbindung signalisieren. Jetzt wollen wir eine funktionierende Namensauflösung, damit wir nicht mit IP-Adressen hantieren müssen. Dazu schauen wir mit cat /etc/ppp/resolv.conf, ob dort etwas eingetragen ist. Das ist nicht immer der Fall. Wenn nicht, müssen wir uns mit cat /var/log/messages | grep "DNS address" die Adresse des DNS-Servers selbst raussuchen. Dann schreiben wir in /etc/resolv.dnsmasq: nameserver aaa.bbb.ccc.ddd also die gerade herausgefundene DNS-Serveradresse. Nun installieren wir mit rpm -i dnsmasq-... unseren eigenen DNS-Server. Konfiguriert wird er in /etc/dnsmasq.conf:

listen-address=192.168.1.8
listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq

Mit dnsmasq wird er gestartet. Anschließend schreiben wir in /etc/resolv.conf:

nameserver 127.0.0.1
domain irgendwas.lan
search hostname

hostname ist der im Abschnitt "Installation" festgelegte Hostname. Jetzt sollte auch ein ping web.de zum Erfolg führen.

Weiter gehts mit dem Routing. Das lässt sich alles mit diesem Skript erschlagen. Man kopiert es z.B. ins /root Verzeichnis und macht es mit chmod 700 masq ausführbar. Bitte jetzt in den oberen Zeilen ggf. die Parameter anpassen. Nach einem Aufruf von /root/masq, der fehlerfrei durchlaufen sollte, ist das Routing erstmal eingerichtet. Das Skript habe ich übrigens vor Jahren von einer mir nun unbekannten Internetseite geklaut, der Autor möge sich melden, wenn es ihn stört.

Um die Internetverbindung stets aufrecht zu erhalten, kommt folgende Zeile in die /etc/inittab:

ppp:3:respawn:/usr/sbin/pppd call dsl nodetach

nach einem telinit Q tritt diese Zeile in Aktion. Falls der pppd noch läuft, bitte vor telinit mit killall pppd beenden.

Vor dem Ausführen der nächsten Schritte bitte die oben erwähnten Updates und Pakete installieren!

Installation der ISDN-Karten

Die AVM-Karte braucht das oben angebene Kernelmodul, einfach installieren mit rpm -i http://dl.atrpms.net/.../fcpci-kmdl.... In die /etc/capi.conf muss die Zeile fcpci - 1 - - geschrieben werden. Jetzt brauchen wir noch das aktuelle capiinit da das mitgelieferte mit den 2.6er Kernelmodulen nicht zurecht kommt...

cd /usr/src
wget ftp://ftp.in-berlin.de/pub/capi4linux/capi4k-utils-2005-07-18.tar.gz
tar xzf capi4k-utils-2005-07-18.tar.gz
cd capi4k-utils/capi20
./configure && make && make install
cd ../capiinit
./configure && make && make install
cd ../capiinfo
./configure && make && make install
Dann mit capiinit start das CAPI laden, was mit einer Warnung abgehen sollte. Mit capiinfo kann man dann überprüfen, ob capi geladen wurde.

Sonst gibt es an Hardware eigentlich nichts aufregendes, die HFC-Karte wird später mit bristuff in Betrieb genommen


DHCP-Server

Damit man nicht IP-Adresse, Gateway, Nameserver usw. bei jedem Client einzeln eintragen muss, kann man dies den dhcp-Server von zentraler Stelle aus erledigen lassen. Zu beachten ist hierbei, dass eine WLAN-Karte gleich alle Parameter mitgeteilt bekommt, die Dienste aber erst nutzen kann, wenn eine VPN-Verbindung besteht. Einzig der Gateway wird erst zugewiesen, wenn die VPN-Verbindung steht. Weiterhin kann man sehen, dass der Computer mit der MAC-Adresse 00:0E:A6:36:35:46 immer die IP-Adresse 192.168.1.1 zugewiesen bekommt. Das tut not, damit das Routing-Skript z.B. die ICQ-Pakete auch an den richtigen Rechner leiten kann. Die Konfiguration des dhcp-Servers geschieht über die Datei /etc/dhcpd.conf:

authoritative;
ddns-update-style none;
option domain-name "wg.lan";
max-lease-time 86400;
default-lease-time 86400;
option subnet-mask 255.255.255.0;

subnet 192.168.2.0 netmask 255.255.255.0 {
        range 192.168.2.20 192.168.2.40;
        option domain-name-servers 192.168.1.8;
        option netbios-name-servers 192.168.1.8;
}

subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.20 192.168.1.40;
        option domain-name-servers 192.168.1.8;
        option netbios-name-servers 192.168.1.8;
        option routers 192.168.1.8;
}

host johannes {
        hardware ethernet 00:0E:A6:36:35:46;
        fixed-address 192.168.1.1;
}
Bitte alle hier beispielhaft eingetragenen MAC/IP-Adressen entsprechend anpassen. Jetzt noch mit service dhcpd start den Server starten.
Jetzt kann man bei einem Client die IP-Adresse auf dynamisch stellen. Unter Windows kann man mit ipconfig /all überprüfen, ob die Werte des dhcp-Servers übernommen wurden. Wenn ja, sollte auch die Internetverbindung ohne weiteres funktionieren - einfach mal surfen.

E-Mail-Server

Nachdem bis hierhin alles funktioniert hat, kommen wir zum Mail-Server. Wir wollen also mit einem POP3-Client unsere E-Mails z.B. von einem (oder mehreren) GMX-Accounts einsammeln und auf dem Server lagern. Dort werden sie dann über IMAP bereitgestellt. Der Vorteil dieses Vorgehens ist, dass die eigenem Mails an einem zentralen Punkt gespeichert sind und man so vom Heimrechner, vom Laptop und vom Rechner auf der Arbeit immer auf alle seine Mails zugreifen kann. Auch alle gesendeten Nachrichten werden zentral gespeichert.

Fangen wir mit dem IMAP-Server an, konfiguriert werden muss er ausnahmsweise nicht, nur aktivieren muss man ihn mit service dovecot start. Diesen Teil sollte man schonmal testen. Dazu richtet man sich mit adduser test einen Testbenutzer ein und weist ihm mit passwd test ein Passwort zu. Anschließend sendet man sich mit echo Hallo | mail test@localhost -s test selbst eine E-Mail. Dann richtet man auf einem Client ein imap-Konto ein und prüft ob die Testmail durchgekommen ist.

Wenn das funktioniert, muss noch fetchmail eingerichtet werden. Ich habe es für jeden Benutzer getrennt laufen damit es zu keiner Verwirrung kommt und etwas Diskretion gewährleistet ist. Man schreibt also (angemeldet als Benutzer test) in /home/test/.fetchmailrc:

server pop.puretec.de
proto pop3
user benutzer
pass geheim

Damit die Email-Passwörter nicht unverschüsselt auf der Platte liegen, verschlüsselt man die Konfigurationsdatei. Verschlüsselt wird z.B. mit aespipe. Die Installation geschieht mittels rpm -i ftp://ftp.pbone.net/.../aespipe-....rpm (URL s.o.)
Hat man es installiert, meldet man sich als Benutzer test beim System an und verschlüsselt die Konfigurationsdatei mit

aespipe < .fetchmailrc > .fetchmailrc.aes && rm -f .fetchmailrc

Fetchmail ist nun mit dem folgenden Skript zu starten:

#!/bin/sh
[ -f ~/.fetchmailrc.aes ] && aespipe -d < ~/.fetchmailrc.aes | \
	grep -a "user\|pass\|server\|proto" | fetchmail --daemon=300 -f -

Der grep-Aufruf filtert einige Zeichen aus, die komischerweise beim entschlüsseln hinten angehängt werden.


WLAN und VPN

Da die WEP-Verschlüsselung schnell geknackt und bei einigen Windows-Treibern fehlerhaft implementiert ist, habe ich mich entschieden, den WLAN-Verkehr über einen verschlüsselten VPN-Tunnel zu leiten. Diesen Tunnel kann man doch auch gleich noch durchs Internet bauen und so von überall auf das heimische Netz zugreifen. Die WLAN-Karte konfiguriert man in /etc/sysconfig/network-scripts/ifcfg-eth2:

# Belkin: 802.11b Prism 2.5 Wireless network adapter
DEVICE=eth2
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.2.1
NETMASK=255.255.255.0
ESSID=wlan
CHANNEL=6
MODE=Ad-Hoc
RATE=auto

Ein service network restart übernimmt die Änderungen. Auf dem Client nimmt man die gleichen Einstellungen vor, insbesondere Channel, ESSID und MODE müssen übereinstimmen. Den Rest übernimmt dhcp. Das sollte man auch gleich überprüfen. Wichtig: mit dem oben vorgestellten Firewall-Skript lässt sich die WLAN-Verbindung nicht über Ping testen!

Jetzt installieren wir die Software: (Alles in eine Zeile, URLs ggf. anpassen)

rpm -i http://mesh.dl.sourceforge.net/sourceforge/poptop/dkms-2.0.6-1.noarch.rpm http://mesh.dl.sourceforge.net/sourceforge/poptop/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm http://mesh.dl.sourceforge.net/sourceforge/poptop/ppp-2.4.3-5.fc2.i386.rpm http://mesh.dl.sourceforge.net/sourceforge/poptop/pptpd-1.2.3-1.i386.rpm

Dann wird der Server konfiguriert, /etc/ppp/options.pptpd:

lock
mtu 1450
mru 1450
auth
ipcp-accept-local
ipcp-accept-remote
lcp-echo-failure 3
lcp-echo-interval 5
nodeflate
nobsdcomp
debug
name pptpd
proxyarp
require-mppe
require-mschap-v2
sowie /etc/pptpd.conf:
option /etc/ppp/options.pptpd
localip 192.168.1.200
remoteip 192.168.1.201-230
Und die Zugangsdaten müssen noch festgelegt werden, /etc/ppp/chap-secrets:
"test"  pptpd   "/$%hf1ap21"  192.168.1.5
test ist der Benutzername, pptpd ist das was oben hinter name= steht, dann kommt das Passwort, welches besonders verworren sein sollte, da die Qualität der Verschlüsselung von ihm abhängt. Dann kommt die IP-Adresse, die diesem Client zugewiesen werden soll. Ist das egal, dann kommt an diese Stelle einfach ein *. Dann wird eine Adresse aus dem oben mit remoteip= definierten Bereich zugewiesen.

Die Konfiguration eines Windows Clients geht wie folgt:

Dann die Verbindung mit dem oben angegeben Benutzername und Passwort aufbauen und schauen ob alles wie erwartet funktioniert.

Telefonanlage mit Asterisk

Das Programm mit dem meisten "Groove" auf dem Linux Server ist sicherlich Asterisk. Es ist eine Software-Telefonanlage, die jedes Hardwaregerät bei weitem übertrifft was die Anwendungsmöglichkeiten und die Konfigurierbarkeit angeht. Der besondere Trick dabei ist eine ISDN-Karte, die einen internen S0-Bus bereitstellt und an die somit jedes Telefon anschließbar ist. Über einen billigen Terminaladapter auch analoge Telefone bis hinunter zu Omas Wählscheibentelefon. Die Verbindung nach draußen geht dabei wahlweise über VOIP oder über ISDN mittels einer zweiten ISDN-Karte. Ich gehe jetzt mal davon aus, dass diese zweite ISDN-Karte wie oben beschrieben installiert wurde, falls es eine FritzCard ist. Also los gehts: Soviel zur Fleißarbeit, jetzt gehts ans konfigurieren. Erstmal den Kartentreiber. /etc/zaptel.conf:
loadzone=nl
defaultzone=nl

span=1,1,3,ccs,ami
bchan=1-2
dchan=3
und hinzuzufügen zur /etc/modprobe.conf:
alias char-major-196 zaphfc
options zaphfc modes=1
install zaphfc /sbin/modprobe --ignore-install zaphfc && /sbin/ztcfg
Einbinden in asterisk, /etc/asterisk/zapata.conf:
[channels]
switchtype=euroisdn
signalling=bri_net_ptmp
pridialplan=local
echocancel=yes
immediate=no
overlapdial=yes
group=1
context=default
channel=>1-2
Jetzt konfigurieren wird VOIP bzw. SIP, /etc/asterisk/sip.conf:
[general]
port=5060
context=sip-in
bindaddr=0.0.0.0
disallow=all
allow=g729
allow=alaw
allow=ulaw
allow=gsm
maxexpirey=180
defaultexpirey=160
tos=lowdelay
register => 49681987654:passwort@sip.gmx.net/49681987654

[johannes-gmx]
host=sip.gmx.net
type=friend
username=49681987654
secret=passwort
fromuser=49681987654
fromdomain=sip.gmx.net
canreinvite=no
qualify=no

Dyndns-Client

Damit man den Server von überall erreichen kann, muss die IP-Adresse auf einen Hostnamen abgebildet werden. Dafür gibt es den kostenlosen Service Dyndns. Um bei jeder Einwahl die IP-Adresse zu aktualisieren nutzt man ddclient:
wget http://mesh.dl.sourceforge.net/sourceforge/ddclient/ddclient-3.6.7.tar.bz2
tar xjf ddclient-3.6.7.tar.bz2
cd ddclient-3.6.7
cp ddclient /usr/sbin
cat sample-etc_ppp_ip-up.local >> /etc/ppp/ip-up.local
chmod +x /etc/ppp/ip-up.local
In die /etc/ddclient/ddclient.conf muss folgendes hinein:
login=user
password=passwort
server=members.dyndns.org,              \
protocol=dyndns2                        \
blabla.dyndns.org
Ein killall pppd testet das ganze, das Ergebnis lässt sich wie immer in /var/log/messages begutachten.

Konfigurationsdateien: