Diese Seite ist optimiert für eine Auflösung von min. 1280x1024.

facebook   google   twitter   digg   email  





IPTables-Konfiguration



IPTables ist eine Firewall, die eine sehr genaue und exakte Konfiguration erlaubt. Zuerst einmal zum Grundsätzlichen. Es Lässt sich einstellen, wie die Firewall mit unbekannten Paketen verfahren soll, die sogenannte "POLICY". Im Beispiel steht diese für eingehende, ausgehende und geforwardete Pakete auf "ACCEPT" (forwarding wird oft bei z.B. Gateways benutzt). Es werden also alle Anfragen akzeptiert. Ausgeben lassen kann man sich eine Übersicht der Policy und aller eingetragenen Regeln mit der Option "-L":

server:/home/peter# iptables -L -v -n
Chain INPUT (policy ACCEPT 64923 packets, 5338K bytes)
 pkts bytes target     prot opt in     out     source               destination

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

Chain OUTPUT (policy ACCEPT 69956 packets, 6147K bytes)
 pkts bytes target     prot opt in     out     source               destination
server:/home/peter#

"-v" steht noch für "Verbose" (Ausführlich) und "-n" für "Numeric". Numeric bewirkt, dass Angaben zu Verbindungen/Hosts immmer mit der IP angegeben werden und nicht versucht wird, per Reverse-Lookup aufzulösen. Ich verwende hin und wieder noch die Option "-Z", was für Zero steht, und alle counter der Pakete auf "0" zurücksetzt.


Regeln

Um zu verstehen, wie die Regeln abgearbeitet werden, hierzu ein kleines Bild:

                  ROUTING                     ROUTING            
                     |         FORWARDING        |               
 eth0 +------->>>----+--->>>--------------->>>---+----->>>-------+ eth0
      INPUT          |                           |          OUTPUT
                     |                           |
                     |          Lokale           |
                     |   Verarbeitung der Daten  |
                     +--->>>--------------->>>---+

Um eine Regel zu erstellen, geht man wie folgt vor:
iptables -A Chain Bedingungen -j Ziel
"-A" hängt eine Regel an, bei Chain kann per default "INPUT", "FORWARD", oder "OUTPUT" angegeben werden. Bei Bedingung gibt man die Filterkriterien an und bei "-j", was mit einem Paket, das zutrifft passieren soll.
Ein Beispiel:
Wenn alle Pakete die auf Port 80 antreffen erlaubt werden, würde so aussehen:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
WICHTIG: Gross- und Kleinschreibung beachten!
"-A" hängt die zu erstellende Regel hinter allen anderen Regeln an. Es gibt noch Optionen wie "-I", "-R", "-D", "-X", "-E", "-N", "-P" und "-L", "-F", "-Z". Optionen, welche ich in den Beispielen verwende, werde ich noch genauer erläutern, andernfalls mit "man iptables" selbst nachschauen :o). Mit "-P" z.B. kann man die Policy ändern:
iptables -P INPUT -j DROP
"-j" gibt das Ziel an, welches "ACCEPT", "DROP", "REJECT" oder eine eigene Chain sein kann. Dies würde sämtliche ankommenden Pakete blocken, welche nicht durch eine Regel erlaubt sind. Ja, wirklich alle. Auch die eigene Verbindung!
iptables -N testchain
würde eine zusätzliche "Chain" erstellen. Somit könnte man eine Übersichtliche Struktur in seine Firewall-Regeln bringen. Um auch die Pakete nach "testchain" umzuleiten wäre eine Regel notwendig:
iptables -A INPUT -j testchain
iptables -A OUTPUT -j testchain
Eine Regel in "testchain" erstellt man dann mittels
iptables -A testchain -p tcp --dport 22 -j ACCEPT
erstellen. Mittels "-F" werden alle Regeln wieder gelöscht, "-X" löscht die Chain dann komplett:
iptables -F testchain
iptables -X testchain


Filter-Kriterien

Als Bedingung können mehrere Werte / Kriterien angegeben werden. Dazu gehört unter anderem das Protokoll, der Ziel- und Quell-Port, IP, MAC, Status (Flags) und die Netzwerkkarte. Nach einem Protokoll Filtert man mittels der Option "-p". Mögliche Werte wären:
-p tcp
	--dport (Destinationport, Zielport)
	--sport (Sourceport, Quellport)
	--tcp-flags
		SYN
		ACK
		FIN
		RST
		SYN
	--syn
	--tcp-option
	--mss
-p udp
	--dport (Destinationport, Zielport)
	--sport (Sourceport, Quellport)
-p icmp
	--icmp-type 
		echo-reply (pong)
		destination-unreachable
		network-unreachable
		host-unreachable
		protocol-unreachable
		port-unreachable
		fragmentation-needed
		source-route-failed
		network-unknown
		host-unknown
		network-prohibited
		host-prohibited
		TOS-network-unreachable
		TOS-host-unreachable
		communication-prohibited
		host-precedence-violation
		precedence-cutoff
		source-quench
		redirect
		network-redirect
		host-redirect
		TOS-network-redirect
		TOS-host-redirect
		echo-request (ping)
		router-advertisement
		router-solicitation
		time-exceeded (ttl-exceeded)
		ttl-zero-during-transit
		ttl-zero-during-reassembly
		parameter-problem
		ip-header-bad
		required-option-missing
		timestamp-request
		timestamp-reply
		address-mask-request
		address-mask-reply
Möglich wäre also:
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT


Beim Filtern nach der IP sind die Werte
-d (Destination-IP)
-s (Source-IP)
möglich. Beispiele:
iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -d 192.168.0.0/255.255.255.0 -j DENY


Mac-Adressen kann man mit folgender option filtern:
-m (Source-Macadresse)
Beispiel:
iptables -A INPUT -mac-source 00:00:00:00:00:00 -j DROP


Beim Filtern nach dem Interface wird folgende Option angewandt:
-i (Incoming)
-o (Outgoing)
Dies würde so aussehen:
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.0.2 -j DROP
Dass man beim Ausgang nicht nach einem Incoming-Interface gefiltert werden kann (und beim Eingang nach einem Ausgangsinterface) sollte sich von selbst verstehen.


NAT

Beispiel:
#port 80 auf 192.168.0.5 nach 192.168.0.6 weiterleiten
iptables -t nat -A PREROUTING -d 192.168.0.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.6:80
#antwort von port 80 als eigene faken und zurueckschicken
iptables -t nat -A POSTROUTING -d 192.168.0.6 -p tcp --dport 80 -j SNAT --to-source 192.168.0.5:80



  logo