Die #hilfe Linux-Router-Anfänger-HOWTO
Da sich immer mehr Leute für Linux interessieren und oft auch ältere Rechner
haben, die sich als Router/Paketfilter anbieten und zu uns in den channel
kommen und eigentlich immer wieder die gleichen Probleme auftreten, habe ich
mich entschlossen, diese HOWTO zu schreiben.
Bitte nehmen Sie sich die Zeit und lesen Sie die HOWTO komplett durch. Beachten
Sie bitte die Ratschläge und Richtlinien zur Sicherheit. Leider sind viele Rechner
von Linux-Neulingen offen wie Scheunentore und dienen als Plattform für
Angriffe auf Server und andere Privatpersonen. Jeder Internet-Benutzer, egal
ob Serverbetreiber oder Providerkunde, ist mitverantwortlich für die
Sicherheit und reibungsloses Miteinander im Internet.
Es werden nicht nur technische sondern auch allgemeine und Sicherheitsfragen
behandelt. Selbstverständlich bin ich für Verbesserungsvorschläge offen und
bitte um Vorschläge und Erweiterungen an router-howto@exception.at.
Aus Mangel an Kenntnis anderer Distributionen liegt der Schwerpunkt dieser
HOWTO bei den Distributionen RedHat, Debian und SuSE.
Dies ist Version 0.1, erstellt am 17.4.2002.
Inhaltsverzeichnis
1.Allgemeines zum Thema Linux für Windows-Benutzer und Linux-Neulinge
1.1 Unterschiede zu Windows und ein kleiner Überblick
1.1.1 Die Bash
1.1.2 Der Texteditor vi
1.2 Einrichtung von Routing (eigentlich Masquerading oder NAT) und Paketfilterung
1.2.1 Router nach außen hin schließen und unnötige Dienste abschalten
1.2.2 Nicht benötigte Services stoppen
1.2.3 Sonderfall Inetd/Xinetd
1.2.4 Einrichten des Masquerading (Routing), des Paketfilters, Paketfilter-Skripte
1.2.5 Troubleshooting und FAQ (Häufig gestellte Fragen)
1.3 Benutzerrechte und was dabei zu beachten ist
1.4 Sicherheitsaspekte, allgemeines zur Sicherheit eines Computers
1.5 Sicherheitsaspekte, Linux-spezifische Dinge
1.6 Weiterführende Links (noch leer)
1.Allgemeines zum Thema Linux für Windows-Benutzer und Linux-Neulinge
1.1 Unterschiede zu Windows und ein kleiner Überblick
Linux unterscheidet sich erheblich von Windows. Wenn jemand Linux benutzen
möchte, muß er sich darauf einstellen, erst einmal sehr viel lesen und lernen
zu müssen und nur in kleinen Schritten vorankommt. Schnelle Erfolge sind am
Anfang eher selten. Zur "Linux-Premiere" empfiehlt es sich, eine Distribution
nicht herunterzuladen, sondern zu kaufen. Nicht nur um die Distributoren zu
unterstützen, sondern auch und hauptsächlich wegen der beiliegenden Handbücher.
Wenn von "Linux" geredet wird, ist eigentlich immer nur der Kernel, also der
Betriebssystemkern gemeint, nie eine spezielle Distribution.
Stabile Linux-Versionen existieren in drei Varianten: 2.0.x, 2.2.x, 2.4.x.
Dabei ist zu beachten, bei stabilen Versionen die Minor-Nummer (die zweite Zahl
in der Versionsnummer) immer eine gerade Zahl ist. 2.3.15 wäre also ein
(unstabiler) Entwicklerkernel und 2.2.16 ein stabiler Kernel für den produktiven
Einsatz.
Zum Zeitpunkt der Erstellung dieser FAQ sind die großen Distributionen bei den
Versionen 7.2 (RedHat) 8.0 (SuSE), 2.2 (Debian Potato), 3.1.1 (Caldera Open Linux)
und 8.2 (Mandrake) angelangt. Jeder Distributor hat seine eigenen Versionszyklen,
die Versionsnummern der Distributionen erlauben keinen Rückschluß über die Güte
und den Entwicklungsstand einer Distribution im Vergleich.
Wenn man sich für eine Distribution entschieden hat, sollte man die
Webseiten des Distributors besuchen und sich auf jeden Fall in die Security-Announce
Mailingliste des Distributors eintragen, so daß man von Bugfixes und Sicherheitsproblemen
benachrichtigt wird. Ein Beispiel aus der RedHat-SA-ML:
---------------------------------------------------------------------
Red Hat, Inc. Red Hat Security Advisory
Synopsis: Vulnerability in zlib library
Advisory ID: RHSA-2002:026-39
Issue date: 2002-02-11
Updated on: 2002-03-15
Product: Red Hat Linux
Keywords: zlib double free
Cross references: RHSA-2002:028 RHSA-2002:027
Obsoletes:
---------------------------------------------------------------------
1. Topic:
[Update 14 Mar 2002:
Updated kernel packages for Red Hat Linux 6.2 and 7.0 which were missing
the zlib fix; added missing kernel-headers package for 6.2.]
(Fehlerbeschreibung gekürzt)
2. Relevant releases/architectures:
Red Hat Linux 6.2 - alpha, i386, i586, i686, sparc
Red Hat Linux 7.0 - alpha, i386, i586, i686
Red Hat Linux 7.1 - alpha, i386, i586, i686, ia64
Red Hat Linux 7.2 - i386, i586, i686, ia64
(weitere Erklärungen zum Bugfix gekürzt)
4. Solution:
Before applying this update, make sure all previously released errata
relevant to your system have been applied.
To update all RPMs for your particular architecture, run:
rpm -Fvh [filenames]
where [filenames] is a list of the RPMs you wish to upgrade. Only those
RPMs which are currently installed will be updated. Those RPMs which are
not installed but included in the list will not be updated. Note that you
can also use wildcards (*.rpm) if your current directory *only* contains
the desired RPMs.
(Anleitungen zur Installation des Updates gekürzt)
6. RPMs required:
Red Hat Linux 6.2:
SRPMS:
ftp://updates.redhat.com/6.2/en/os/SRPMS/zlib-1.1.3-25.6.src.rpm
ftp://updates.redhat.com/6.2/en/os/SRPMS/cvs-1.11.1p1-6.2.src.rpm
(Liste mit RPMs für alle Redhat-Versionen gekürzt)
Man wird also umfangreich über Sicherheitslücken und deren Bugfixes informiert und
sollte sich deshalb in die Security-Announce-Mailingliste seines Providers
einschreiben um informiert und up-to-date zu sein. In der Regel kursieren
bei großen Sicherheitslücken spätestens mit Erscheinen solcher Bugfix-Mails
auch Programme, welche die Sicherheitslücken ausnutzen und sich Zugang zu einem
System verschaffen können.
Linux läßt sich vollkommen über die Textkonsole (auch Konsole oder Shell genannt)
bedienen und administrieren. Gerade bei einem Router empfiehlt es sich, garnicht
erst eine grafische Benutzeroberfläche zu installieren, zum einen stehen Router
meist sowieso an unzugänglicheren Plätzen die kein Aufstellen von Monitor und
Tastatur erlauben, zum anderen ist die Arbeit als Administrator mit einer
grafischen Benutzeroberfläche als riskant anzusehen. Weiteres dazu unter Punkt 1.3.
Nun geht es in die Praxis:
1.1.1 Die Bash und der Texteditor vi
Bevor wir unter Linux etwas einrichten und konfigurieren können müssen wir es
natürlich erst einmal bedienen können :-)
Nach dem Hochfahren des Rechners sehen wir eine Loginaufforderung wie diese:
Red Hat Linux release 7.2 (Enigma)
Kernel 2.4.9-21 on an i686
franz login: _
Franz ist in diesem Fall der Hostname des Rechners.
Wir geben unseren Benutzernamen ein und Linux erwartet ein Paßwort von uns:
Red Hat Linux release 7.2 (Enigma)
Kernel 2.4.9-21 on an i686
franz login: franz
Password:
Im Gegensatz zu Windows zeigt uns Linux nichts an, während wir das Paßwort
eingeben, auch keine "*". Wir geben also unser Paßwort blind ein. Nach der
Paßworteingabe sind wir eingelogged und werden mit einer Statusmeldung
begrüßt:
Last login: Mon Apr22 08:33:13 on tty1
[franz@franz franz]$_
Das Prompt (der Text am Anfang der Zeile hinter dem Textcursor) steht in
diesem Fall für Benutzer franz auf Host franz im Verzeichnis /home/franz.
Ein paar häufig gebrauchte Befehle mit Beispielen zum Ausprobieren
(/home/franz bitte durch Ihr eigenes Verzeichnis ersetzen):
pwd = print working directory (gibt das aktuelle verzeichnis aus in dem
man sich gerade befindet)
cd = Verzeichnis wechseln (cd /etc)
ls = Verzeichnisinhalt oder Dateien listen (ls /home/franz, ls /home/franz/test.txt)
ls -l = wie ls, aber genaue Auflistung (/ls -l /home/franz, ls -l /home/franz/test.txt)
mv = move, Dateien/Verzeichnisse verschieben und umbenennen
(mv test.txt test1.txt, mv /home/franz/test.txt /tmp/)
less = Textanzeiger für die Konsole (less text.txt)
more = ein weiterer Textanzeiger
cp = kopiert Dateien und Verzeichnisse (cp /home/franz/test.txt /tmp/)
man = zeigt die Manual Page (Anleitung, Referenz) zu einem Kommando an.
Zu jedem Kommando existiert eine Manual-Page. Manual Pages sind
die erste Informationsquelle bei Problemen und Fehlermeldungen.
Beispiel: man rm
mkdir = Erstellt ein neues Verzeichnis (mkdir /home/franz/test)
rm = remove, löscht Dateien und Verzeichnisse
Mitunter ist in der Shell eine Menge Tipparbeit zu verreichten, weshalb uns
die Shell da entgegenkommt. Sie merkt sich die Befehle die wir eingeben, so
daß wir sie mit der Pfeil-Oben-Taste der Reihe nach wieder abrufen können.
Außerdem bietet die Bash eine Kommandovervollständigung, die bei der Eingabe von
Pfaden und Kommandos hilfreich ist. Geben wir "mkd" ein und drücken die TAB-Taste,
wir bekommen einige passende Befehle angezeigt:
[franz@franz franz]$ mkd
mkdep mkdir mkdirhier
[franz@franz franz]$ mkd
Das gleiche funktioniert auch mit Pfaden:
[franz@franz franz]$ cd /usr/lo
local lost+found
[franz@franz franz]$ cd /usr/lo
Genaueres für DOS-Umsteiger ist im "Von DOS nach Linux HOWTO" von Guido Gonzato
(guido@ibogfs.cineca.it) und Tilo Wenzel auf
http://www.tu-harburg.de/~semb2204/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html
zu finden. Außerdem ist http://www.koehntopp.de/kris/artikel/unix/shellprogrammierung/
von Kristian Köhntopp zu empfehlen, dort findet sich weiterführendes Wissen zum Thema
Shell und Shellskripte.
1.1.2 Der Texteditor vi -Kurzeinführung-
Fast alle Konfigurationsarbeiten werden unter Linux mit dem Texteditor ausgeführt.
Deshalb eine Kurzeinführung zum wohl meistverbreiteten Editor, dem vi/vim:
Der vi hat etwas, was ihn von den meisten Editoren unterscheidet, er besitzt zwei
Arbeitsmodi: den Kommandomodus und den Editiermodus. Im Kommandomodus ist keine
Textbearbeitung möglich, sondern nur die Eingabe von Kommandos, analog dazu ist
im Editiermodus keine Kommandoeingabe (Laden, Speichern, etc) möglich. Nach dem
Start befindet sich der vi im Kommandomodus. Die bequemste Methode ist es, dem
vi die zu bearbeitende Datei gleich beim Aufruf mitzugeben. Wir erstellen eine
Testdatei zum Ausprobieren:
[franz@franz franz]$ echo "dies ist ein test" > test.txt
[franz@franz franz]$ vi test.txt
Wir sehen nun folgendes:
dies ist ein test
~
~
~
~
~
~
~
~
"test.txt" 1L, 18C 1,1 All
Die Zeile ganz unten mit dem Dateinamen ist die Befehlszeile, in der wir unsere
Befehle eingeben.
Um den Text nun bearbeiten zu können, gehen wir mit "i" (insert) in den Eingabemodus.
Wir schreiben ein wenig herum und verlassen den Eingabemodus durch drücken der
Taste ESC und bedinden uns wieder im Kommandomodus.
Nun löschen wir das erste Wort in der ersten Zeile, indem wir den Cursor mit den
Pfeiltasten auf die erste zeile links am Anfang bewegen und mit "x" drei Buchstaben
und der Leerzeichen löschen. Unser "Meisterwerk" wollen wir natürlich auch speichern.
Wir befinden uns ja bereits im Kommandomodus, drücken also nur noch ":wq", was den
vi veranlaßt, die Datei zu speichern und sich zu beenden. "wq" steht für "write quit".
Das sieht dann so aus:
dies ist ein test
~
~
~
~
~
~
~
~
:wq
Nach dem Drücken der Enter-Taste wird der eingegebene Befehl (hier wq) ausgeführt.
Alle Kommandos des vi sind in dieser Kurzform gehalten, der Kommandomodus mit den
Kurzbefehlen ersetzt das sonst übliche Menü mit den Funktionen. Bei der folgenden
Auflistung der gängigsten Kommandos wird davon ausgegangen, daß man sich im Editiermodus
befindet, also erst mit ESC in den Kommandomodus wechseln muß. Ein mehrmaliges Drücken
von ESC schadet aber nicht, man bleibt auf jeden Fall im Kommandomodus.
vi beenden ESC:q
vi beenden ohne zu speichern: ESC:q!
vi beenden und speichern: ESC:wq
Text speichern: ESC:w
Buchstaben löschen ESC:x oder DEL/Backspace im Editiermodus
UNDO letzte Aktion: ESC:u
UNDO für ganze Zeile ESC:U
REDO ESC:R
gehe zu Zeile 32 ESC32G (ohne Doppelpunkt nach ESC)
suchen ESC/ (/test sucht nach dem Wort "test)
suchen und ersetzen ESC:s/altes_wort/neues_wort
(ersetzt in der aktuellen Zeile "altes_wort" durch "neues_wort")
suchen und ersetzen im ganzen Text ESC:%s/altes_wort/neues_wort
(ersetzt im gesamten Text "altes_wort" durch "neues_wort")
Hilfe anzeigen ESC:help
Hilfe beenden ESC:q (beendet nur die Hilfe, nicht den Editor)
Es empfiehlt sich, etwas herumzuspielen bis man die "Philosopie" des vi/vim
verstanden hat, bevor man sich an die Bearbeitung von Konfigurationen
heranwagt.
1.2 Einrichtung von Routing (eigentlich Masquerading oder NAT) und Paketfilterung
So, Linux ist installiert und soll jetzt als Router/Paketfilter fürs LAN
dienen. Je nach Art des Internetzugangs muß der Linux-Rechner für die
Verbindung ins Internet entsprechend eingerichtet werden. Dafür erstellen wir
einzelne Szenarien, jeweils für einen Internetzugang per TV-Kabel und ADSL.
Momentan existiert nur das Szenario für TV-Kabel-Anschluß. Für ADSL-Benutzer
finden sich auf www.adsl4linux.de umfangreiche HOWTOS, ich werde diese HOWTO
erweitern, sobald ich ein williges Opfer mit ADSL gefunden habe :-)
Die Leute aus der Newsgroup at.linux haben bereits ein sehr einsteigertaugliches
und umfangreiches HOWTO geschrieben, das "Austrian Highspeed Internetconnection
& Linux HOWTO", das auf http://howto.htlw16.ac.at/at-highspeed-howto.html
zu finden ist und auf Kabelnetze, ISDN und ADSL eingeht.
Es wird davon ausgegangen daß die Hardware, besonders die Netzwerkkarten
richtig erkannt werden und die richtigen Treibermodule geladen werden. Für
den Fall daß irgendetwas nicht funktioniert bitte in der Troubleshooting-
Sektion nachschauen.
Grundsätzlich ist der gleichzeitige Betrieb von mehreren Rechnern an einem
Internetzugang bei den meisten Providern untersagt. Man verstößt also
gegen die Nutzungsbedingungen wenn man mehrere Rechner an einem
Internetzugang gleichzeitig benutzt, dies kann zur Kündigung des Zugangs
führen.
Der Betrieb eines Routers ist mit einigem Aufwand nachweisbar. Nicht nachweisbar
ist allerdings daß hinter einem Router mehrere Rechner stehen :-)
Zunächst einmal ein paar Hintergrund-Informationen und ein Test-Szenario,
Szenario A, Internetzugang per TV-Kabel
Wir haben ein kleines LAN (Local Area Network) mit 2 Windows-Rechnern
und einem Linux-Router.
Der Linux-Router ist über eine Netzwerkkarte mit dem Kabelmodem verbunden.
Die Verkabelung sieht wie folgt aus:
Internet-> Kabel-Modem-> Linux-Router -> HUB oder Switch -> Windows-Rechner A
|
|--> Windows-Rechner B
Jetzt wird auch ersichtlich, warum der Router 2 Netzwerkkarten braucht.
Karte 1 stellt die Verbindung zum Internet her, Karte 2 die Verbindung zum LAN.
Karte 1 (eth0, Ethernet-Schnittstelle Nummer 0) hat eine im Internet gültige
IP-Adresse, entweder fest vom Provider vergeben oder per DHCP bei der Einwahl
angefordert. Die jeweils passende Variante ist während der Linux-Installation
bei der Konfiguration des Netzwerkes anzugeben. Bei Problemen siehe Troubleshooting-
Sektion.
Karte 2 (eth1) bekommt eine feste IP-Adresse, die nicht zu den im Internet gültigen
IP-Adressen gehört. Dvon gibt es 3 Klassen:
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.16.255.255
192.168.0.0 - 192.168.255.255
Zu beachten ist, daß die erste IP-Adresse die Adresse des Netzwerkes selbst ist.
192.168.0.0 ist also eine Netzwerkadresse, 192.168.0.1 die erste mögliche
Adresse in diesem Netz. Die letzte mögliche Adresse hängt von der Netzwerkmaske ab.
Bei unserem Testszenario mit 2 Rechnern reicht es völlig aus wenn wir die letzten
drei Stellen der IP-Adresse für unsere Zwecke verwenden. Wir teilen unserem
Betriebssystem dies mit indem wir die Netzwerkmaske auf 255.255.255.0 festlegen.
Eine Verknüpfung von IP-Adresse und Maske ergibt dann die mögliche Anzahl der
IP-Adressen die in unserem Netz zur Verfügung stehen:
192.168.0.0 entspricht ausgeschrieben 192.168.000.000 (4 Bytes pro Segment x 4 Segmente)
255.255.255.0 entspricht ausgeschrieben 255.255.255.000
Die erste Adresse (in inserem Fall 192.168.0.0) ist die Adresse des Netzwerkes selbst
und NICHT als Hostadresse verwendbar.
Also:
erste verwendbare IP-Adresse 192.168.000.001 = 192.168.0.1
letzte verwendbare IP-Adresse 192.168.000.255 = 192.168.0.255
192.168.0.255 als letzte verwendbare IP-Adresse ist nicht ganz korrekt, da ein Netz
auch Broadcast- und Multicast-Adressen hat. Diese Adressen hängen von der
Netzmaske ab. Da man aber mit der kleinsten Adresse anfangen sollte und ich lediglich
Basics vermitteln will, habe ich es mal so definiert.
Wir vergeben vom Anfang an durch, damit haben wir:
Linux-Router interne IP: 192.168.0.1
Windows-Rechner 1 : 192.168.0.2
Windows-Rechner 2 : 192.168.0.3
Netzmaske für alle : 255.255.255.0
Sofern die Netzwerkkarten bei der Linux-Installation korrekt erkannt wurden,
hat man schon dort die Möglichkeit, die Adresse und Maske für die Karte zum
internen Netz zu vergeben.
Bei RedHat 7.2 sind die Parameter in der Datei
/etc/sysconfig/network-scripts/ifcfg-eth1:
DEVICE=eth1 #Gerätename eth1 für Ethernet, Schnittstelle 1
BOOTPROTO=static #IP wird fest vergeben
IPADDR=192.168.1.1 #vergebene IP-Adresse
NETMASK=255.255.255.0 #Netzwerkmaske
ONBOOT=yes #beim booten Interface starten
Bei Debian sind die Parameter in der Datei
/etc/network/interfaces:
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
Bei SuSE bis einschließlich 7.3 stehen diese Einstellungten in der
/etc/rc.config, bei SuSE ab 8.0 vermutlich im Verzeichnis /etc/sysconfig.
Die Auswahl für eth0 als externe und eth1 als interne Schnittstelle ist
willkürlich, andersherum würde es genauso funktionieren.
Nun wird rebooted und mit ifconfig geschaut ob die interfaces geladen
wurden:
[root@XXXXX root]# ifconfig
eth0 Protokoll:Ethernet Hardware Adresse XX:XX:XX:XX:XX:XX
inet Adresse:XXX.XXX.XXX.XXX Bcast:XXX.XXX.XXX.XXX Maske:XXX.XXX.XXX.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2013115 errors:4740 dropped:0 overruns:12 frame:4740
TX packets:1404223 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:6795 Sendewarteschlangenlänge:100
RX bytes:815739445 (777.9 Mb) TX bytes:186842796 (178.1 Mb)
Interrupt:3 Basisadresse:0x280
eth1 Protokoll:Ethernet Hardware Adresse 00:E0:7D:76:98:22
inet Adresse:192.168.1.1 Bcast:192.168.1.255 Maske:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:855426 errors:0 dropped:0 overruns:0 frame:0
TX packets:805814 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:3803 Sendewarteschlangenlänge:100
RX bytes:152011374 (144.9 Mb) TX bytes:535204019 (510.4 Mb)
Interrupt:11 Basisadresse:0x6100
lo Protokoll:Lokale Schleife
inet Adresse:127.0.0.1 Maske:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:577317 errors:0 dropped:0 overruns:0 frame:0
TX packets:577317 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:0
RX bytes:55228497 (52.6 Mb) TX bytes:55228497 (52.6 Mb)
Interessant sind für uns erst einmal nur:
eth0 Protokoll:Ethernet Hardware Adresse XX:XX:XX:XX:XX:XX
inet Adresse:XXX.XXX.XXX.XXX Bcast:XXX.XXX.XXX.XXX Maske:XXX.XXX.XXX.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Das externe Interface eth0 hat eine IP-Adresse zugewiesen bekommen (anonymisiert), ist
"UP and RUNNING" also online, empfängt Broadcasts und Multicasts. Die Hardware-Adresse
entspricht der MAC-Adresse der Karte, hier ist darauf zu achten, daß sie nicht
FF:FF:FF:FF:FF:FF beträgt, was mit einigen Netgear-Karten beobachtet wurde. Siehe auch
Troubleshooting-Sektion.
eth1 Protokoll:Ethernet Hardware Adresse 00:E0:7D:76:98:22
inet Adresse:192.168.0.1 Bcast:192.168.0.255 Maske:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Adresse und Netzmaske wurden dem Beispiel entsprechend eingestellt, restliche Beschreibung
siehe eth0.
lo ist das Loopback-interface, das nicht im Netzwerk aktiv ist, sondern
für lokale Dinge benutzt wird.
Nachdem hier alles paßt und auch die Windows-Rechner auf LAN-IPs umgestellt wurden
(192.168.0.2 auf Win-Rechner 1 und 192.168.0.3 auf Win-Rechner 2, sowie als Gateway
auf beiden auf die interne IP des Routers 192.168.0.1 und ebenfalls auf beiden die
Netzmaske auf 255.255.255.0)
sollten sich alle Rechner im LAN pingen können. Wenn nicht, siehe Troubleshooting-Sektion.
Nun sollten noch, soweit nicht bereits bei der Linux-Installation gemacht, die DNS-Server
des Providers dem System bekanntgemacht werden. Die DNS-Server stehen in der Regel in der
/etc/resolv.conf:
search
nameserver
nameserver
Es können beliebig viele Provider-dns-server angegeben werden. Wenn die Verbindung zum Provider
mit DHCP aufgebaut wird, werden diese Einträge automatisch korrekt gesetzt. Sofern der
Provider DHCP anbietet (was fast alle Provider tun) ist das zu bevorzugen, da man sich
nicht um die Einstellung von Gateway und DNS kümmern muß. Einträge für DNS sehen bei Redhat
so aus:
-RedHat: /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
-Debian: /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
Außerdem müssen natürlich die DHCP-Clients installiert sein:
-RedHat: rpm -Uvh dhcpcd-1.3.18pl8-13.rpm oder höhere Version
-Debian: apt-get install pump
1.2.1 Router nach außen hin schließen und unnötige Dienste abschalten
Nachdem unser Router jetzt im Internet ist, gilt unser erstes Interesse der Sicherheit.
Portscannen (Absuchen fremder Rechner nach laufenden Serverdiensten) ist neuer
Volkssport und dem Schreiber ist es einmal passiert, daß er 10 Minuten nach der Linux-
Installation den ersten Connect (Verbindungsaufnahme) am FTP-Server eines frisch
installierten Routers hatte. Wir brauchen also einen Schutz vor unerwünschten
Verbindungsversuchen.
Was ist eine Firewall eigentlich genau ? Eine Firewall ist weder ein Programm noch ein
Rechner. Eine Firewall ist ein Sicherheits-Konzept. Was im allgemeinen mit "Firewall"
bezeichnet wird, ist in den allermeisten Fällen ein Paketfilter, der Teile eines
Firewall-Konzeptes realisiert.
Wie der Name schon andeutet, werden die eingehenden Pakete "gefiltert". Im Vergleich
zum Kaffeefilter werden unerwünschte Pakete einfach verworfen, so wie der Kaffeesatz,
der im Filter verbleibt und weggeworfen wird.
Eine umfangreiche Dokumentation zum Thema Paketfilter und zum hier auch angewendeten
Programm "iptables" ist bei den Autoren dieses Programmes auf www.netfilter.org zu finden.
Grundsätzlich sollte man nicht benötigte Serverdienste abschalten. Einen unnötigen
Serverdienst laufen lassen und ihn dann mit einem Paketfilter zu schützen ist nicht
nur ineffektiv, sondern auch gefährlich, da ein Paketfilter unter Umständen auch
Lücken haben kann. Außerdem kann nur dort eine Verbindung hergestellt werden, wo auch
ein Serverdienst läuft.
Anders gesagt, kann ich nur in eine Wohnung gehen, wenn die Wohnungstür geöffnet wurde.
Und einen Wächter hinstellen damit niemand die Wohnung durch die geöffnete Tür betreten
kann, wird sicher auch der Leser als wenig sinnvoll betrachten :-)
Linux ist frisch nach der Installation nur wenig sicherer als Windows, weil (je nach
Art der Installation) eine Reihe unbenötigter Serverdienste laufen.
Die Debian-Besitzer haben es hier wohl am einfachsten, bei Debian läuft nach der
Standard-Installation normalerweise kein Serverdienst.
1.2.2 Nicht benötigte Services stoppen
Schauen wir uns einmal an, was auf unserem frisch eingerichteten RedHat 7.2-System
an Serverdiensten läuft:
[root@XXXXXX root]# netstat -andp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 823/httpd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 765/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 509/portmap
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 1080/X
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 672/sshd
Außer tcp ist als Protokoll auch udp möglich. "0.0.0.0" bei "Local Address" bedeutet, daß der
Serverdienst auf ALLEN IP-Adressen die unserer Router hat zur Verfügung steht. Das sind bei unserem
Router immerhin drei, eth0, eth1 und lo. Die Zahl nach dem Doppelpunkt (z.b. "0 0.0.0.0:80") gibt
den Port an, auf dem ein Dienst auf Verbindungen wartet. im Beispiel ist das Port 80. Eine Liste
aller Ports findet sich in /etc/services, wo wir bei 80/tcp finden:
http 80/tcp www www-http # WorldWideWeb HTTP
Auf Port 80 läuft also ein www-Serverdienst.
- Laufenden httpd beenden:
[root@XXXXXX root]# /etc/init.d/httpd stop
httpd stoppen: [ OK ]
[root@XXXXXX root]#
- Sicherstellen, daß er auch nach einem Reboot nicht mehr gestartet wird:
(Redhat- und SuSE 8.0-Variante)
[root@XXXXXX root]# chkconfig --level 2345 httpd off
[root@XXXXXX root]#
Wir schalten damit den httpd (der ja bei netstat unter "Program name" als Serverdienst
angegeben ist) für die Runlevel 2,3,4,5 ab. Die Bedeutung der Runlevel bei RedHat in Kürze:
0 - halt (herunterfahren und ausschalten des Rechners)
1 - Einzelbenutzermodus OHNE Netzwerk
2 - Mehrbenutzermodus mit Netzwerk, ohne NetworkFileSystem
3 - Mehrbenutzermodus mit vollständiger Netzwerk-Funktionalität
4 - unbenutzt
5 - X11 (Grafische Benutzeroberfläche)
6 - reboot
Andere Linux-Distributionen verteilen die Runlevel anders, es lohnt sich, mit less in die
inittab zu schauen (less /etc/inittab).
Wir überprüfen (RedHat und SuSE 8.0-Variante):
[root@XXXXXX root]# chkconfig --list httpd
httpd 0:Aus 1:Aus 2:Aus 3:Aus 4:Aus 5:Aus 6:Aus
[root@XXXXXX root]#
Somit ist sichergestellt, daß dieser Dienst auch nach einem Reboot nicht mehr
gestartet wird.
Eine vollständige Übersicht aller verfügbaren Dienste erhält man mit "chkconfig --list".
Wir verfahren mit allen Diensten, die wir in der Ausgabe von netstat finden genauso,
mit Ausnahme des sshd.
Der sshd nimmt eine Sonderstellung ein, weil er von uns später auf jeden Fall gebraucht wird.
"sshd" steht für "super secure shell daemon". "Daemon" werden Dienste genannt, die im Hintergrund
laufen und Services aller Art bereitstellen, nicht nur fürs Netzwerk. Wie der Name schon
andeutet, stellt der sshd einen Shellzugang, also eine Art "Eingabeaufforderung" übers
Netzwerk bereit, die zur Fernwartung des Rechners übers Netzwerk dient (remote login).
Eine sehr unsichere Alternative zu ssh ist telnet. Im Gegensatz zu ssh läuft bei telnet
die Kommunikation zwischen den beiden Hosts unverschlüsselt ab, so daß auch die eingegebenen
Paßwörter sehr leicht dem Datenverkehr zu entnehmen sind. Vom Betrieb eines Telnet-Logins
ist auf jeden Fall abzuraten und ein laufender telnet-Dienst sollte auf jeden Fall
abgeschaltet werden.
Wir wollen unseren Router nur von innen erreichen, nehmen uns also einen Texteditor und
bearbeiten die Konfigurationsdatei, die (wie fast alle Konfigurationsdateien) in /etc
liegt.
Dazu ist natürlich ein Texteditor notwendig, ich empfehle den vim, weil er klein und
schlank ist und auf fast jedem UNIX-System und auf den Linux-Rettungssystemen zu finden ist.
Die Bedienung ist etwas gewöhnungsbedürftig, aber schnell zu erlernen. Im Kapitel 1.1.2 wird
die Bedienung des vi/vim kurz behandelt.
RedHat und Debian installieren den vimtutor mit, der ein kleines Praxis-Tutorial für den vim
darstellt und einfach mit "vimtutor" aufgerufen wird.
[root@XXXXXX root]# vi /etc/ssh/sshd_config
Der Anfang der Konfigurationsdatei dürfte ähnlich wie hier aussehen:
# $OpenBSD: sshd_config,v 1.48 2002/02/19 02:50:59 deraadt Exp $
# This is the sshd server system-wide configuration file. See sshd(8)
# for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
#Port 22
#Protocol 2,1
#ListenAddress 0.0.0.0
#ListenAddress ::
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
...
(Rest gekürzt)
Für uns ist nur eine Zeile wichtig:
#ListenAddress 0.0.0.0
Das # am Anfang bedeutet, daß diese Zeile auskommentiert ist, also vom sshd
als Kommentar interpretiert und ignoriert wird.
Wir gehen auf das "#" in dieser Zeile, drücken "x" um das Zeichen zu löschen,
anschließend auf die "0.0.0.0" und löschen sie genauso. Anschließend mit "i"
in den Eingabemodus und an Stelle der "0.0.0.0" "192.168.1.1" eingeben. Wir
haben dann:
ListenAddress 192.168.0.1
dort stehen. Damit ist sichergestellt, daß der sshd nur in unserem lokalen Netz
auf Verbindungsanfragen wartet.Wir beenden den Eingabemodus mit der ESC-Taste,
geben ":wq" ein, womit wir die Datei zurückschreiben und den Editor beenden.
Nun starten wir den sshd neu, damit er seine Konfigurationsdatei neu einliest:
[root@XXXXXX root]# /etc/init.d/sshd restart
sshd stoppen: [ OK ]
sshd starten: [ OK ]
[root@XXXXXX root]#
und kontrollieren:
[root@XXXXXX root]# netstat -andp | grep sshd
tcp 0 0 192.168.0.1:22 0.0.0.0:* LISTEN 712/sshd
[root@XXXXXX root]#
Im Vergleich zu oben haben wir nun statt "0.0.0.0:22" ein "192.168.0.1:22",
es ist also sichergestellt, daß sich niemand mehr von außen einloggen kann. Wichtig
sind hier noch die Dateien /etc/hosts.allow und /etc/hosts.deny, die im Zusammenhang
mit dem Xinetd diskutiert werden.
Im Grunde könnten wir jetzt unseren Router in eine Ecke stellen, Tastatur und Monitor
abziehen und alles weitere per ssh übers Netzwerk erledigen. Es gibt auch für Windows
ssh-Clients, "Putty" ist relativ beliebt, weil er klein ist, lediglich aus einer
".exe"-Datei besteht und somit einfach zu handhaben ist. Putty gibts hier zum
downloaden: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
1.2.3 Sonderfall Inetd/Xinetd
Nun gibt es noch eine weitere Besonderheit, den Inetd/Xinetd. Beide sind sogenannte
"Superserver", die sozusagen für andere Serverdienste an den jeweiligen Ports auf
Verbindungsanfragen warten. Vereinfacht gesehen läuft dies nach folgendem Schema
(mit einer Anfrage auf Port 21(ftp) als Beispiel) ab:
- Verbindungsanfrage von außen an Port 21
- Inetd/Xinetd nimmt die Verbindungsanfrage entgegen und schaut im empfangenen Paket
nach, welcher Host der Absender dieses Paketes ist.
- Nachschauen in /etc/hosts.allow, ob eine passende Regel für den Host vorhanden ist, die
eine Verbindungsaufnahme ERLAUBT
- wenn ja, Zugang gewähren.
- wenn nein, nachschauen in /etc/hosts.deny, ob eine passende Regel für den Host vorhanden
ist, die eine Verbindungsaufnahme VERBIETET
- wenn ja, Zugang verweigern
- wenn nein, Zugang gewähren
Eine gute Strategie ist es, allen den Zugang zu verweigern und nur einzelne Ausnahmen zu definieren.
im Umgekehrten Fall ist der Verwaltungsaufwand für den Administrator um ein Vielfaches höher,
unübersichtlicher, und somit auch viel fehleranfälliger. Ein Beispiel:
/etc/hosts.allow:
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
sshd:192.168.1.2
ntpd:192.168.1.2
ntp:192.168.1.2
imapd:192.168.1.0/24
ftp:192.168.1.0/24
/etc/hosts.deny:
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
ALL:ALL EXCEPT localhost
Arbeitsweise des inetd:
Bei einen ftp-loginversuch von außen von der IP-Adresse 222.222.222.222 wird nun in hosts.allow
geschaut, ob diese IP für den passenden Dienst in der inetd.conf(hier ftp) vorhanden ist. Dies ist
nicht der Fall (ftp:192.168.1.0/24 , also nur für 192.168.1.0-192.168.1.255), also wird in
/etc/hosts.deny geschaut, wo "ALL:ALL EXCEPT localhost" (alle dienste für alle verbieten,
außer localhost, also 127.0.0.1) vorgefunden wird. Die Verbindungsanfrage wird also abgelehnt.
Wäre die anfragende IP aus dem Netz 192.168.1.0/24, also z.B. 192.168.1.2, würde der Verbindungsanfrage
stattgegeben werden und die passende Zeile in der /etc/inetd.conf ausgeführt werden:
ftp stream tcp nowait root /usr/sbin/tcpd usr/local/sbin/vsftpd
Der Xinetd geht etwas anders vor, er hat noch eine weitere Kontrollinstanz. Jeder vom Xinetd
gesteuerte Service hat eine eigene Konfigurationsdatei in /etc/xinetd.d. Man kann sie in der
/etc/xinetd.conf auch zusammenfassen, aber der Übersicht halber wird meist ein eigenes Verzeichnis
mit einer Datei pro Service angelegt. In unserem Beispiel ist das /etc/xinetd.d/ftp:
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/ftpd
log_on_success += DURATION USERID
log_on_failure += USERID
disable = no
}
Würde anstatt
"disable = no"
ein
"disable = yes"
aufgeführt sein, würde die Verbindung gleich ohne weitere Prüfung von /etc/hosts.allow
und /etc/hosts.deny abgelehnt werden.
Bei beiden Superserver-Varianten ist es wichtig, daß der in der Konfiguration aufgeführte Dienst
im Namen mit der dazugehörigen Regel in /etc/hosts.allow und /etc/hosts.deny übereinstimmt.
Ansonsten kommt wird die Verbindung abgelehnt weil keine Regel übereinstimmt oder die
Weiterleitung an den jeweiligen Dienst scheitert, weil kein passendes Programm für die
Übergabe gefunden wurde.
SSHD und hosts.allow/deny:
Will man ssh-Zugang von außen für einzelne Rechner oder Netze gestatten, bietet sich ebenfalls
eine Zeile in /etc/hosts.allow an, der sshd beachtet diese Dateien ebenfalls. Beispiel:
sshd:222.222.222.222
gestattet der IP-Adresse 222.222.222.222 den ssh-Zugang. Soweit möglich, sollte man
IP-Adressen für Einträge verwenden.
Zum Abstellen/Einschränken der Dienste des Inetd/Xinetd hat man nun mehrere Möglichkeiten:
- wenn garnichts benötigt wird: Inetd/Xinetd abschalten (siehe 1.2.2)
- beim inetd nicht benötigte Dienste auskommentieren (# an den Anfang der Zeile), Beispiel:
# ident stream tcp wait identd /usr/sbin/identd identd
- beim Xinetd siehe oben
Richtlinie: Alles verbieten, Ausnahmen erlauben, nichts anbieten was nicht unbedingt benötigt
wird, jeder zusätzliche Service ist ein Sicherheitsrisiko. Wenn ich nicht weiß was ein
Service tut, kann ich davon ausgehen daß ich ihn nicht brauche.
Diese Richtlinie und die obigen Maßnahmen sind nicht übertrieben, sondern für den
Alltagsgebrauch von Privatpersonen gedacht.
Für Hochsicherheits-Systeme wird wesentlich mehr Aufwand getrieben.
1.2.4 Einrichten des Masquerading (Routing), des Paketfilters, Paketfilter-Skripte
Nachdem wir nun unnötige Dienste abgeschaltet und nötige Dienste eingeschränkt haben, können
wir unser LAN ins Internet lassen. Sinn und Zweck dieser FAQ ist es, Anfänger relativ schnell
und einfach so weit zu bringen, daß sie von einem sicheren System aus ins Internet können und
auf einem sicheren Linux-System ihre ersten Schritte machen können.
Aus diesem Grunde wird hier einfach ein Paketfilter-Skript für Kernel 2.2.x, basierend auf ipchains
und ein Paketfilter-Skript für Kernel 2.4.x, basierend auf iptables bereitgestellt.
Das Skript für ipchains:
(noch zu erledigen)
Das Skript für iptables:
-----------------------------------------------------------------------------
#!/bin/bash
## ICMP-Typen
#
# 0: echo reply (pong)
# 3: destination-unreachable (port-unreachable, fragmentation-needed etc).
# 4: source quench
# 5: redirect
# 8: echo request (ping)
# 9: router advertisement
# 10: router solicitation
# 11: time-exceeded
# 12: parameter-problem
# 13: timestamp request
# 14: timestamp reply
# 15: information request
# 16: information reply
# 17: address mask request
# 18: address mask reply
IPTABLES=`which iptables` # pfad zu iptables
DEV_EXT=eth0 # externes interface
DEV_INT=eth1 # internes interface
#limits schaffen, um DoS zu erschweren und masquerading einschalten
# einige auskommentiert, kernelspezifisch
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "0" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate
# echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate
# echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate
# echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/accept_redirects
# echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
# echo "0" > /proc/sys/net/ipv4/conf/all/bootp_relay
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
# default-policies festlegen
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
# laden der module für iptables-connection-tracking
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_conntrack_irc
modprobe ip_nat_irc
# löschen aller alten evtl noch vorhandenen rules
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
# loopback muß lokal offen sein
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
# masquerading einschalten
$IPTABLES -t nat -A POSTROUTING -o $DEV_EXT -j MASQUERADE
# pakete die zu bestehenden verbindungen gehören (established)
# und solche die dazugehören (related) dürfen rein
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# icmp rules
# type 0 echo-reply (ping)
$IPTABLES -A INPUT -p icmp --icmp-type 0 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 0 -s 0/0 -d 0/0 -j ACCEPT
# type 3 destination-unreachable (port-unreachable, fragmentation-needed
$IPTABLES -A INPUT -p icmp --icmp-type 3 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 3 -s 0/0 -d 0/0 -j ACCEPT
# type 4 source quench
$IPTABLES -A INPUT -p icmp --icmp-type 4 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 4 -s 0/0 -d 0/0 -j ACCEPT
# type 8 echo request
$IPTABLES -A INPUT -p icmp --icmp-type 8 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 8 -s 0/0 -d 0/0 -j ACCEPT
#type 11 time exceeded
$IPTABLES -A INPUT -p icmp --icmp-type 11 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 11 -s 0/0 -d 0/0 -j ACCEPT
#type 12 parameter problem
$IPTABLES -A INPUT -p icmp --icmp-type 12 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 12 -s 0/0 -d 0/0 -j ACCEPT
#type 13 timestamp request
$IPTABLES -A INPUT -p icmp --icmp-type 13 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 13 -s 0/0 -d 0/0 -j ACCEPT
#type 14 timestamp reply
$IPTABLES -A INPUT -p icmp --icmp-type 14 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 14 -s 0/0 -d 0/0 -j ACCEPT
#type 17 address mask request
$IPTABLES -A INPUT -p icmp --icmp-type 17 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 17 -s 0/0 -d 0/0 -j ACCEPT
#type 18 address mask reply
$IPTABLES -A INPUT -p icmp --icmp-type 18 -s 0/0 -d 0/0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 18 -s 0/0 -d 0/0 -j ACCEPT
# ident-anfragen rejecten
$IPTABLES -A INPUT -i $DEV_EXT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# keine verbindungsanfragen an $DEV_EXT beantworten
$IPTABLES -A INPUT -m state --state NEW -i ! $DEV_EXT -j ACCEPT
# verbindungsanfragen und geblockte pakete loggen
$IPTABLES -A INPUT -i $DEV_EXT -m state --state NEW,INVALID -j LOG
# alles verwerfen, was auf keine bisherige regel gepaßt hat
$IPTABLES -A INPUT -j REJECT
------------------------------------------------------------------------------
Zu beachten ist, daß der Paketfilter mit diesem Skript auch auf Ping-Anfragen nicht antwortet.
Skript als "paketfilter.sh" speichern, mit "chmod 700 paketfilter.sh" ausführbar machen und
nach /sbin kopieren: cp paketfilter.sh /sbin
Anschließend dafür sorgen, daß das Skript beim Hochfahren des Routers auch gestartet wird.
-Redhat
vi /etc/rc.local
am Ende einfügen: /sbin/paketfilter.sh
-SuSE
noch zu erledigen
-Debian
noch zu erledigen
Anschließend entweder den Router rebooten oder /sbin/paketfilter.sh eingeben, um das Skript
zu starten. Fehlermeldungen beim Ausführen des Skriptes bitte per mail an
router-howto@exception.at.
1.2.5 Troubleshooting
Frage: Internet-Zugang funktioniert wunderbar, alle Rechner im LAN können sich pingen, aber
die Rechner hinter dem Router kommen nicht ins Internet! Bei ifconfig hat die interne
Netzwerkkarte die Hardware-Adresse FF:FF:FF:FF:FF:FF!
Antwort:Dies wurde mit Netgear-Karten beobachtet. Abhilfe: ins Paketfilter-Skript am Anfang
folgende Befehle hinzufügen:
ifconfig eth0 down
ifconfig ifconfig eth0 hw ether DF:01:44:22:21:DE up
Die 6 Hexadezimalzahlen hinter "ether" sind die neue MAC-Adresse der internen
Netzwerkkarte. Diese ist natürlich so zu wählen daß sie nur einmal im LAN
existiert.
Frage: Ich würde ja gern mal Linux probieren, aber welche Distribution soll ich nehmen ?
Antwort:Das ist eine sehr brisante Frage, die in vielen Foren, Newsgroups und IRC-Channels
regelmäßig längere hitzige Diskussionen auslöst, weil jeder natürlich "seine"
für die beste hält. Die Frage ist zunächst einmal, was soll mit dem Linux-Rechner
gemacht werden und auf welcher Hardware soll es laufen ? Für ältere Rechner
(100-200 Mhz, 32 MB RAM) empfehlen sich Debian oder RedHat, wobei 32 MB RAM für
RedHat das Minimum sind.
Auf einem halbwegs aktuellen Rechner (ab 400 Mhz, Platte ab 2 GB) laufen alle
Distributionen. Wenn man Linux richtig kennenlernen will und vor längeren Lernphasen
nicht zurückschreckt, empfehlen sich Debian oder Slackware, mit RedHat ist man
schon etwas schneller am Ziel, sollte aber auch etwas Geduld haben.
Am einfachsten für Anfänger zu handhaben sind wohl SuSE und Mandrake. SuSE ist
im europäischen Raum sehr weit verbreitet, ist aber mit dem YAST-Administrationstool,
eigenen RPM-Dateien etwas außerhalb des Mainstreams, gibt aber ein kompaktes
Bild ab, in dem alles zusammenpaßt, solange man nur SuSE-Pakete verwendet. SuSE
braucht nach meinen Erfahrungen relativ viel Platz und Rechenpower, auf einem
120 Mhz-Rechner war eine SuSE 7.3 individuell gesehen zu langsam.
Um Mandrake-Erfahrungsberichte wird gebeten :-)
Frage: Ich möchte einen HTTP(FTP,SSH,etc)-Server betreiben, der auch von außen erreichbar
sein soll. Was muß ich im Paketfilterskript ändern ?
Antwort:Bitte lesen Sie die Dokumentation zu iptables(ipchains). Diese HOWTO ist für den
Einsteiger gedacht, der damit schnell und sicher ins Netz kommen soll. Für den
Serverbetrieb ist umfangreiches Wissen erforderlich, daß man sich mit Hilfe von
Büchern und anderer Dokumentation selbst erarbeiten sollte.
Frage: Ich habe eine Frage, die hier nicht beantwortet wird oder möchte etwas zu diesem
Text beitragen!
Antwort:Dieser Text entstand aus den Alltagserfahrungen im IRCnet-Channel #hilfe, dort ist
fast immer jemand zu erreichen der an diesem Text mitgearbeitet hat oder
weiterhelfen kann. Alternativ ist der Schreiber dieser FAQ auch per Mail
unter router-howto@exception.at zu erreichen.
Bei Fragen im IRC oder in Newsgroups ist die Angabe der Kernel-Version
und der Distribution wichtig. Wie komme ich zur Kernel-Version ?
-Kernel-Version:
[franz@franz franz]$ uname -r
2.4.9-21
Die Troubleshooting-Sektion wird ständig erweitert, es lohnt sich, öfter mal vorbeizuschauen.
1.3 Benutzerrechte und was dabei zu beachten ist
Linux ist ein vollwertiges Mehrbenutzer-Betriebssystem. Es können mehrere
Benutzer gleichzeitig an einem Linux-Rechner arbeiten. Daraus ergibt sich
die Notwendigkeit, die Bereiche der einzelnen Benutzer voneinander zu trennen.
Das wird mit Benutzernamen und mit Benutzergruppen erreicht.
Ein (einfaches) Beispiel (unter RedHat 7.2):
[franz@franz franz]$ groups
franz disk news smbusers
[franz@franz franz]$
Der Benutzer franz hat sich mit dem Befehl "groups" anzeigen lassen, in welchen
Gruppen er Mitglied ist. Er ist Mitglied der Gruppen franz, disk, news, smbusers.
Benutzer werden auch User oder Account genannt.
Die Zugriffsrechte für das CD-Laufwerk sind nun so ausgelegt, daß nur Mitglieder
der Gruppe disk und der Administrator(root) darauf zugreifen können:
lrwxrwx--- 1 root disk 8 Mär 15 03:09 /dev/cdrom
Im zweiten bis vierten Buchstaben stehen die Rechte für den Besitzer (hier root),
im fünften bis siebten Buchstaben die Rechte für die Gruppe (disk) und in den
letzten drei Buchstaben die Rechte für alle anderen.
r steht für read (Leserechte)
w steht für write (Schreibrechte)
x steht für executable (Rechte zum Ausführen eines Programmes)
Dem Benutzer Franz wird also soweit vertraut, daß ihm erlaubt wird auf das
CD-Laufwerk zuzugreifen. Mit diesem Schema ist es relativ gut möglich, Benutzern
all das zu gestatten was sie brauchen, ohne das System größeren Risiken auszusetzen.
Jedes Programm läuft unter einer Benutzer-ID und hat nur die Rechte des Benutzers
der es gestartet hat.
Genaueres findet man auf der Homepage des Deutschen Linux HOWTO Projektes
(http://www.tu-harburg.de/~semb2204/dlhp/) im "Von DOS nach Linux HOWTO"
von Guido Gonzato (guido@ibogfs.cineca.it) und Tilo Wenzel auf
http://www.tu-harburg.de/~semb2204/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html .
1.4 Sicherheitsaspekte, allgemeines zur Sicherheit eines Computers
Sicherheit wird oft als störend oder hindernd empfunden. Gerade dann, wenn
man soeben erst sein Linux installiert hat und es nun näher kennenlernen will.
Aus diesem Grunde werden sehr oft gerade die Linux-Rechner von Anfängern Opfer
von Angriffen. Sinn und Zweck dieser Angriffe:
- Verwendung des gehackten Rechners für ferngesteuerte Angriffe
auf andere Rechner (DDoS)
- einen Rechner als temporären FTP-Server für Raubkopien
oder auch Pornografie zu verwenden
- Verwendung als "Basisstation" um von dort aus in andere Rechner
einzubrechen
Oft wird etwas erst nach Wochen oder Monaten entdeckt, sei es weil man sich über
außergewöhnliche Aktivitäten wundert oder weil die Polizei einem den Rechner
beschlagnahmt weil jemand einen Warez- oder Porno-FTP angezeigt hat.
Fatal ist, daß der eigene Rechner von Fremden als Werkzeug benutzt werden kann
um anderen Leuten zu schaden oder um Dinge zu tun die gegen Gesetze verstoßen.
Es ist äusserst wichtig, daß man seinen Rechner besonders schützt um seine
Mitmenschen und sich selbst vor Schaden zu bewahren. Das ist ganz besonders
für einen Rechner/Router/Server wichtig, der rund um die Uhr mit dem Internet
verbunden ist.
Sie sind als Betreiber eines Computers mit Internetzugang mitverantwortlich
für die Sicherheit Ihrer Mitmenschen!
Umfangreiche Informationen zum Thema Netzwerksicherheit finden Sie in den
Newsgruppen de.comp.security.misc, FAQ dieser Gruppe auf
http://www.rz.tu-ilmenau.de/~traenk/dcsm.htm
und de.comp.security.firewall (Achtung,rauhes Klima dort),deren FAQ von Lutz
Donnerhacke auf http://www.iks-jena.de/mitarb/lutz/usenet/Firewall.html
1.5 Sicherheitsaspekte, Linux-spezifische Dinge
Fehlende oder unzureichende Rechte sind oft der Grund warum etwas nicht
funktioniert. Trotzdem ist UNBEDINGT darauf zu achten daß niemand (auch kein
Programm) mehr Rechte bekommt als unbedingt notwendig. Hier kann es schnell
passieren daß ein Benutzer zu großzügig ausgelegte Rechte mißbraucht oder
Fehler in einem Programm ausnutzt um sich mehr Rechte im System zu verschaffen.
Dies kann auch von außen, also aus dem Netzwerk heraus, passieren.
Aus diesem Grund empfiehlt es sich als root (der Administrator unter Linux, also
derjenige der "allmächtig" ist und alles darf) keine grafische Benutzeroberfläche
zu verwenden. Alles was von root gestartet wird, läuft auch mit den Rechten von root.
Und das kann bei einer grafischen Benutzeroberfläche sehr viel sein, im vergleich
zur Kommandozeile/Konsole/Shell, wo nur die Shell selbst und das gerade eingegebene
Kommando mit root-Rechten läuft.
Man sollte also neben root IMMER einen ganz normalen Benutzer auf seinem Rechner
haben, mit dem die alltäglichen Sachen erledigt werden.
Ebenso ist darauf zu achten daß root sich nicht aus dem Netzwerk am Rechner
anmelden kann. Immer als normaler Benutzer einloggen und anschließend mit su
zum administrator/root-account wechseln.
Grundsätzlich gilt es, bei allem was man tut auf Fehlermeldungen zu achten
und in die Logdateien in /var/log zu schauen. Wenn bei einem Programmstart
oder einem Kommando keine Rückmeldung erfolgt, kann man in der Regel davon
ausgehen, daß kein Fehler aufgetreten ist.