Hi @ All,
hier findet Ihr ein HowTo für Iptables Grundlagen Linux welches Euch die wichtigsten Funktionen erklärt mit Beispielen.
Also dann fangen wir mal an.
Diese Anleitung ist für Server Betreiber nicht für Clients !!!
Ich empfehle jedem Server Betreiber mindestens 2. IPs zu haben.
Eine Öffentliche für E-Mail und Webserver oder sonstiges und eine NUR zur Administration wie SSH oder Plesk (wird auch Management IP genannt).
Diagramm:
Erstmal ein Diagramm welches Aufzeigt wie die Datenpakete in Iptables verarbeitet werden.
Das Bild habe ich von https://www.lammertbies.nl
Grundbefehle:
Anzeige:
iptables -L CHAINNAME = Zeigt die Chain in einer Liste an.
iptables -L -vn = Zeigt alles an im Detail und ohne Namensauflösung.
Egal bei welchem -L Befehl sollte immer ein -n am ende sein da sonst eine Namensauflösung versucht wird und das kann dann dauern.
iptables -L -vn –line-number = Zeigt alles mit der Zeilennummer
CHAINS: iptables -N CHAINNAME = Erstellt eine neue CUSTOM CHAIN iptables -D CHAINNAMEREGEL/ZEILENNUMMER = Löscht eine Regel oder Zeilennummer iptables -F CHAINNAME = Leer eine CHAIN iptables -X CHAINNAME = Löscht eine CUSTOMCHAIN geht nicht mit den Standard Chains INPUT, FORWARD und OUTPUT iptables -I CHAINNAME = Fügt eine neue Regel in die Chain am Anfang ein (INSERT) iptables -A CHAINNAME = Fügt eine neue Regel am ende der Chain ein (APPEND) iptables -P INPUT DROP = Ändert die Policy von ACCEPT (standard) auf DROP, was empfohlen wird. iptables -P FORWARD DROP = Ändert die Policy von ACCEPT (standard) auf DROP, was empfohlen wird. iptables -P OUTPUT DROP = Ändert die Policy von ACCEPT (standard) auf DROP, was empfohlen wird.
Unterschied zwischen der Policy ACCEPT und DROP:
Dabei geht es um die Standardaktion die Iptables durchführt wenn es für ein Paket keine Regel gibt.
Hat man z.B.: nur eine Regel für SSH und die Policy steht auf ACCEPT werden alle anderen Paket zugelassen.
Daher muss bei der ACCEPT Policy am ender jeder CHAIN in DROP befehl vorhanden sein
Steht die Policy auf DROP wird nur noch SSH zugelassen und alles andere wird gedropt (Verworfen).
Zum Einfügen von neuen Regeln via Console gibt es 2. Möglichkeiten:
iptables -I = INSERT iptables -A = APPEND
INSERT:
Fügt die neue Regel an die OBERSTEstelle ein, hat man schon Regeln in seine Iptables drin wird diese über alle anderen eingefügt, also aller erste Regel.
APPEND:
Fügt die neue Regel an das ENDE ein, hat man schon Regeln definiert wird diese an das ENDE eingefügt und zum Schluss ausgeführt. Normal macht man einen -j DROP am Ende.
Chains:
Iptables arbeitet mit CHAINS (wird so genannt) die Standard CHAINS sind INPUT, FORWARD und OUTPUT (immer in Großschrift) die immer vorhanden sein MÜSSEN.
Will man eine Regel erstellen muss man IMMER die CHAIN mit angeben.
- INPUT reget den kompletten rein kommenden traffic
- FORWARD regelt den kompletten traffic der weitergeleitet wird (NUR für NAT)
- OUTPUT regelt den kompletten traffic der raus geht.
iptables -I INPUT -d IP/SUBNET -p PROTOKOL -m MODUL --dport DESTINATIONPORT -j SPRINGDORTHIN
Bsp:
iptables -I INPUT -d 82.105.45.201/32 -p tcp -m tcp --dport 22 -j ACCEPT
Beschreibung:
Mit dieser Regel erlauben (-j ACCEPT) wir für die Ziel IP (-d = Destination, welches immer unser Server ist) den Zugriff auf Destination Port (–dport – welcher immer der Port auf unserem Server ist) Port 22 – dies ist der SSH Dienst.
Zudem definieren wir mit -p welches Protokoll (tcp, udp, icmp) und mit -m welches Modul hierzu gibt es einige die man zum großteil alle auf https://linux.die.net/man/8/iptables findet.
Etwas Paranoider:
iptables -I INPUT -s 79.5.48.7/32 -d 82.105.45.201/32 -p tcp -m tcp --dport 22 -j ACCEPT
Beschreibung:
Wir erlauben nur der Source IP oder Quell IP (-s – immer von aussen) IP 79.5.48.7/32 den Zugriff auf die Destination oder Ziel IP (-d- immer unser Server) IP 82.105.45.201 auf den Destination Port oder Ziel Port 22(immer ein Lokaler Port auf unserem Server).
Bei einzelnen IPs muss kein /32 hinter die IP, das macht Iptables von alleine, wenn man aber ein Netzwerk freigeben möchte MUSS man diese angeben.
Netzwerk Freigabe:
iptables -I INPUT -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT
Beschreibung:
Dem Netzwerk 79.5.0.0/16 (-s – Extern) ist es erlaubt auf die IP 82.105.45.201 (-d – Lokale IP des Servers) auf den Port 22 zuzugreifen.
Würde man dies jetzt aber so Online stellen würde man nicht mehr auf den Server kommen (vorausgesetzt die DROP Policy ist aktiv, bei der ACCEPT würde das weiter hin gehen)
Wie am Anfang geschrieben arbeitet Iptables immer alle Regeln von oben nach unten ab und würde man sich die Iptables jetzt mal mit iptables -L INPUT -vn ansehen würde das ungefähr so aussehen:
#iptables -L INPUT -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22
Die Firewall weiß also das die dem Netzwerk den Port 22 Freigeben soll aber da in meinem Beispiel die DROP Policy aktiv ist würde alle anderen Pakete verworfen und es fehlt auch noch die erlaubnis das Pakete mit einem bestimmten Status rein dürfen.
Leider geht nichts mehr:
Da aktuell nur der Port 22 offen ist aber kein Status deklariert ist, würde nichts mehr gehen.
Wäre aber die ACCEPT Policy aktiv würde der Zugriff funktionieren und zwar auf alle Ports da am ende der Befehl fehlt alles zu verwerfen (DROP) was nicht für den Port 22 gedacht ist.
Hier kommt jetzt zum tragen welche Policy man nutzt!
Im letzten block sieht man in der ersten Zeile:
Chain INPUT (policy DROP …..)
Dieser Punkt ist GANZ wichtig, wie oben schon beschrieben, würde die Firewall so live gehen würde man nicht mehr auf seinen Server kommen.
Wir haben zwar den Port 22 freigegeben aber bei dieser Policy ist es existentiell das wir auch eine neue Verbindung und/oder ein bestehende Verbindung erlauben müssen sonst kann keine Kommunikation zu stande kommen(Status des Datenpakets).
Daher benötigen wir noch mindestens 2 Regel oder man schreibt den “Status” in jede Zeile für jeden Port aber einmal ist einfach als 30 mal.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Beschreibung:
Quelle: https://linux.die.net/man/8/iptables
state
- This module, when combined with connection tracking, allows access to the connection tracking state for this packet.
- –state state
- Where state is a comma separated list of the connection states to match. Possible states are INVALID meaning that the packet could not be identified for some reason which includes running out of memory and ICMP errors which don’t correspond to any known connection, ESTABLISHED meaning that the packet is associated with a connection which has seen packets in both directions, NEW meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions, and RELATED meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.
Fügt man der bestehenden Iptables diese Zeile hinzu wird diese NACH der Freigabe von Port 22 eingetragen und wir erlauben die Kommunikation mit Datenpaketen die den Status RELATED und ESTABLISHED haben.
NEW ist NICHT notwendig da dies mit RELATED schon abgedeckt ist.
Wie schon geschrieben kann man auch für jede Freigabe den Status mit angeben.
iptables -I INPUT -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp -m state --state RELATED, ESTABLISHED --dport 22 -j ACCEPT
Ich habe jetzt zu der Freigabe auch das Modul “state” geladen und den Status RELATED und ESTABLISHED eingetragen, man kann auch noch NEW hinzufügen wenn man möchte ist aber nicht nötig – siehe Beschreibung oben.
Man sollte sich für ein System entscheiden entweder man trägt eine separate Zeile für jede CHAIN ein (INPUT, OUTPUT, FORWARD und CUSTOMCHAINS) oder in jede Zeile, vermischen der beiden Technik ist nicht zu empfehlen da es die fehler suchen am ende fast unmöglich macht und es sehr unübersichtlich wird, besonders wenn man mehr als 10 Regeln zu verwalten hat.
Abschluss der CHAIN:
iptables -A INPUT -j DROP
Das Paket wird weggeworfen.
Der Befehl wird mit -A hinzugefügt da dieser wie oben beschrieben dafür sorgt das dieser Eintrag am ende der Regeln hinzugefügt wird und NICHT am Anfang.
Bei der ACCEPT Policy ist es in der INPUT CHAIN ein MUSS sowie bei CustomChains, es sei den man arbeitet bei CustomeChain mit dem RETURN befehl, aber dann muss dieser immer am Ende stehen.
Ist man ein befürworter der DROP Policy, so wie ich, muss man das NICHT machen da es Iptables selbst erledigt, aber man will es a) sauber und b) beruhigt es.
Schauen wir uns jetzt nochmal die Iptables an sieht die Welt schon viel Besser aus und macht auch mehr Sinn.
#iptables -L INPUT -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
1. Zeile:
- Prüfung von das Paket aus dem Netzwerk 79.5.0.0/16 kommt JA/NEIN, Zugriff auf IP 82.105.45.201 Port 22 JA/NEIN
- Wird einer(1) der Fragen mit Nein beantwortet geht es direkt zu DROP weil die Regel nicht erfüllt wurde, daher kommt es auch nicht zu einer Verbindung.
- Werden beide Antworten mit JA zurückgegeben wird die Verbindung Akzeptiert und die 2. Zeile tritt in kraft.
2. Zeile:
- Wird nur angefasst wenn vorläufige Regeln mit JA beantwortet wurden.
3. Zeile:
- Alle Pakete die in den Regel zuvor NICHT Akzeptiert wurden werden weggeschmissen (verworfen, drop) und damit auch keine Rückantwort gegeben.
Mit der jetzigen Konfiguration kann man nur eine Verbindung auf den Lokalen Port 22 (SSH) des Servers herstellen und sonst nichts und dies auch nur aus einem bestimmten Netzwerk auf eine IP.
Jetzt kann man Anfange und weiter Dienste via iptables -I INPUT -d 82.105.45.201 -p tcp -m tcp –dport xxxx -j ACCEPT freigeben.
Bei Administrativen Diensten wie SSH sollte man den Zugriff immer mit einer SOURCE (-s – Quell IP) und DESTINATION (-d- Ziel IP) begrenzen bei allen Öffentlichen Diensten benötigt man nur die DESTINATION IP sofern man mit 2. IPs arbeitet.
Hat man nur eine IP was man NICHT machen sollte ist eine Destination IP unnötig da es nur eine IP gibt und für SSH kann man sich dann nur mit einen Source Netzwerk absichern oder auch noch einen SSH Key erstellen damit man nur mit diesem eine SSH Verbindung aufbauen kann.
Auf jedenfall sollte man immer soviel absicherungen wie möglich implementieren um das System sicher zu machen.
Daher empfehle ich IMMER sich bei seinem Provider eine 2. IP zu bestellen, kostet meisten nur einmalig 1€.
Ordnung schaffen:
Wenn man mit dem ganzen Spass fertig ist hat man eventuell eine recht unübersichtliche Liste in seiner INPUT Chain was sich dadurch lösen lässt in dem man CUSTOM Chains erstellt.
Custom Chains sind selbst erstellt Chains die nicht INPUT, OUTPUT oder FORWARD heissen dürfen!
Eine kleine Liste für die gängigsten Dienste, mal schnell erstellt, aber es sind nicht alle drin.
#iptables -L INPUT -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:53 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:953 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Eine Liste alle Standard Port kann man auf Wiki finden
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Wenn man das jetzt noch weiter ausbaut hat man mal schnell die Übersicht verloren.
Erstellen einer CUSTOM Chain:
iptables -N CHAINNAME erstellt eine neu Custom Chain mit einem “frei” wählbaren Namen kann groß und klein geschrieben werden, ich bevorzuge reine Großschrift.
Beispiel:
iptables -N TCP
Mit diesem Kommando wurde jetzt die Chain TCP erstellt und mehr ist noch nichts passiert.
Um zu sehen was man gemacht hat:
iptables -L -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:53 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:953 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) Chain OUTPUT (policy DROP 0 packets, 0 bytes) Chain TCP (0 references)
Wie man sieht haben wir am Ende eine neue Chain mit dem Namen TCP aber es fehlen zum einem die References (0) und Regeln haben wir auch noch keine.
iptables -I INPUT -p tcp -m tcp -j TCP
Nun haben wir eine References in der INPUT Chain , an oberster stelle, die besagt das ALLE Datenpakete die das Protokoll TCP haben in die Chain TCP geleitet werden sollen.
Aber wir haben wieder ein Problem!
Sämtlicher TCP traffic wird von der INPUT Chain in die TCP geleitet aber in der TCP Chain haben wir keine Regel definiert und da wir mit der DROP Policy arbeiten werden alle TCP Pakete nun verworfen (drop) und wir haben keinen Zugriff mehr auf das System, da die nach folgenden Regeln innerhalb der INPUT Chain nicht angefasst werden.
Also Lösen wir das Problem:
iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 25 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 110 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 143 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 443 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 467 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 995 -j ACCEPT iptables -I TCP -d 85.105.45.202 -p tcp -m tcp --dport 993 -j ACCEPT iptables -I TCP -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT iptables -A TCP -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A TCP -m tcp -p tcp -j DROP
Wenn man Zeile für Zeile eingibt wird nach und nach die einzelnen Ports freigegeben und ganz zum Schluss am Ende dieser Chain wird der DROP befehl gegeben damit alles andere was TCP ist gedropt wird.
Das freigeben und die Reihenfolge der einzelnen Port ist egal Wichtig ist aber das der STATE und dann erst der DROP am ende der Liste stehen daher muss hier mit -A (APPEND) gearbeitet werden.
Die Ausgabe mit iptables -L -vn sieht dann so aus:
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:53 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:953 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) Chain OUTPUT (policy DROP 0 packets, 0 bytes) Chain TCP (0 references) 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0
Die ankommenden TCP Pakete werden von der INPUT Chain in die TCP Chain geleitet und dort verarbeitet, alle anderen Regeln in der INPUT Chain werden weiterhin ignoriert und können daher gelöscht werden.
Löschen von Regeln:
Hierfür kann man diese via Console machen oder via Editor (schneller und einfacher).
iptables -D CHAINNAME LINENUMBER/REGEL
Löscht eine Zeile/Regel aus der jeweiligen Chain ohne Chain passiert nichts.
Bei dem Befehl iptables -D CHAINNAME REGEL muss man darauf achten das man die komplette Syntax der Regel schreibt und dies ist auch noch keysenitive, also muss groß/kleinschreibung beachtet werden.
Console:
Wir haben über die Console 2 Möglichkeiten
Einmal in dem man die Zeilennummer angibt oder die komplette Regel.
Mit der Zeilennummer muss man sich diese erst einmal Anzeigen lassen mit iptables -L INPUT -vn –line-number
Ausgabe:
#iptables -L INPUT -vn --line-number Chain INPUT (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 5 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:53 6 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:953 7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 8 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 9 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 10 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 11 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 12 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 13 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 14 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Löschen:
iptables -D INPUT 2
Löscht die 2. Zeile
Zu Beachten ist das wenn man Zeile 2 löscht und man will danach die Zeile 3 löschen diese nach der vorherigen Ausgabe nicht mehr die gleiche Zeile ist da alle Zeilen um eine Zeile nach oben gerutscht sind!
Neue Abfrage:
iptables -L INPUT -vn --line-number
Neue Ausgabe:
Chain INPUT (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 4 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:53 5 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:953 6 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 8 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 9 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 10 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 11 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 12 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 13 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Wie man sehen kann hat sich alles nach der 2. Zeile im Gegensatz zu vorher um eine Zahl verringert. VORSICHT HIER
Löschen via Regel:
iptables -D INPUT -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT
Löscht die Regel in der Chain INPUT mit exakt diesem Eintrag macht man einen Typo bekommt man eine Fehlermeldung das es diesen Eintrag in dieser Chain nicht gibt.
Löschen via Editor:
Um eine Datei zu bekommen die man editieren kann muss man die aktuellen Regeln exportieren.
iptables-save > /pfad/zu/deiner/dateiname
Datei mit dem Editor öffnen:
nano /home/user/iptables # Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Completed on Fri Oct 2 16:00:01 2015 # Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Completed on Fri Oct 2 16:00:01 2015 # Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :TCP - [0:0] -A INPUT -p tcp -m tcp -j TCP -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 467 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 143 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 110 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 995 -j ACCEPT -A INPUT -d 85.105.45.202 -p tcp -m tcp --dport 993 -j ACCEPT -A INPUT -d 85.105.45.202/32 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -d 85.105.45.202/32 -p udp -m udp --dport 953 -j ACCEPT -A INPUT -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -j DROP -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 443 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 467 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 143 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 110 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 995 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 993 -j ACCEPT -A TCP -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT -A TCP -m state --state RELATED,ESTABLISHED -j ACCEPT -A TCP -m tcp -p tcp -j DROP COMMIT # Completed on Fri Oct 2 16:00:01 2015
Jetzt kann man mit F9 (nano) die Zeile Löschen die man nicht mehr haben möchte.
# Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Completed on Fri Oct 2 16:00:01 2015 # Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT # Completed on Fri Oct 2 16:00:01 2015 # Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :TCP - [0:0] -A INPUT -p tcp -m tcp -j TCP -A INPUT -d 85.105.45.202/32 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -d 85.105.45.202/32 -p udp -m udp --dport 953 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -j DROP -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 443 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 467 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 143 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 110 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 995 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 993 -j ACCEPT -A TCP -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT -A TCP -m state --state RELATED,ESTABLISHED -j ACCEPT -A TCP -m tcp -p tcp -j DROP COMMIT # Completed on Fri Oct 2 16:00:01 2015
Die Datei abspeichern und danach Importieren
Import:
iptables-restore < /home/user/iptables
Ausgabe Prüfen:
iptables -L INPUT -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:53 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:953 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 iptables -L TCP -vn Chain TCP (1 references) 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0
Jetzt haben wir bei TCP auch eine References mit 1 hat man mehr erhöht sich diese Zahl und solange dieser Wert auf 1 oder höher steht kann man die Chain TCP NICHT löschen.
Den selben Spass den wir mit TCP gemacht habe können wir jetzt auch noch für UDP Pakete machen.
Chain erstellen:
iptables -N UDP
Jump von INPUT nach UDP erstellen:
iptables -I INPUT -p udp -m udp -j UDP
Alle UDP Pakete springen in die Chain UDP
UDP Regeln:
iptables -I UDP -d 85.105.45.202/32 -p udp -m udp --dport 53 -j ACCEPT iptables -I UDP -d 85.105.45.202/32 -p udp -m udp --dport 953 -j ACCEPT iptables -A UDP -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A UDP -m udp -p udp -j DROP
Löschen der UDP Regel aus der INPUT CHAIN
iptables -D INPUT -d 85.105.45.202/32 -p udp -m udp --dport 53 -j ACCEPT iptables -D INPUT -d 85.105.45.202/32 -p udp -m udp --dport 953 -j ACCEPT
Überprüfung der INPUT CHAIN
iptables -L INPUT -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 UDP UDP -- * * 0.0.0.0/0 0.0.0.0/0 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Überprüfung der UDP CHAIN
iptables -L UDP -n Chain UDP (1 references) ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:53 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:953 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED DROP udp -- * * 0.0.0.0/0 0.0.0.0/0
Nach dem jetzt die Grundkonfiguration beendet ist kann man mit zusätzlichen Einträgen das ganze noch verfeinern.
Extras:
Prüfung TCP Flags:
iptables -I INPUT 5 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REJECT --reject-with tcp-reset
Prüft die TCP Flags sollte eine Übereinstimmung vorhanden sein wird die Verbindung zurückgewiesen (Reject)
Dies gilt für die DROP Policy! Arbeitet man mit der ACCEPT Policy muss vor -m tcp –tcp-flags ein !
Das heißt die Zeile muss so aus sehen: iptables -I INPUT 5 -p tcp ! -m tcp –tcp-flags FIN,SYN,RST,ACK SYN -j REJECT –reject-with tcp-reset
Sollte man dies NICHT machen werden alle TCP Pakete mit tcp-reset zurück gewiesen!
State Prüfung:
iptables -I INPUT 6 -m state --state INVALID -j DROP
Sollte der Status der Verbindung nicht OK sein wird das Datenpaket direkt verworfen (drop).
Interface lo(localhost – 127.0.0.1):
Ich habe festgestellt das manche Dienste Problem machen können daher sollte man über die INPUT Chain alles was das Interface Betrifft freigeben.
iptables -I INPUT -i lo -j ACCEPT
Sämtlicher Traffic der beim Interface lo ankommt wird erlaubt, diese Regel sollte über den Custom Chains vorhanden sein oder man muss das Interface in jeder Customen Chain eintragen. Nach den Customen Chains macht es keinen Sinn und wird auch nicht abgefragt.
Tracking:
Tracken der Datenpakete die über eine Einzelne IP laufen
iptables -I INPUT -d 85.105.45.202/32
Hat keinerlei Funktion man kann aber mit einem Script auslesen wie viele Pakete an die IP gesendet wurden. Interessant zur Überwachung via Munin, Cacti oder Nagios.
Pings begrenzen und blocken:
Der Ordnung halber erstellen wir dafür Extra eine Chain den wir mögen es ja Ordentlich.
iptables -N ICMP
Erstellt die ICMP Chain
iptables -I INPUT -p icmp -j ICMP
ICMP (ping) Pakete werden von der INPUT Chain in die ICMP Chain geleitet.
In der Chain machen wir dann unsere Einträge wer und wie oft gepingt werden darf.
iptables -I ICMP -s 79.5.0.0/16 -d 85.105.45.202/32 -p icmp -m icmp --icmp-type 8/0 -j ACCEPT iptables -I ICMP -d 82.105.45.201/32 -p icmp -j DROP iptables -A ICMP -p icmp -m icmp --icmp-type 8/0 -m limit --limit 1/min -j LOG --log-prefix "Ping BLOCK:" iptables -A ICMP -p icmp -m icmp --icmp-type 8/0 -m limit --limit 1/min -j DROP
Erklärung:
Zeile 1: erlaubt das Pingen von dem Netzwerk 79.5.0.0/16 auf die IP 85.105.45.202 und zwar nur der Type 8/0
Zeile 2: Ping auf unsere 2. IP 82.105.45.201/32 ist für jeden Verboten und die Pakete werden verworfen (drop).
Zeile 3: Alle Pings auf alle IPs werden auf 1 Ping pro Minute begrenzt alles was mehr ist wird in die Syslog geschrieben (gilt nicht für die IP in Zeile 1).
Zeile 4: Verwerfen der Pakete die in Zeile 3. registriert wurden (drop).
Jeder aus dem Netzwerk 79.5.0.0/16 kann die IP 85.105.45.202 pingen solange und so oft dieser möchte.
Befindet sich die IP ausserhalb des Netzwerks von 79.5.0.0/16 und Versucht irgend eine der beiden IPs zu pingen, kann er dies nur einmal jede Minute tun, die restliche Zeit werden alle pings Verworfen und im Syslog Protokolliert mit dem vermerk “Ping Block: Ip Adresse”
Ich mache das aus einem einfachen Grund, wenn dann habe nur ich keinen Grund meinen Server zu pingen und sonst niemand und wenn dann darf mich jemand Fremdes gerne 1mal jede Minute einmal pingen.
Man kann das aber auch durch andere Zahlen etwas entschärfen, jeder kann hier Zahlen verwenden wie er will.
Heute erlaube ich nur noch Pings aus den Netzwerken in denen ich mich selbst bewege, alle anderen Pings werden radikal verworfen und Protokolliert.
Logging:
Beim Ping hatten wir das ja jetzt schon das große Mysterium des Loggings bei Iptables.
Nach dem ganzen Spaß den man vorher schon hatte ist dies aber das kleinste Übel.
Chain erstellen:
iptables -N LOGDROP
Erstellen der Einträge in der Chain LOGDROP
iptables -I LOGDROP -p tcp -j LOG --log-prefix "TCP LOGDROP" iptables -I LOGDROP -p udp -j LOG --log-prefix "UDP LOGDROP" iptables -I LOGDROP -p icmp -j LOG --log-prefix "ICMP LOGDROP" iptables -A LOGDROP -j DROP
Ab hier arbeitet man am besten mit einem Editor da man Sicherstellen muss das die Einträge an der richtigen Stelle landen und alle Einträge die wir jetzt schon erstellt haben müssen abgeändert werden und ich glaube keiner will wieder bei 0 Anfangen.
Export der jetzigen Iptables Regeln:
iptables-save > /home/user/iptables
Öffnen mit dem Editor deiner Wahl:
nano /home/user/iptables
Umbenennen von DROP nach LOGDROP
Es werden in allen Chains am ende das DROP nach LOGDROP umbenannt.
AUSSER Folgende Einträge:
-A LOGDROP -j DROP -A INPUT -j DROP
Wobei der Eintrag -A INPUT -j DROP nur eine doppelte Sicherung ist um auch ganz sicher zu gehen das man alles unerwünschte oder bei Fehlern in seine Logik nicht frei gegeben wird, besonder wichtig wenn man mit der ACCEPT Policy arbeitet.
Nach dem Bearbeiten sollte das bei meinem Beispiel so aussehen:
# Generated by iptables-save v1.4.14 on Fri Oct 2 16:00:01 2015 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :TCP - [0:0] :UDP - [0:0] :ICMP - [0:0] :LOGDROP - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp -j TCP -A INPUT -p udp -m udp -j UDP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -j DROP -A ICMP -s 79.5.0.0/16 -d 85.105.45.202/32 -p icmp -m icmp --icmp-type 8/0 -j ACCEPT -A ICMP -d 82.105.45.201/32 -p icmp -j LOGDROP -A ICMP -p icmp -m icmp --icmp-type 8/0 -m limit --limit 1/min -j LOG --log-prefix "Ping BLOCK:" -A ICMP -p icmp -m icmp --icmp-type 8/0 -m limit --limit 1/min -j LOGDROP -A LOGDROP -p tcp -j LOG --log-prefix "TCP LOGDROP" -A LOGDROP -p udp -j LOG --log-prefix "UDP LOGDROP" -A LOGDROP -p icmp -j LOG --log-prefix "ICMP LOGDROP" -A LOGDROP -j DROP -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 80 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 443 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 467 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 143 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 110 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 995 -j ACCEPT -A TCP -d 85.105.45.202 -p tcp -m tcp --dport 993 -j ACCEPT -A TCP -s 79.5.0.0/16 -d 82.105.45.201 -p tcp -m tcp --dport 22 -j ACCEPT -A TCP -m state --state RELATED,ESTABLISHED -j ACCEPT -A TCP -m tcp -p tcp -j LOGDROP -A UDP -d 85.105.45.202/32 -p udp -m udp --dport 53 -j ACCEPT -A UDP -d 85.105.45.202/32 -p udp -m udp --dport 953 -j ACCEPT -A UDP -m state --state RELATED,ESTABLISHED -j ACCEPT -A UDP -m udp -p udp -j LOGDROP COMMIT # Completed on Fri Oct 2 16:00:01 2015
Danach die Datei Speichern und wieder Importieren.
iptables-restore < /home/user/iptables
Dann die Prüfung wie das ganze in Iptables aussieht:
iptables -L -vn Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ICMP icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 UDP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp 0 0 TCP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcpflags:! 0x17/0x02 reject-with tcp-reset 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID Chain FORWARD (policy DROP 0 packets, 0 bytes) Chain OUTPUT (policy DROP 0 packets, 0 bytes) Chain TCP (0 references) 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:467 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:143 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:993 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:25 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:110 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:995 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 85.105.45.202/32 tcp dpt:80 0 0 ACCEPT tcp -- * * 79.5.0.0/16 82.105.45.201/32 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 LOGDROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 Chain UDP (1 references) 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:53 0 0 ACCEPT udp -- * * 0.0.0.0/0 85.105.45.202/32 udp dpt:953 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 LOGDROP udp -- * * 0.0.0.0/0 0.0.0.0/0 Chain ICMP (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT icmp -- * * 79.192.0.0/10 85.25.197.100 icmptype 8 code 0 /* T-ONLINE PING */ 0 0 ACCEPT icmp -- * * 62.128.160.0/19 85.25.197.100 icmptype 8 code 0 /* HNS PING */ 0 0 ACCEPT icmp -- * * 77.20.0.0/17 85.25.197.100 icmptype 8 code 0 /* KABEL PING */ 0 0 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 0 limit: avg 1/min burst 5 LOG flags 0 level 4 prefix "Ping BLOCK:" 0 0 LOGDROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 0 limit: avg 1/min burst 5 Chain LOGDROP (705 references) pkts bytes target prot opt in out source destination 0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "TCP LOGDROP" 0 0 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "UDP LOGDROP" 0 0 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "ICMP LOGDROP" 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Erklärung:
Alle Datenpakete die bei den Regeln ein NEIN bekommen hat spring von seiner Chain aus in die Chain LOGDROP dort wird erfasst ob es ein ICMP, UDP oder TCP Paket ist,
wird in der Syslog eingetragen und dann endgültig verworfen (drop).
Loggen in eine separate Datei:
Änderungen am System wenn man seine Syslog nicht voll mit iptables Einträgen haben will:
nano /etc/rsyslog.conf
Die Zeilen wie folgt abändern:
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none;\ kern.!warning -/var/log/syslog
Und am Ende Hinzufügen:
:msg,contains,"ICMP LOGDROP" -/var/log/logdrop/icmp.log :msg,contains,"TCP LOGDROP" -/var/log/logdrop/tcp.log :msg,contains,"UDP LOGDROP" -/var/log/logdrop/udp.log
Pfade und Dateinamen können natürlich frei gewählt werden.
Wer alles in eine Datei haben will kann auch oben bei den Kernel Warning Eintragen:
kern.warning -/var/log/drop.log
Pfad und Dateiname sind auch hier frei wählbar oder man macht es so wie ich und hat beides drin, dann hat man die Freie Wahl in welche Log man schauen will, besonders wenn man UDP und TCP zusammen via Tail oder Script auslesen möchte.
So das waren die Grundlagen von Iptables ich hoffe es ging jedem ein Licht auf und der Beitrag kann weiterhelfen.
Weitere Links:
Zum Thema GEOIP geht es hier, wenn Ihr hiermit klar gekommen seit sollte das kein Problem mehr sein.
Wer einige Templates sehen will bzw. Konzepte schaut am besten hier mal rein.
Iptables Autostart:
Zum Ende noch das Automatisch einbinden seiner Iptables Regeln:
iptables-save > /home/user/iptables
Export der aktuellen Regeln
Über die rc.local:
nano /etc/rc.local
Eintragen:
iptables-restore < /home/user/iptables
Speichern und schließen.
oder via Init.d:
nano /etc/init.d/firewall
Script:
#!/bin/bash ### BEGIN INIT INFO # Provides: Iptables # Required-Start: # Required-Stop: # Should-Start: # Should-Stop: # Default-Start: # Default-Stop: # Short-Description: import iptables # Description: iptables ### END INIT INFO echo -n "### Loading iptables firewall ###" iptables-restore < /home/user/iptables echo "### Firewall Loaded ###" exit 0
Wichtig ist das die Datei von Euch auch so heisst ansonsten Pfad und Dateiname anpassen.
Ab sofort wird die Datei bei jedem Boot geladen und Importiert.
Wenn man Änderungen durchführen will kann man das Bequem über die Datei erledigen.
That is the end.
Gruß
DocSchneidi ak Cheech