StratoPower-Server Firewall einrichten/konfig.

Hallo ;) Da bin ich wieder mit viele Fragen, habe mich gerade mit der Lektüre HowTo vertraut gemacht und bin dabei diese zum zweiten mal zu lesen.

Ich bin bei "Rustys schnelle Anleitung zum Paketfilter" unsicher stehengeblieben.
Nach dem ich das Befehl: # iptable -L eingegeben habe (kene mich jetzt schon bischen aus) habe ich beunruhige Antwort erhalten:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Wie ich schon verstanden habe, mein Rootserver ist für alle offen, keine Regeln!
Soll ich die Regeln die dort erwähnt wurden, einfügen?
Code:
 # iptables -N block
  # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
  # iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
  # iptables -A block -j DROP
  
  ## Von INPUT und FORWARD Ketten zu dieser Kette springen
  # iptables -A INPUT -j block
  # iptables -A FORWARD -j block

Edit:
Damit Ihr wisst wie ich mein Server konfigurieren möchte, was ich nutzen will, gebe ich hier als Info: html, php, mysql, mail ohne smtp, apache, ftp und Zugang zur PuTTY, ViSSAS, Mysqlfront - denke dass ist alles.
P.S. Ich bin mir bewüßt daß Mann diesen Thema nich an einem Tag oder Jahr richtig verstehen kann, wie gesagt, irgendwo muß mann anfangen.
Mich reiz das Thema, werde mir ganz bestimmt einige Bücher zulegen, bis dahin werde ich Euch mit Fragen überflütten bis ich gebannt werde (hoffe nicht ;) )
 
Zuletzt bearbeitet:
Wichtig ist es zu wissen welches Netzwerk-Interface auf dem Server die Verbindung zur Aussenwelt herstellt. Mittels ifconfig kannst Du Dir alle aktiven Netzwerk-Interfaces anzeigen lassen.
Falls Du nur eines hast ist's ganz einfach. Wenn nicht kannst Du es evtl. am Namen erkennen, da bin ich mir bei so einem Root-Server aber nicht ganz so sicher da ich nicht glaube, dass der per PPP verbunden ist.
eth sind Netzwerkkarten, ppp sind Einwahlverbindungen.
Falls Du aber eth0 und eth1 hast, dann solltest Du mittels tcpdump eth0 und tcpdump eth1 feststellen auf welchem Device die Verbindungen reinkommen.
Zu wissen auf welchem Device Du die Firewall anbauen musst ist schonmal die halbe Miete. Andernfalls kannst Du Dir das Device in der Firewall-Konfiguration aber auch schenken und einfach fuer alle dicht machen.

So, jetzt mal zu ein paar Ports.
HTTP TCP 80
SSH TCP 22 (PuTTY connected ueber SSH, oder Telnet, aber Telnet ist unsicher)
FTP TCP 21
MySQL TCP 3306

PHP nutzt keinen eigenen Port, da das ja auf dem Webserver ausgefuehrt wird. Dementsprechend kommen auch PHP-generierte Websites von Port 80.
Dieses Vissas kenne ich nicht, ob MySQL-Front einen eigenen Port nutzt weiss ich nicht, koennte mir vorstellen, dass das auch ueber 3306 geht.
Ansonsten verraet Dir ein nmap -sT localhost was so an Ports offen ist.

Ach ja HTTPS (SSL-verschluesseltes HTTP) hat TCP 443.

So, ich glaub damit kannste jetzt erstmal weiterarbeiten. ;)
 
So sieht Portscan bei mir aus:

portscan0nf.gif


Und hier meine Systemkonfiguratio. So kann Man besser sehen ;)

syskonfig3gh.gif


