iptables richtige Regeln zum Konzept?

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

iptables richtige Regeln zum Konzept?

Beitrag von mclien » 06.03.2006 16:38:25

Folgendes versuche ich gerade mit iptables umzusetzen:

ein Rechner der folgendes können soll:
(wahrscheinlich hinter einen HW router)

zunächst soll er mal alles dicht machen ausser den localhost und bestehenden verbindungen

Code: Alles auswählen

iptables -F 

iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD DROP 

iptables -A INPUT –i localhost –j ACCEPT
iptables -A OUTPUT –o localhost –j ACCEPT
iptables -A FROWARD –s localhost –j ACCEPT

iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

dann soll er per ssh ereichbar sein (auf port >1023)
(und das auch nur mit korrektem schlüssel!)

Code: Alles auswählen

iptables -A INPUT –i eth0 –p udp –dport 1024 –j ACCEPT
iptables -A OUTPUT –o eth0 –p udp –dport 1024 –j ACCEPT
ausserdem sollen einige wenige http://www.seiten erreichbar sein (eine Regel als Bsp.),
aber keine Verbindungen von aussen, die nicht zur outgoing gehören zulasen

Code: Alles auswählen

iptables -A OUTPUT –o eth0  –p tcp –dport 80 –d ‘erlaubte-www-seite’ –j ACCEPT 
iptables -A INPUT –i eth0 –p tcp –dport 80 !–-syn –j ACCEPT
Vom internet aus soll Apache (oder tomcat) über https erreichbar sein:

Code: Alles auswählen

iptables -A INPUT –i eth0 –p tcp –sport 443 –j ACCEPT
auf pings soll er antworten, aber kein (D)DoS- Opfer werden

Code: Alles auswählen

iptables -A OUTPUT –o eth0 –p icmp –j ACCEPT
iptables -A INPUT –i eth0 –p icmp --icmp-type echo-request -m limit --limit 1/s –j ACCEPT
In der Hoffnung hier niemand über Gebühr zu belästigen, bitte ich im Hinweise auf Lücken, Fehler oder schonungslose Beschimpfungen falls ich mal wieder zuwenig gelesen habe, bevor ich fragte.

so long mclien

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 06.03.2006 16:48:30

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Die beiden Regeln in allen Ehren, aber dann fehlt bei den Dingen, die du explizit erlauben willst das -m state --state NEW damit die Verbindungen auch korrekt erkannt werden.

Benutzeravatar
herrchen
Beiträge: 3257
Registriert: 15.08.2005 20:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Re: iptables richtige Regeln zum Konzept?

Beitrag von herrchen » 06.03.2006 17:03:38

mclien hat geschrieben:

Code: Alles auswählen

iptables -A INPUT –i localhost –j ACCEPT
interface ist "lo".

Code: Alles auswählen

iptables -A OUTPUT –o localhost –j ACCEPT
iptables -A FROWARD –s localhost –j ACCEPT
s.o.
die zweite regel dürfte überflüssig sein.
dann soll er per ssh ereichbar sein (auf port >1023)
(und das auch nur mit korrektem schlüssel!)

Code: Alles auswählen

iptables -A INPUT –i eth0 –p udp –dport 1024 –j ACCEPT
iptables -A OUTPUT –o eth0 –p udp –dport 1024 –j ACCEPT
protocol "tcp"
die zweite regel ist überfüssig --> wird von "ESTABLISHED,RELATED" erschlagen.
die schlüssel geschichte wird mit dem "sshd" geregelt.
ausserdem sollen einige wenige http://www.seiten erreichbar sein (eine Regel als Bsp.),
aber keine Verbindungen von aussen, die nicht zur outgoing gehören zulasen

Code: Alles auswählen

iptables -A OUTPUT –o eth0  –p tcp –dport 80 –d ‘erlaubte-www-seite’ –j ACCEPT 
iptables -A INPUT –i eth0 –p tcp –dport 80 !–-syn –j ACCEPT
dafür wird ein proxy gebraucht, oder du verwendest IPs.
was soll die zweite regel machen?
Vom internet aus soll Apache (oder tomcat) über https erreichbar sein:

Code: Alles auswählen

iptables -A INPUT –i eth0 –p tcp –sport 443 –j ACCEPT
es muss "dport" sein.
oder schonungslose Beschimpfungen
sonderbehandlung muss ich dir berechnen.

