
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
|