Bei nmap -sT localhost habe ich so eine Antwort bekommen: command not found :(
@reptilier
Kannst du mir bitte eine fertige Kette für mein Server basteln? Aber nur mit Zugang für HTTP, ich habe 3 mal HowTo gelesen und viel erfahren, leider konnte ich keine Kete zusammenbasteln die mein Rechner ganz ausspert und NUR zugang zur port 80 offen lässt (soll dabei ganz offen sein?).
 
Ich kann Dir sowas schreiben, klar.
Wirklich nur Port 80? Bist Du sicher?
Brauchst Du nicht vielleicht auch noch ein paar Ports um z.B. per SSH zu connected oder die Admin-Oberflaeche zu erreichen?
 
Wirklich nur Port 80? Bist Du sicher?
Brauchst Du nicht vielleicht auch noch ein paar Ports um z.B. per SSH zu connected oder die Admin-Oberflaeche zu erreichen?
Doch bitte. Da bleibt mir noch einiges zb. ftp und mailserver wo ich noch üben könnte ohne Gefahr entgegen zu laufen mich auszusperren.


Also, ich würde als erstes neue Kette erstellen mit der Bezeichnung z.B. "globalfirewall"
# iptables -N globalfirewall
Und wie Man die Ports sperrt, keine Ahnung. Es steht dort in der HowTo wie Man die Kette erstellt und wieder löscht, Regeln aufstellt aber über Portsperrung habe ich nichts gefunden. Ich vermute dass man anhand der Regeln die Verbindung kontroliert aber es ist zur komplex um da durchzublicken.

Noch etwas, was hälts du von diesem Buch? Ist das richtige für mich?
http://www.amazon.de/exec/obidos/ASIN/3898422607/ref=pd_bxgy_text_1/302-9283941-7176840
 
Zuletzt bearbeitet:
Das Buch hoert sich nicht schlecht an, koennte schon hilfreich sein.
Und der Preis ist auch echt gut. 22 Euros fuer knapp 600 Seiten kann sich schon sehen lassen.

Okay, ich schreib Dir hier mal ein kurzes Script hin mit dem Du alles bis auf HTTP dicht machst. Setz es aber nicht in der Form ein, weil Du Dich dann wohl aussperren wirst.
Code:
iptables -N firewall
iptables -A firewall -p tcp --dport 80 -j ACCEPT
iptables -A firewall -i lo -j ACCEPT
iptables -A firewall -j DROP
iptables -A INPUT -j firewall

Zur Erklaerung:
Die erste Zeile erstellt die Kette firewall, welche in den naechsten 3 Zeilen mit Inhalt gefuellt wird.
Zuerst wird eingetragen, dass Pakete an TCP-Port 80 (der HTTP-Port) akzeptiert werden sollen.
Danach folgt die Anweisung zum Akzeptieren aller Pakete auf der Interface lo. Das ist das Loopback-Interface, das wird in der Regel von Programmen genutzt um intern miteinander zu kommunizieren.
Zeile 4 laesst dann alle Pakete die nicht zuvor akzeptiert wurden droppen. Du kannst auch REJECT anstelle von DROP nutzen. Der Unterschied ist, dass bei DROP keine ICMP-Fehlermeldung an den Client geschickt wird.
Zu guter Letzt wird die Kette firewall noch in die Kette INPUT eingefuegt, damit eingehende Pakete durch diese Kette geschleust werden.

Ich denke anhand dieses Beispiels kannst Du einigermassen nachvollziehen wie Du weiter vorgehen musst um auch die anderen Ports zu oeffnen.
Allgemein ist es auf jeden Fall sinnvoller alles per DROP oder REJECT abzuweisen und nur zu oeffnen was benoetigt wird.
Du musst Pakete auf jeden Fall vor dem ultimativen DROP (iptables -A firewall -j DROP) akzeptieren, da Pakete die einmal akzeptiert oder gedropt wurden aus der Kette fliegen und nachfolgende Regeln fuer diese Pakete keine Bedeutung mehr haben.
 
ich hätte ihm lieber ein richtiges beispiel fuer ssh gezeigt... ;) wenn er deine chain richtig kopiert und die ssh chain dann falsch macht, dann bringt ihm das beispiel leider auch nix mehr... :p
 
Er wollte doch HTTP, und ich denke mal dass er das soweit schon hinkriegt.
Selbst wenn er den SSH-Port nicht aus dem Gedaechtnis weiss, hat er ja das Ergebnis seines Port-Scans. Und ich hab den Port in einem frueheren Posting bereits erwaehnt, sogar mit Protokoll.
Also denke ich, dass das jetzt mal relativ unkritisch ist.
 
