3. Slackware installieren
Der Router ist aus dem Internet sichtbar. Er ist damit das am stärksten
exponierte Element des Netzwerks. Bei seiner Konfiguration wurde von den
folgenden Grundgedanken ausgegangen:
-
Jeder Dienst und jedes Programm, das nicht auf dem Router installiert
ist, kann auch nicht angegriffen werden.
-
Ein C-Compiler, das X-Window System, ein FTP- oder DNS-Server
gehören nicht auf einen Paketfilter.
-
Netzwerk Diagnosewerkzeuge wie tcpdump, iptraf, ntop, nmap haben auf
einem Router nichts zu suchen.
-
Bei Servern und Routern sollten die für den Betrieb notwendigen
Module (Hardwaretreiber) fest in den Kernel einkompiliert werden. Der
Mechanismus zum Nachladen von Treibern zur Laufzeit wird deaktiviert.
In der folgenden Installationsanleitung wird für den Entwicklungsrechner
die Bezeichnung DEVBOX verwendet, für die Partition auf dem
Entwicklungsrechner, in die das Router OS installiert wird, die Bezeichnung
/dev/hda5 und für das System, das auf den Compact Flash Speicher
portiert wird, die Bezeichnung SLACK_LNX.
Den Entwicklungsrechner DEVBOX booten, eine leere Partition /dev/hda5
von ca. 200 MB anlegen und /dev/hda5 mit ext2
formatieren (-c = check for badblocks).
Eine Bootdiskette für DEVBOX anlegen.
DEVBOX mit Hilfe der Slackware Installationsdisketten oder der
Installations-CDROM neu booten und den setup starten.
Die Root Partition unter /dev/hda5 mounten,
keine Swap Partition anlegen.
Alle Programmpakete aus dem Verzeichnis «a» (Base linux
system) die mit REQUIRED bezeichnet sind installieren und zusätzlich
die folgenden Pakete auswählen:
[x] gawk (needed for adduser)
[x] getty-ps (serial login support)
[x] glibc-solibs (required for SSH)
[x] glibc-zoneinfo (to configure time zones)
[x] isapnptools (plug and play configuration tools - if the router hardware supports PCMCIA)
[x] kbd (keyboard mapping tool)
[x] lilo
[x] pcmcia-cs (PCMCIA card services support - if the router hardware supports PCMCIA)
[x] sysklogd (logs system and kernel messages)
[x] tcsh
|
|
Aus dem Verzeichnis «n» (Networking) die folgenden
Pakete installieren:
[x] dhcpcd (DHCP client)
[x] dhcp (if the router is to be used as DHCP server)
[x] iptables
[x] ntp (network time protocol)
[x] openssh
[x] openssl (necessary for ssh and ntp)
[x] ppp (point-to-point protocol)
[x] rp-pppoe (necessary to connect to ADSL ISPs that use PPPoE)
[x] tcpip (basic networking utilities)
|
|
Die obige Installation umfasst ca. 66 MB.
LILO in den Bootsektor von /dev/hda5 installieren,
nicht in den MBR, d.h. die Option «Install to superblock»
auswählen. Die Option «View your
current /etc/lilo.conf» muss die folgenden
Einträge zeigen:
boot = /dev/hda5
root = /dev/hda5
|
|
Das Hauptsystem von DEVBOX booten und den Bootmanager anpassen.
Falls das System LILO verwendet, in /etc/lilo.conf
den folgenden Eintrag hinzufügen:
other=/dev/hda5
label= slack_x.y
|
|
LILO updaten.
Falls das Hauptsystem Grub verwendet, in /boot/grub/menu.lst
den folgenden Eintrag hinzufügen:
title slack_x.y
kernel (hd0,4)/boot/vmlinuz root=/dev/hda5 vga=normal
|
|
SLACK_LNX neu booten und die Netzwerk-Interfaces mit Hilfe von
/etc/rc.d/rc.inet1.conf konfigurieren.
ifconfig sollte nun die NICs und die zugehörigen IP-Adressen zeigen
und das System sollte auf pings antworten.
Wenn nötig den Hostnamen in /etc/HOSTNAME anpassen.
In /etc/hosts die IP-Adressen und Namen der Hosts im
internen Netzwerk eintragen.
Die Datei /etc/hosts.equiv löschen.
Alle Zugriffe auf SLACK_LNX sperren, dazu in /etc/hosts.deny
den folgenden Eintrag einfügen:
Den Zugriffe auf SLACK_LNX via ssh aus dem internen Netz zulassen,
dazu in der Datei /etc/hosts.allow die folgenden
Einträge einfügen:
ALL: 127.0.0.1
sshd: 10.10.10.10 # Gewünschte IP-Adresse verwenden
|
|
Einen Benutzeraccount anlegen (beispielsweise «myname»).
Ein Verzeichnis /home/myname/.ssh anlegen.
Auf dem Linux System, mit dem auf den Router zugegriffen wird,
ein Schlüsselpaar für SSH generieren:
$ ssh-keygen -b 1024 -t rsa
|
|
Anschliessend das File id_rsa.pub , das dabei erzeugt
wird, ins Verzeichnis /home/myname/.ssh von SLACK_LNX
kopieren und umbenennen in /home/myname/.ssh/authorized_keys .
Hinweis: Die Permissions dieses Files sind wichtig, sie müssen wie
folgt lauten:
-rw-r--r-- myname users authorized_keys
|
|
Auf den Router soll nur via Public Key Authentifizierung zugegriffen werden.
Dazu im sshd Konfigurationsfile /etc/ssh/sshd_config die
folgenden Einträge editieren:
# /etc/ssh/sshd_config - Configuration file for sshd
Protocol 2
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
|
|
Unter der Voraussetzung, dass SLACK_LNX den Hostnamen «ada»
trägt und die entfernte Maschine «byron» heisst, kann
mit dem folgenden Kommando von byron aus auf ada zugegriffen werden
(ohne dass ein Passwort eingegeben werden muss):
yourname@byron: ~ $ ssh myname@ada
|
|
Im Folgenden wird angenommen, dass das Logfile des Routers
auf einem Logserver mit dem Hostnamen «byron» geführt
wird. Weiterhin soll «byron» die Log-Einträge des
Routers in ein separates File schreiben, Filtermeldungen des Routers
also nicht mit Kernelmeldungen vermischen.
Um diese Trennung herbeizuführen, müssen die Meldungen, die
der Routerkernel erzeugt, gekennzeichnet werden. Eine Möglichkeit
hierfür besteht darin, die Filtermeldungen, die auf dem Router
generiert werden, mit der Priorität «debug» zu versehen −
und dann syslogd auf «byron» so zu konfigurieren, dass
Meldungen mit diesem Loglevel ins File /etc/linuxrouter.log
geschrieben werden.
Die oben diskutierte Konfiguration lässt sich wie folgt erzeugen:
Das Loglevel der Filtermeldungen wird im iptables Script des Routers
definiert. Im Beispiel wird zuerst eine Regelkette erzeugt, in die
anschliessend zwei Regeln eingefügt werden, welche UDP und TCP Pakete
verwerfen, die dabei erzeugten Logmeldungen entsprechend kennzeichnen und
mit der Priorität «debug» versehen.
# /etc/rc.d/rc.firewall - Configuration file containing firewall rules
# Create a user defined rule chain
# ---------------------------------------------------------
/usr/sbin/iptables -N my_drop
#
# Insert rules to drop UDP and TCP packets with the priority «debug»
# ---------------------------------------------------------
/usr/sbin/iptables -A my_drop -p UDP -j LOG --log-prefix "UDP_DROP: " --log-level debug
/usr/sbin/iptables -A my_drop -p TCP -j LOG --log-prefix "TCP_DROP: " --log-level debug
|
|
Sodann wird die Datei /etc/syslog.conf des Routers so angepasst,
dass alle gewünschten Logmeldungen an «byron» gesendet werden.
(Hinweis: In syslog.conf keine Leerzeichen verwenden, nur tabs.)
# /etc/syslog.conf - Configuration file for syslogd on linuxrouter
# For info about the format of this file, see «man syslog.conf»
#
# Log authentication information
# ---------------------------------------------------------
#auth.info /dev/tty9
auth.info @byron.mydomain
#
# Log kernel messages
# ---------------------------------------------------------
#kern.info /dev/tty10
kern.info @byron.mydomain
#
# Log packet filter messages
# ---------------------------------------------------------
kern.debug @byron.mydomain
#
# Log logins on the serial console
# ---------------------------------------------------------
authpriv @byron.mydomain
#
# Log emergencies
# ---------------------------------------------------------
*.emerg @byron.mydomain
|
|
Als nächstes wird /etc/syslog.conf des Logservers
angepasst, so dass syslogd «debug» Meldungen
in ein separates File schreibt.
# /etc/syslog.conf - Configuration file for syslogd on your logserver
# Display kernel messages (except debug) on tty10.
kern.*;kern.!=debug /dev/tty10
# Debugging information is logged here (except kernel debugging).
*.=debug;kern.!=debug -/var/log/debug
# Kernel debugging messages are logged here
kern.=debug -/var/log/linuxrouter.log
|
|
Der syslogd Daemon des Logservers muss mit der Option «-r»
gestartet werden, /usr/sbin/syslogd -r , damit der Server
auf Port 514 hört. In diesem Fall sollte Port 514 des Logservers
jedoch mit Hilfe des folgenden Scripts geschützt werden (das Script
muss auf dem Logserver installiert und ausgeführt werden, nicht
auf dem Router).
#!/bin/tcsh
#
# Description: Script protects udp port 514 of the logserver
#
# Script first completed: 2003-08-08
# Script last changed: 2003-08-09
#
set FIREWALL = 10.10.10.1
set IPTABLES = /usr/sbin/iptables
#
# Set default policy and flush all chains
# --------------------------------------------------------------
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
#
$IPTABLES -F # flush all chains (table filter)
$IPTABLES -t nat -F # flush all chains (table NT)
$IPTABLES -X # delete all userdefined chains
#
# Block port 514 for all traffic except from the fireall
# --------------------------------------------------------------
$IPTABLES -A INPUT -t filter -p udp --dport 514 -s ! $FIREWALL \
-j DROP
echo "Port 514 closed for all traffic except from firewall"
|
|
ntpd ist ein Daemon, der die Systemzeit überwacht und
sie mit der Systemzeit von definierten Internet Zeitservern
synchronisiert. Der Router kann damit als Zeitserver für
die Clients im LAN dienen. ntpd wird mit Hilfe der
Datei /etc/ntp.my_conf konfiguriert:
#/etc/ntp.my_conf - Configuration file for ntpd
server 129.132.2.21 prefer # swisstime.ethz.ch
server 130.149.17.8 # sombrero.tu-berlin.de
server 158.152.1.76 # ntp.demon.co.uk
server 127.127.1.0 # local clock (LCL)
fudge 127.127.1.0 stratum 10
# Make sure that localhost has full access
restrict 127.0.0.1
# Restrict access of the external servers
restrict 129.132.2.21 mask 255.255.255.255 noquery notrap nomodify
restrict 130.149.17.8 mask 255.255.255.255 noquery notrap nomodify
restrict 158.152.1.76 mask 255.255.255.255 noquery notrap nomodify
driftfile /etc/ntp/drift
logfile /tmp/ntp.log
|
|
Um ntpd beim Booten zu starten, /etc/rc.d/rc.local wie folgt
editieren:
# Use swisstime.ethz.ch to sync time
/usr/sbin/ntpdate 129.132.2.21
echo "Starting NTP server..."
/usr/sbin/ntpd -c /etc/ntp.my_conf
|
|
Ein geeignetes Firewall-Script (vergl.
Downloads) nach SLACK_LNX kopieren und an die eigenen Bedürfnisse
anpassen. Das Script anschliessend als /etc/rc.d/rc.firewall
abspeichern und mit den permissions rwx------ versehen:
# chmod 700 /etc/rc.d/rc.firewall
|
|
|