herrchen

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: iptables richtige Regeln zum Konzept?

Beitrag von mclien » 07.03.2006 10:12:27

Schonmal vielen Dank für die schnelle Unterstützung.
Also bei allen neuen Verbindungen -m-state --state NEW zufügen.
..und noch ein paar Folgefragen:
herrchen hat geschrieben:

Code: Alles auswählen

iptables -A INPUT –i eth0 –p tcp –dport 1024 –j ACCEPT
iptables -A OUTPUT –o eth0 –p tcp –dport 1024 –j ACCEPT
die zweite regel ist überfüssig --> wird von "ESTABLISHED,RELATED" erschlagen.
Stimmt ich hatte nicht erwähnt, daß ich von dem Rechner ggf. auch per ssh andere Rechner erreichen muß. Dann brauch sie doch wieder mit --state NEW, oder?
die schlüssel geschichte wird mit dem "sshd" geregelt.
Ja, /etc/ssh/sshd_config soll auch noch mein Freund werden

Code: Alles auswählen

iptables -A OUTPUT –o eth0  –p tcp –dport 80 –d ‘erlaubte-www-seite’ –j ACCEPT 
dafür wird ein proxy gebraucht, oder du verwendest IPs.
Reicht nicht auch ein Nameserver?

Code: Alles auswählen

iptables -A INPUT –i eth0 –p tcp –dport 80 !–-syn –j ACCEPT
was soll die zweite regel machen?
Öhöm, (nochmal) daran erinnern, daß man nach dem zufügen der ESTABLISHED, RELATED Regeln weiter oben, nochmal die anderen Regeln konrollieren muß?
:oops:
Hatte erst den Weg eingeschlagen die Regeln für bestehende Verbindungen einzeln an die jeweiligen Regeln anzubauen, bis die Idee kam das 'allgemein' über ESTABLISHED, RELATED zu machen.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 07.03.2006 10:56:26

Ach ja, weil ichs grad sehe: bei SSH solltest du schon -p tcp statt -p udp nehmen. SSH laeuft ueber TCP.
Dann gibts du da noch bisschen viel fuer SSH frei.
Wenn du von aussen erreichbar sein willst:

Code: Alles auswählen

iptables -A INPUT -p tcp --dport <dein SSH-Server-Port> -i eth0 -m state --state NEW -j ACCEPT
Damit hast du nur den einen Port nach aussen offen, an dem auch dein SSH-Daemon lauscht.
Fuer ausgehende SSH-Verbindungen auf andere Rechner isses bisschen schwer. Wenn der Default-Port 22 genutzt wird, dann kannst du das mit

Code: Alles auswählen

iptables -A OUTPUT -p tcp --dport 22 -o eth0 -m state --state NEW -j ACCEPT
freischalten.
Wenn du auf Rechner musst, deren SSH-Daemon nicht am Standardport lauscht, solltest du dir eventuell die entsprechenden Ports einzeln hinzufuegen. Einfach mal

Code: Alles auswählen

iptables -A OUPUT -p tcp -o eth0 -j ACCEPT
bohrt naemlich ein riesen Loch nach aussen...

Ach ja, deine beiden Regeln mit Port 1024 matchen auch nur, wenn der Ziel-Port genau 1024 ist. Gehts auf 1025 greifen die Regeln nicht mehr. Port-Ranges gibst du so an:

Code: Alles auswählen

--dport 1024:65535
. Damit waeren alle Zielports von 1024-65535 gemeint.

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Beitrag von mclien » 07.03.2006 11:31:07

nepos hat geschrieben:Ach ja, weil ichs grad sehe: bei SSH solltest du schon -p tcp statt -p udp nehmen. SSH laeuft ueber TCP.
das sagt herrchen auch :wink:
Frage zu meiner Ent-Dummung: wofür gibts dann in /etc/services den ssh-port einmal mit tcp und einmal mit udp?
Dann gibts du da noch bisschen viel fuer SSH frei.

Wenn du auf Rechner musst, deren SSH-Daemon nicht am Standardport lauscht, solltest du dir eventuell die entsprechenden Ports einzeln hinzufuegen. Einfach mal

Code: Alles auswählen