Wir könnten "-N firewall" in "-N INPUT" umbenennen können? Oder ist das nicht egal.Nun ich habe bisschen in Internet gegoogelt, gelesen und nachgeguckt in HowTo, und habe deinen script wie folgt ergänzt:

Code:
  iptables -N INPUT
 iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 iptables -A INPUT -p udp --dport 80 -j ACCEPT
 iptables -A INPUT -p tcp --dport 21 -j ACCEPT
 iptables -A INPUT -p udp --dport 21 -j ACCEPT
 iptables -A INPUT -p ssh --dport 22 -j ACCEPT
 iptables -A INPUT -p smtp --dport 25 -j ACCEPT
 iptables -A INPUT -p domain --dport 53 -j ACCEPT
 iptables -A INPUT -p pop3 --dport 110 -j ACCEPT
 iptables -A INPUT -p sunrpc --dport 111 -j ACCEPT
 iptables -A INPUT -p imap --dport 143 -j ACCEPT
 iptables -A INPUT -p TLS/SSL --dport 443 -993 -995 -j ACCEPT
 iptables -A INPUT -p spamd --dport 783 -j ACCEPT
 iptables -A INPUT -p rndc --dport 953 -j ACCEPT
 iptables -A INPUT -p mysql --dport 3306 -j ACCEPT
 iptables -A INPUT -i lo -j ACCEPT
 iptables -A INPUT -j DROP
 iptables -A INPUT -j firewall
 
 iptables -N FORWARD
 iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
 iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j
  ACCEPT
 iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
 iptables -A FORWARD -p all -j DROP


Jetzt könnt Ihr lachen :D Aber, das ist mein erster script in meinem Leben :) Natürlich mit Eurer Hilfe.
Ich habe die Namen der Ketten geändert und zusätzlich eine neue Kette erstellt zur Schutz gegen Syn-flood, Portscanner und Ping of death :) (abgeschrieben von HowTo und selber ergänzt)
Kannst du jetzt einen richtigen script zeigen? Jetzt bin ich gespannt wo mein Denkfehler war. Ich vermute bei fast allen Bezeichnungen zwischen "-p" und "--dport".
Weiterhin habe ich damit Probleme, dass ich nicht weiß wie auf bestimmten Port zugegriffen wird. Als Beispiel sehen wir port 80 und port 21 und 22.(tcp/udp)
Weiter, Port trennen z.B. (was ist richtig)
--dport 443 -993 -995 -j ACCEPT
--dport 443-993-995 -j ACCEPT
Gelesen habe ich, dass zwei Portnamen getrennt durch ein "-" Zeichen werden. Meine Frage ist, wie ist richtig, Man darf nur zwei port trennen oder dürfen mehr in eine Reihe sein und ob Pausen dazwischen sein müssen oder nicht (wie oben in Beispiel).

Noch etwas was ich vorher vergessen habe:


Code:
:~ # ifconfig
          
            eth0	  Link encap:Ethernet  HWaddr 00:04:**:**:**:**
          
            		  inet addr:81.***.**.**  Bcast:81.***.**.**  Mask:255.255.255.255
          
            		  inet6 addr: fe80::203:67ff:fe5d:b006/64 Scope:Link
          
            		  UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          
            		  RX packets:2435 errors:0 dropped:0 overruns:0 frame:0
          
            		  TX packets:1773 errors:0 dropped:0 overruns:0 carrier:0
          
            		  collisions:0 txqueuelen:1000
          
            		  RX bytes:354184 (345.8 Kb)  TX bytes:455876 (445.1 Kb)
          
            		  Interrupt:23 Base address:0xe400
          
             
          
            lo		Link encap:Local Loopback
          
            		  inet addr:127.0.0.1  Mask:255.0.0.0
          
            		  inet6 addr: ::1/128 Scope:Host
          
            		  UP LOOPBACK RUNNING  MTU:16436  Metric:1
          
            		  RX packets:120540 errors:0 dropped:0 overruns:0 frame:0
          
            		  TX packets:120540 errors:0 dropped:0 overruns:0 carrier:0
          
            		  collisions:0 txqueuelen:0
          
            		  RX bytes:6032397 (5.7 Mb)  TX bytes:6032397 (5.7 Mb)



