iptables: Konfiguration funktioniert nicht

niciuda

New Member
Hallo,
ich habe mir einen kleine Vserver gemietet und versuche diesen nun per iptables zu schützen. Dazu habe ich folgende Konfiguration erstellt:
Code:
#!/bin/sh
echo "Initialisiere Firewall …"
#Firewallregeln löschen
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -Z
#loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#stateful inspection
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
#ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#icmp
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
echo "Firewall ist konfiguriert und aktiv"
Die Datei wird beim Systemstart gestartet.

Das Problem ist jetzt nur, dass ich sobald ich das iptables Skript ausführe nicht mehr per SSH auf den Server zugreifen kann. Ich habe auch bereits probiert (selbst wenn das durch die stateful insp eigentlich auch so funktionieren sollte) noch "iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT" bei SSH einzufügen, aber dannach konnte ich trotzdem nicht per ssh zugreifen.

Hat jemand eine Ahnung woran das liegt ?
Vielen Dank im Vorraus

Edit: Achso ja, ich benutze Debian Lenny (habs aber auch bereits unter Etch probiert und dort hat es auch nicht funktioniert)
 
Last edited by a moderator:
Ich habe auch bereits probiert (selbst wenn das durch die stateful insp eigentlich auch so funktionieren sollte) noch "iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT" bei SSH einzufügen, aber dannach konnte ich trotzdem nicht per ssh zugreifen.
Die meisten vServer können nicht mit "stateful" Regeln umgehen, sicher das es deiner kann? Fängst du eventuell auftretende Fehlermeldungen irgendwie ab?
Bei der Outputregel sollte das --sport 22 sein.
Warum willst du eigentlich alles auf einmal per Skript machen? Ich würde zum Testen in Ruhe die In/Output Regeln in die Shell eingeben und schauen ob sie greifen und erst dann die Default Police ändern.
 
Last edited by a moderator:
Wie wärs wenn du dir dein Script nochmal anschaust? ;)

Du setzt die Default Policy eher auf DROP, als das die Regel für Port 22 hinzugefügt wurde.
Wenn du das Script von Hand ausführst, setzt du die DROP Regel, deine SSH Verbindung fliegt weg, die Shell wird gekillt und der Rest des Scriptes wird nie ausgeführt.

Solche Scripte sollten immer in folgendes Schema passen:
- Alles öffnen (setzen der Default Policies auf ACCEPT und löschen der Regeln)
- Regeln setzen
- Default Policy auf DROP oder REJECT setzen

Hältst du die Reihenfolge ein, wirst du dich nie selbst aussperren, ausser du vergisst die Regel für dein SSH Port. ;)
 
Danke euch beiden, jetzt funktionierts :) Der Fehler lag tatsächlich in --sport und darin, dass ich bei der statefull inspection die permanenter nicht zusammengeschrieben habe.

Ich hätte aber noch eine weitere Frage:
wieso kann ich wenn ich:
Code:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
eingebe trotzdem nicht per wget auf Dateien zugreifen. Auch wenn ich per apt-get bzw. aptitude updaten möchte funktioniert das nicht.
 
Hast du Port 53 (TCP und UDP) für DNS freigegeben?
Wenn du das Script von Hand ausführst, setzt du die DROP Regel, deine SSH Verbindung fliegt weg, die Shell wird gekillt und der Rest des Scriptes wird nie ausgeführt.
Vermutlich wird so ein einfaches Skript noch innerhalb des ssh oder gar tcp Timeouts ausgeführt.
 
Last edited by a moderator:
Hmm... hier mal was ich denke....

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

Das sind Default Policys, die greifen nur, wenn keine andere verwendet wird. Es sollte also egal sein, wo du das machts, bzw, in meinem Script habe ich das auch am Anfang.

Das Problem ist aber folgendes:

iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
Hier müsstest du noch NEW einbauen (dann wäre von innen nach aussen alles offen) oder

iptables -A OUTPUT -m state --state NEW --sport 22 -j ACCEPT

und beim Input:

iptables -I INPUT -m state --state NEW --dport 22 -j ACCEPT
 
Back
Top