# IPTables



## snoophallo (2. September 2005)

Ich habe jetzt Iptables installiert. Und mit dem Befehlen 
	
	
	



```
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
```
Alle Ports geschlossen.
Jetzt möchte ich nur ganz bestimmte wie ports wie 21,80,22,3306 öffnen, wie kann ich das unter debian woody anstellen?


----------



## Dennis Wronka (2. September 2005)

Beispiel:


```
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```

Das Beispiel entspricht uebrigens dem was ich nicht so gern mache, eine Regel in die eingebauten Chains setzen.
Ich erstelle lieber eine eigene Chain und schreibe dort meine Regeln rein.
Auf diese Chain verweise ich dann in INPUT, und wenn der Rechner als Router fungiert auch in FORWARD.
Der Output muss in der Regel eher weniger limitiert werden.

Bei weiteren Fragen zu IPTables, kann ich diese beiden Dokumente empfehlen:
Packet Filtering HowTo
NAT HowTo

Ansonsten kannst Du Dich auch gern an mich oder eben an das Forum wenden.

Viel Erfolg und viel Spass mit IPTables.


----------



## snoophallo (2. September 2005)

Und wie ist es möglich einen eigenen Chain zu schreiben. 
Kannst du mit vielleicht ein Beispiel geben?


----------



## snoophallo (3. September 2005)

Wenn ich mit dem Befehl in den drei Bereichem die Ports schließe.

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

Ist es mit folgendem Befehl nicht möglich einzelnen bestimmte Ports zu öffnen wie z.B. SSH:
Denn ich kann nun immer noch keine Verbindung über SSH aufbauen.

```
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
```

Wie kann man das besser angehen um, z.B. nur Zugang über SSH zu bekommen und das alle weiteren Ports gesperrt sind.


----------



## Dennis Wronka (3. September 2005)

Bei OUTPUT kannst Du, meines Erachtens nach die Policy ruhig auf ACCEPT lassen.
Eine eigene Chain kannst Du mittels -N erstellen.
Das haette Dir aber auch das erste der beiden verlinkten Dokumente verraten koennen.

Beispiel:

```
iptables -N firewall
iptables -A firewall -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j firewall
```

Weiterhin empfiehlt es sich mit Stateful-Packet-Filtering zu arbeiten.
Diese Zeilen sind da recht hilfreich (ich knuepfe am Beispiel an):

```
iptables -A firewall -m state --state RELATED,ESTABLISHED -j ACCEPT
```
Das kann unter Umstaenden noetig sein, wenn ich mich recht erinnere z.B. bei FTP.

Ausserdem ist Deine Regel fuer SSH in OUPUT falsch.
Der Verkehr kommt von Port 22 und geht an einen unbestimmten Port.
Es muesste also so lauten:

```
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
```


----------



## snoophallo (3. September 2005)

Wenn man jetzt die Einstellungen mit einem eigenen chain vorgenommen hat, ist also INPUT auf DROP mit einem Verweis auf den Chain firewall, FORWARDING ist ebenfalls DROP und OUTPUT ist auf ACCEPT gestellt. Im chain firewall gibt man nun alle eignene Port dir offen stehen sollen ein. Hab ich das so richtig verstanden?


----------



## Dennis Wronka (3. September 2005)

In OUTPUT brauchst Du nicht auf firewall verweisen, da in firewall (in der Regel) nur geoeffnet wird. Da OUTPUT die Policy ACCEPT hat haette es wenig Sinn von dort auf firewall zu verweisen.

Richtig, in firewall gibst Du an welche Ports offen sein sollen.

Es gibt 2 Wege einen Paketfilter zu stricken:
1. Alles zulassen und ungewollten Verkehr blocken
2. Alles sperren und nur gewollten Verkehr zulassen

Die zweite Variante ist auf jeden Fall die zu empfehlende, denn es ist sicherer einen Port nicht zu oeffnen als einen Port nicht zu schliessen.


----------



## snoophallo (4. September 2005)

Es klappt sowei alle super jedoch macht mir nur der ftp Zugang Schwierigkeiten.
Ich hab den Port 21 in firewall freigegeben und den Befehl 
	
	
	