iptables -A OUPUT -p tcp -o eth0 -j ACCEPT
bohrt naemlich ein riesen Loch nach aussen...
Da sich nur bestimmte rechner gegenseitig erreichen sollen, werde ich wohl die Ports pflegen.
Ach ja, deine beiden Regeln mit Port 1024 matchen auch nur, wenn der Ziel-Port genau 1024 ist.
So wars auch beabsichtigt.

Achja noch etwas zu ntp:
braucht man da nur lauschen, oder muß man den aktiv abrufen?
ausserdem wollte ich die Zeit nur per cron abholen. In etwa so: iptables-regel zufügen, ntp-zeit holen, regel wieder entfernen.
Oder ist das dann doch langsam paranoid?

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Beitrag von mclien » 07.03.2006 11:37:33

Noch ne prinzipielle Frage:
angenommen irgendein Bösewicht will meine Erreichbarkeit sabotieren indem er mir tausende von pings schickt, was ja mit:

Code: Alles auswählen

iptables -A INPUT –i eth0 –p icmp --icmp-type echo-request -m limit --limit 1/s -m state --state NEW –j ACCEPT
verhindert seien sollte.
Ists dann für mich Lotterie ein ping-echo von meinem Server zu bekommen?

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 07.03.2006 12:25:05

Fuer sowas wie die ping-Geschichte solltest du dir eventuell mal das Modul recent angucken. Das koennte hier hilfreicher sein. Prinzipiell hast du aber trotzdem den Traffic zu dir hin, auch wenn keine Antworten zurueckgegeben werden.

Warum da nun bei SSH auch UDP mit dabeisteht, da bin ich ehrlich gesagt ueberfragt.
Bei DNS steht auch TCP dabei, obwohl fuer normale DNS-Anfragen nur UDP benoetigt wird. Nur fuer Dinge wie Zonetransfers zwischen DNS-Servern wird auf TCP zurueckgegriffen.

Zur Sache mit NTP und cron: eigentlich wuerds ja reichen, wenn du das ueber die States Richtung NTP-Server entsprechend freischaltest. Die Regel tut eigentlich nicht weh, auch wenn du das per Cron anschiebst. Wenn du Regeln abhaengig von bestimmten Zeiten brauchst, schau mal bei den iptables-Modulen, da gibts meines Wissens auch eines, mit dem man Regeln abhaengig von Uhrzeiten und Wochentagen einstellen kann. Mir faellt nur grade der Name nicht mehr ein.

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Beitrag von mclien » 07.03.2006 15:05:12

nepos hat geschrieben:Fuer sowas wie die ping-Geschichte solltest du dir eventuell mal das Modul recent angucken. Das koennte hier hilfreicher sein. Prinzipiell hast du aber trotzdem den Traffic zu dir hin, auch wenn keine Antworten zurueckgegeben werden.
Das bedeutet dann aber, egal wie ichs drehe: Wenn ich von extern den rechner anpinge und keine Antwort bekomme, weiß ich nie ob der Rechner down ist oder zuviele Anfragen hat.
Oder stehe ich jetzt gerade voll auf der Leitung?
Zur Sache mit NTP und cron: eigentlich wuerds ja reichen, wenn du das ueber die States Richtung NTP-Server entsprechend freischaltest. Die Regel tut eigentlich nicht weh, auch wenn du das per Cron anschiebst. Wenn du Regeln abhaengig von bestimmten Zeiten brauchst, schau mal bei den iptables-Modulen, da gibts meines Wissens auch eines, mit dem man Regeln abhaengig von Uhrzeiten und Wochentagen einstellen kann. Mir faellt nur grade der Name nicht mehr ein.
Es ging mehr darum den port nur dann offen zu haben wenn ich ihn brauche. Damit quasi der offene port nicht die ganze Zeit als Angriffsziel vorhanden ist....
-> desshalb die Frage obs paranoid ist...

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 07.03.2006 15:55:22

Naja, auch wenn der Port offen ist aber nichts dran lauscht, dann is das kein Problem.

Und ja, mit der Ping-Geschichte hast du wohl recht. Wobei da eben dieses RECENT-Modul hilfreich waere, denn das arbeitet auf IP-Adressebene und damit koenntest du nur die Adressen blocken, die dich aergern. Wenn du dann von ner anderen mit ping nachschaust, ob dein Rechner da ist, wird das nicht geblockt.

Antworten