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.