```
iptables -A firewall -m state --state RELATED,ESTABLISHED -j ACCEPT
```
 ausgeführt. Allerding bekomm ich keinen Zugang, werder über einen Browser noch über ein FTP Programm.


----------



## Dennis Wronka (4. September 2005)

Wenn Port 21 offen ist solltest Du eigentlich zugreifen koennen, auch ohne den Befehl fuer das Connection-Tracking.
Port 21 ist der Control-Port ueber den die Befehle laufen. Soweit ich mich erinnere wird 20 in der Regel fuer die Daten genutzt. Es kann aber auch durchaus sein, dass fuer den Transfer ein anderer Port gewaehlt wird. Dafuer ist ja diese Zeile zustaendig.

Hast Du ein Script geschrieben um die Firewall einzurichten?
Falls ja, dann zeig das mal bitte her.
Ansonsten poste bitte die Befehle die Du eingegeben hast.


----------



## snoophallo (4. September 2005)

Nein ich hab kein Script geschrieben. Alles manuell gemacht.

```
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -N firewall
iptables -A firewall -p tcp --dport 22 -j ACCEPT
iptables -A firewall -p tcp --dport 21 -j ACCEPT
iptables -A firewall -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j firewall
```


----------



## Dennis Wronka (4. September 2005)

Die Policy von OUTPUT ist ACCEPT, richtig?
Und Du nutzt auch kein NAT, oder?
Der FTP-Server laeuft direkt auf dem Rechner auf dem Du auch IPTables konfigurierst, richtig?


----------



## snoophallo (4. September 2005)

Ja OUTPUT ist auf ACCEPT
Und der ftp-server läuft auf dem gleichen rechner wie iptables.
Wofür NAT Network Adress Translation eingestzt wird, weiß ich zur Zeit nicht so genau hab mich darüebr noch nicht informiert. Also würde das bedeuten, das ich NAT nicht auf meinem rechern benutze


----------



## Dennis Wronka (4. September 2005)

Sinac hat mal eine Uebersicht ueber verschiedene Netzwerkbegriffe verfasst, die kannst Du hier finden. Dort gibt es auch einen Abschnitt ueber NAT.
Die meisten Leute nutzen NAT um mehrere Rechner ueber eine Verbindung mit dem Internet zu verbinden, z.B. mit einem Router.
In seinem Tutorial ist das alles noch detailierter Erklaert. Aber da das mit dem aktuellen Thema nichts zu tun hat will ich da jetzt mal nicht naeher drauf eingehen.

Eigentlich sieht Deine Konfiguration ganz gut aus wuerde ich sagen.

Meine ist aehnlich.
Bei mir sind die Policies zwar ACCEPT, jedoch DROPpe ich am Ende von firewall alles was nicht zuvor ACCEPTed wurde.
Der Effekt ist im Grunde der selbe.

Dein FTP-Server laeuft auch auf Port 21, oder?


----------



## snoophallo (4. September 2005)

Ja der läuft auf dem Port 21.


----------



## Dennis Wronka (4. September 2005)

Und Du kannst garnicht verbinden oder dauert es nur sehr lange?
Moeglicherweise hilft es ICMP zuzulassen, aber das sollte damit eigentlich nichts zu tun haben.


----------



## snoophallo (4. September 2005)

IM Browser komm ich bis zum Einlogfenster. Dannach kommt eine Fehlermeldung, das man keine Zugriffsberechtigung auf den Ordner hat. Allerding klappt die Verbindung wenn ich INPUT auf ACCEPT stelle und ich kann auf den Ordner zugreifen und daten hochladen.


----------



## Dennis Wronka (4. September 2005)

Hmm.

Gibt es bei der Eingabe der Filterregeln eine Fehlermeldung?
Ich denke da jetzt im Speziellen an diese Regel:

```
iptables -A firewall -m state --state RELATED,ESTABLISHED -j ACCEPT
```


----------



## snoophallo (4. September 2005)

Nein da kommt keine Meldung, der Befehl wird ohne Probleme überneommen.
Das einzigste wo eine Meldung auftaucht ist, wenn ich mit
	
	
	



```
/etc/init.d/iptables restart
```
 iptables neustarte. Dann erscheint : 
	
	
	



```
Aborting iptables load: unknown ruleset, "active".
```


----------



## Dennis Wronka (4. September 2005)

Wann fuehrst Du dieses Script aus?


----------



## snoophallo (4. September 2005)

/etc/init.d/iptables restart

Hab ich einmal ausgeführt und zwar nach dem ich alle Befehle die oben aufgelistet sind abgearbeitet habe.


----------



## Dennis Wronka (4. September 2005)

Das ist unsinnig.
Damit machst Du Dir die Konfiguration hoechstens kaputt.

Die Regeln sind in dem Moment aktiv in dem Du sie eintraegst.


----------



## snoophallo (4. September 2005)

Das kann aber das FTP Problem nicht hervorgerufen haben. Da ich einen FTP test schon durchgeführt habe, bevor ich den Befehl ausgeführt habe.
Ich habe jetzt die Port 20, 21 und 1024 für FTP freigegeben. Allerdings bleibt der Zugang weiterhin gesperrt.


----------



## Dennis Wronka (4. September 2005)

Wofuer 1024?
Fuer die Kommunikation kann ein beliebiger Port > 1024 geoeffnet werden.

Hast Du TCPDump oder Ethereal?

Poste mal bitte den Output von iptables-save
Falls Du kein iptables-save hast, dann den Output von iptables -L -v


----------



## snoophallo (4. September 2005)

```
Chain INPUT (policy DROP 490 packets, 67783 bytes)
 pkts bytes target     prot opt in     out     source               destination                    
21335 2998K firewall   all  --  any    any     anywhere             anywhere                       

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                    

Chain OUTPUT (policy ACCEPT 20759 packets, 1756K bytes)
 pkts bytes target     prot opt in     out     source               destination                    

Chain firewall (1 references)
 pkts bytes target     prot opt in     out     source               destination                    
  650 30035 ACCEPT     tcp  --  any    any     anywhere             anywhere                               tcp dpt:ftp
  459 88061 ACCEPT     tcp  --  any    any     anywhere             anywhere                               tcp dpt:www
 2336  186K ACCEPT     tcp  --  any    any     anywhere             anywhere                               tcp dpt:2200
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere                               tcp dpt:ftp-data
  992  854K ACCEPT     all  --  any    any     anywhere             anywhere                               state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere                               tcp dpt:1024
```


----------



## Dennis Wronka (4. September 2005)

Wie da schoen zu sehen ist greift auch die RELATED,ESTABLISHED-Regel.
Also eigentlich sollte es funktionieren.
Versuchst Du lokal oder von einem anderen Rechner zuzugreifen?

Fuege mal diese Regel hinzu:

```
iptables -A firewall -i lo -j ACCEPT
```


----------



## snoophallo (6. September 2005)

Der Fehler könnte vielleicht daran liegen, dass der FTP Zugriff im aktiven Port Modus ist. Aber wie könnte man das Problem am besten beheben, da der Port  sich immer ändert.

Client                                       Server

Port  ------------------------------> Port 21

Port  <----------------------------- Port


----------



## Dennis Wronka (7. September 2005)

Vielleicht einfach mal mit passivem FTP testen.
Ich werd mir gleich mal ein wenig was durchlesen.
Ich denk mal das passende RFC wird ein paar Infos ausspucken.


----------



## snoophallo (17. September 2005)

Eine Frage hab ich noch und zwar wie kann ich einen eigens angelegten Chain wieder löschen?
Mit dem Befehl

```
iptables -X firewall
```
kommt nur die Fehlermeldung

```
Can't delete chain with references left
```

Welche Möglichkeit hat man noch um den chain zu löschen?


----------



## Dennis Wronka (17. September 2005)

Du gehst schon den richtigen Weg, jedoch vergisst Du einen Schritt.
Wie die Fehlermeldung schon sagt kannst Du keine Kette loeschen die noch irgendwo genutzt wird.
Du musst also alle Spruenge in diese Kette loeschen bevor Du dann die Kette loeschen kannst.

Beispiel:
Kette erstellen

```
iptables -N test
iptables -A test -i eth0 -j DROP
iptables -A INPUT -j test
```
Kette loeschen

```
iptables -D INPUT -j test
iptables -X test
```


----------