Noch mal Danke für Eure Mühe.
Grüße
 
Zuletzt bearbeitet:
Erstmal zum umbenennen der Chain:
Nein, Du kannst die Chain firewall nicht einfach INPUT nennen, denn die Chain INPUT ist eine Chain die fest im System drin ist.
Du kannst aber die Regeln direkt dort hinein setzen wenn Du das moechtest, ich bevorzuge aber eigene Chains zu schreiben und von INPUT dorthin zu springen.
Gross geschriebene Ketten, wie z.B. INPUT, FORWARD und OUTPUT sind fest drin, daher ist es sinnvoll selbst erstellte Ketten klein zu schreiben. Siehe mein Beispiel firewall

Nun zum Script.
Du hast die Protokolle falsch angegeben. Das anzugebende Protokoll ist das Level 3/4 Protokoll wie z.B. TCP oder UDP, nicht das hoeherliegende Protokoll wie ssh.
Es gibt ja keine SSH-Ports und keine MySQL-Ports. Es gibt TCP-Ports, davon wird einer fuer SSH genutzt und auch einer fuer MySQL. Und es gibt auch UDP-Ports, ich glaub der DHCP-Server nutzt UDP.

Da Du kein Routing machst kann Deine FORWARD-Chain leer sein. Ansonsten wuerde Die auch einfach auf die Chain firewall verweisen. Wenn kein Routing gemacht wird laeuft kein Paket durch die Chain FORWARD.
Eingehende Pakete landen in INPUT, ausgehende Pakete in OUTPUT. Pakete die durch den Rechner hindurch geroutet werden landen in FORWARD.
Weiterhin hast Du in der FORWARD-Chain ein paar schoene Konstrukte gebaut um den Verbindungsstatus zu checken.
Das war aus oben genanntem Grund (kein Paket wird jemals diese Regeln durchlaufen) etwas ueberfluessig. Ausserdem hast Du Dir ein wenig mehr Arbeit gemacht als noetig da es mittlerweile einfacher geht.
Du kannst den Status einer Connection mit folgenden Zeilen checken: (ich mach's jetzt ohne Protokolle und Ports, und alles mit ACCEPT, ist nicht sinnvoll, aber nur als Beispiel)
Code:
iptables -A firewall -m state --state NEW -j ACCEPT
iptables -A firewall -m state --state ESTABLISHED -j ACCEPT
iptables -A firewall -m state --state RELATED -j ACCEPT
iptables -A firewall -m state --state INVALID -j ACCEPT
Okay, zur Erklaerung:
Zeile 1
NEW ist fuer neue Verbindungen, und sonst nichts.
Zeile 2
ESTABLISHED ist fuer Verbindungen die bereits bestehen, wird in der Regel mit Zeile 3 verbunden und sieht dann so aus ... --state ESTABLED, RELATED -j ACCEPT
Zeile 3
Bei FTP wird zusaetzlich zur Control-Connection auch eine Data-Connection aufgebaut, das wird vom Connection-Tracking-Code erkannt und mittels RELATED koennen auch solche Verbindungen zugelassen werden.
Zeile 4
INVALID ist nie gut, darum kannst Du im Grunde im Script in der 2. Zeile (nach -N firewall) die Zeile iptables -A firewall -m state --state INVALID -j DROP einfuegen.

So, ich hoffe ich konnte etwas Klarheit in den ganzen Firewall-Djungel bringen.

Nachtrag: Um ehrlich zu sein weiss ich jetzt nicht wie Ports getrennt werden, ich schreib immer dafuer dann einzelne Ketten.
Fuer eine Range nimmst Du glaub ich :
Also --dport 20:30 gilt fuer die Ports 20 bis 30.

Nachtrag 2: Das "richtige" Script poste ich wenn ich wieder daheim bin. Dann haeng ich mal mein komplettes Script an. Hab bald Feierabend, ich denk mal in spaetestens 2 Stunden bin ich daheim. Werd auch ein paar Erklaerungen abliefern.
Gegen den Ping of Death brauchst Du Dich nicht explizit schuetzen wenn Du kein ICMP erlaubst. Und das geschieht in dem Mini-Script was ich hier zuvor gepostet hab nicht.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück