Problem mit Iptables script

Mordor

Registered User
Hallo alle zusammen
Ich wollte grad mal auf meinem Experimentierserver daheim ein shell script für iptables ausführen, doch irgendwie macht er mir dann alle Ports zu. Ich flieg dann jedes mal aus dem SSH raus, und muss über den angeschlossenen Monitor und Tastatur rann.

Das skript sieht wir folgt aus, und soll in wesentlich erweiterter Form später auf den Webserver:
Code:
#!/bin/sh -x



# Erst mal alles Tod 
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -F


#Logback Device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT


#SSH nach draussen
iptables -A OUTPUT -p TCP -d 0/0 --dport 22 \
         -s 0/0 --sport 1024:65535 -o eth0 -j ACCEPT
iptables -A INPUT -p TCP -s 0/0 --sport 22 -d 0/0 --dport \
      1024:3005 -m state --state RELATED,ESTABLISHED -i eth0 -j ACCEPT
iptables -A INPUT -p TCP -s 0/0 --sport 22 -d 0/0 --dport \
     3007:65535 -m state --state RELATED,ESTABLISHED -i eth0 -j ACCEPT


#SSH wieder auf machen
iptables -A INPUT -p TCP -s 0/0 --sport 1024:65535 \
         -d 0/0 --dport 22 -i eth0 -j ACCEPT
iptables -A OUTPUT -p TCP -d 0/0 --dport 1024:65535 \
         -s 0/0 --sport 22 -o eth0 -j ACCEPT
Mir ist klar, dass ich in den ersten beiden Zeilen erst mal alles dicht mache. Doch müsste iptables SSH dann später doch eigentlich wieder auf machen.
Bei mir ist es so, dass ich sobald ich das Skript gestartet habe, aus dem SSH geschmissen werde, und nur noch manuel am Rechner selber rein komme.

Vieleicht kann mir ja jemand helfen

Gruß
Mordor
 
... sobald Du das Skript ausführst sperrst Du Dich mit den beiden ersten Zeilen aus und - wenn ich das richtig sehe - dann wird die Skriptbearbeitung abgebrochen: Du bist ja schliesslich nicht mehr da. Insofern wäre das sogar für mich Unerfahrenen logisch
 
Erfahrung ist ja so ne sach. Sagen wirs mal so, der absolute Neuling bin ich nicht, nur von iptables Konfiguration, hab ich noch ned wirklich Ahnung. Deshalb wird ja auch erst mal rumprobiert.

So, jetzt hab ich aber noch ne Frage.
Wenn ich am Ende der Iptables konfiguration nochmal alles droppe, dann ist das der letzte Eintrag der ausgeführt wird, und er würde mich ja wieder aussperren. So ist es zumindest im Versuch passiert. Die Frag ist nun, wie mache ich es am besten, das ich alle Regeln in Iptables rein bekommen, und den Rest Blocke.

Danke erst mal

Gruß Mordor
 
Ich würde das Skript ruhig so lassen, sonst hättest Du bei einer Umstellung der beiden ersten Befehle nach unten ja wieder alles dicht; allerdings würde ich das Skript dann auch nicht per SSH ausführen, sondern die Tastatur und den Monitor mal ERST anschliessen und als lokaler Nutzer ausführen. Vielleicht bringt es das?
 
Warum überhaupt so umständlich. :)

Code:
#!/bin/bash

# öffnen
iptables -P INPUT ACCEPT

# alles löschen
iptables --flush

# alles nach draussen öffnen
iptables -P OUTPUT ACCEPT

# localhost connections erlauben
iptables -A INPUT -i lo -j ACCEPT

# Portfreigaben
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# eingang schließen
iptables -P INPUT DROP
 
Das mit dem Monitor würde ich ja gerne machen, nur wird das auf nem Webserver etwas schwierig:D

Ich habe das Script auf meinem Experimentiersystem ausprobiert, um es später auf dem Server laufen lassen zu können, wenn ich davon ausgehen kann, dass mir das Script nicht den Server zerschiest. Und das war auch gut so, wie ich das mitbekommen habe. :mad:

Klar, wenn ich es über einen Monitor mit Tastatur direkt anlegen könnte, würde es ja auch funktionieren, nur funktioniert es eben nicht, wenn man den SSH-Zugang dafür braucht. Denn es ist egal, ob ich am Anfang oder am Ende Droppe, er macht mir den SSH immer wieder dicht.

Die Frage ist ja, wie muss ich das Script anpassen, dass er mir später, wenn ich es auf den Webserver starte, alles dicht macht, und nur die dienste auf macht, die ich offen halten möchte. Aus SSH möchte ich da dann aber nicht raus geschmissen werden.

Gruß Mordor
 
Versuch doch mal folgendes:

Code:
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN SYN -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK ACK -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m multiport -i eth0 -j ACCEPT --dports 20,21,22,443
iptables -A INPUT -p icmp -m icmp -i eth0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -m state -i eth0 --state INVALID,NEW -j DROP

Benutze ich ähnlich bei mir aufm Router @Home und das gibt keine Probs.
SSH wird nicht gedroppt wenn du drauf bist, da nur Neue oder Ungültige
Anfragen gedroppt werden die nicht ins Muster vorher passen.
Die ersten beiden Zeilen sind für FTP da, um auch ohne Passivmodus zu laden,
kann man aber auch weglassen.
 
Ich sollte vielleicht noch sagen das meine oben gepostete Variante auch funktioniert. ;)
Ist die stark eingekürzte Version meines IPTables Scriptes für Router und ähnliches Script für den Server. :)
 
Danke erst mal. Werd das mal ausprobieren.

Gruß Mordor

ps Ach ja, hab ich das richtig gesehen, und auch geschnallt, wenn ich die Default mit -P forher auf Accept stelle, kann ich sie zum Schluss wieder mit -P Drop schliessen, ohne dass er mir alles wieder dicht macht?
Ich dachte, dass die zuletzt angewendete Regel gültig ist, und alle vorhergehenden überschreibt. Oder ist das bei den _palso den Default werten nicht so?
 
Last edited by a moderator:
Mit -P legst du die Policy fest. Wieso sollte das Rules überschreiben/löschen?

Und ich versteh nicht ganz, wieso man nicht erst alles dicht machen darf. TCP ist recht tolerant, was den Stall einer Verbindung angeht. Die paar Sekunden, die es braucht um nach der DROP-Policy die Verbindung wieder zuzulassen, schicken deine SSH-Verbindung noch lange nicht ins Void.

Kriminell wird es erst, wenn nach dem DROP was in deinem Script schief läuft und die Ports nicht wieder richtig geöffnet werden. Dann solltest du den Tipp im letzten Absatz beachtet haben. ;)

Unter linuxserverforum.de - Einzelnen Beitrag anzeigen - Erste Schritte: Thema Firewall hatte ich mal ein Script gepostet, das ich lange in der gezeigten Version benutzt habe. Das kannst du vieleicht als Anregung nehmen.

Es ist übrigens eine gute Idee, bei Arbeiten an der Firewall einen at-Job zu timen, der nach einer bestimmten Zeit alle Rules Flushed und die Policies auf ACCEPT setzt. Wenn alles geklappt hat, entfernt man den Job wieder. Wenn nicht rettet der einem den Arsch.
 
Und ich versteh nicht ganz, wieso man nicht erst alles dicht machen darf. TCP ist recht tolerant, was den Stall einer Verbindung angeht. Die paar Sekunden, die es braucht um nach der DROP-Policy die Verbindung wieder zuzulassen, schicken deine SSH-Verbindung noch lange nicht ins Void.

Kann ich leider nicht zustimmen. Meine oben genannte Variante funktioniert wunderbar. Schieb die letzte Zeile über die Portfreigabe für SSH und du kannst das ganze vergessen.

Und da die Abarbeitungszeit bei solchen Scripten ja nun nicht so wahnsinnig hoch ist, dürfte das kaum Angriffsfläche bieten, wenn für paar Millisekunden mal alles offen steht. :)
 
@Firewire2002: Ich wollte deiner Lösung übrigens schon als _DER_ Lösung zustimmen. Ich hatte dann nur eben gesehen, dass mein Script das doch anders herum gemacht hat. Und es lief damals auf einem Debian 3.0 ohne Probleme.

TCP kann eine Unterbrechung von mehreren Minuten überstehen. Da die Pakete gedroppt und nicht rejected werden, sollte die TCP-Session nicht abgebrochen werden.
 
jupp, sollte. Bei mir wars nicht so. Bin auf meinen Server daheim über SSH rein, und habs eben ausprobiert. Nachdem ich das Skript gestartet hatte, war dann plötzlich die Verbindung weg. Deshalb wollte ich das nicht wirklich auf dem Root-Server ausprobieren :-) Werd mich morgen mal rannsetzen, und die Tips hier mal durchprobieren.
Eigentlich müsste es ja wirklich funktionieren, wenn man die Policy erst auf Accept stellt, alles einstellungen vornimmt, und danach dann über die Policy wieder droppt.

Gruß Mordor
 
Eigentlich müsste es ja wirklich funktionieren, wenn man die Policy erst auf Accept stellt, alles einstellungen vornimmt, und danach dann über die Policy wieder droppt.
Wie Firewire2002 bereits schrieb, tut es das.
 
War ja auch viel mehr als selbstgespräch und rückblick gedacht.

Ich dank euch auf jedenfall erst mal
 
So, erst mal hat alles funktioniert.

Jetzt stellt sich mir nur noch eine Frage:
Ich möchte jetzt noch alle ausgehenden Pakte, die ich über iptables nicht explizit authorisiert habe sperren. Normalerweise würde ich das ja dann mit
Code:
iptables -P OUTPUT DROP
machen. Das Problem ist aber, dass wenn ich das am Ende des Skripts mache, sperrt er mich wieder aus, auch wenn ich am Anfang des Skripts auf ACCEPT gegangen bin.
Wie kann ich es jetzt noch hinbekommen, dass ich alles, was ich nicht für den Weg nach draussen authorisiert habe, blocken kann

Gruß Mordor
 
Genau damit. Und dann eben noch Rules anlegen, die entsprechenden Verkehr nach außen zulassen.

Für Blocken nach draußen würde ich aber eher REJECT statt DROP nehmen. Von der Sache her sollte das aber am Resultat nichts ändern.
 
Bin dann doch noch selber drauf gekommen.
Die Netzwerkeinstellungen waren nicht so gesetzt, wie ich sie bei iptables verwendet habe. Jetzt geht alles.

Ich dank Euch nochmal
 
Back
Top