iptables - Verständnissproblem

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

iptables - Verständnissproblem

Beitrag von schwabi » 20.08.2005 23:21:48

Hey ho,
hab mich nun endlich mal hingesetzt und mit iptables angefangen. Leider gab es schon am Anfang, mit folgender Aufgabenstellung, Probleme. Der Rechner sollte erst mal alles was rein kommt sperren und dann wollt ich nach und nach alles frei machen was ich brauche.
Ein allgemeines DROP in der Kette INPUT tut auch schon mal das was es soll

Code: Alles auswählen

iptables -I INPUT -j DROP
Nun möcht ich ja aber trotz der Firewall ins Netz, sprich Ports für DNS und HTTP müssen offen sein. Dies hab ich dann wie folgt getan.

Code: Alles auswählen

iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 53 -j ACCEPT
Das hat allerdings noch nicht die Wirkung gezeigt die es sollte. Also hab ich mir den Netzwerktraffic mal mit ethereal etwas genauer angeschaut. Dabei ist mir aufgefallen das zwar DNS auf Port 53 und HTTP auf Port 80 rausgeht aber die Antwort auf Ports über 32000 reinkommen. Hinzu kommt das sich diese Ports ständig ändern.
Problem ist also: Wie konfiguriere ich die Firewall so das ich ins Netz komme?

Gruß Schwabi

mludwig
Beiträge: 807
Registriert: 30.01.2005 19:35:04

Beitrag von mludwig » 20.08.2005 23:35:36

Code: Alles auswählen

/sbin/iptables -A INPUT -i "eth0" -m state --state ESTABLISHED,RELATED -j ACCEPT
akzeptiert alle einkommenden Pakete, welche zu einer bereits bestehenden Verbindung gehören. Da die Verbindung bei Surfen von innen aufgebaut wird (dem Browser), geht das so i.O.

grüße
mludwig

ps: das -i "eth0" solltest du auf das passende Interface ändern, oder weglassen, falls es nur eins gibt.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 20.08.2005 23:38:10

Du könntest den Status der Verbindung als Zusatzbedingung aufnehmen, etwa so:

Code: Alles auswählen

iptables -I OUTPUT --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 21.08.2005 00:06:14

Danke erst mal für die schnelle Hilfe.
Nur noch mal zum Verständniss, mit der 'state' Option teile ich quasi iptables mit das es nur auf Verbindungen reagiert die ich eröffne.???

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.08.2005 00:34:16

mit der state Option teilst du iptables mit, daß das Ziel/Target ( -j <target> ) nur dann gewählt werden soll, wenn sich die Verbindung in dem von dir definierten Status befindet.

anderes und schöneres Beispiel:

Code: Alles auswählen

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT --dport 80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT --dport 22 -m state --state NEW -j ACCEPT
iptables -A OUTPUT --dport 21 -m state --state NEW -j ACCEPT
Die ersten beiden Zeilen, lassen alle Verbindungen durch die bereits aufgebaut wurden. Die nächsten Zeilen erlauben den Aufbau von Verbindungen nach außen auf Port 80,22 und 21.

Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 22.08.2005 16:43:02

Alles klar, coole säch. Glaube solangsam aber sicher steig ich dahinter.
Es stellt sich zur Zeit nur noch eine Frage: Wie lass ich FTP Transaktionen zu?

Habe folgendes ausprobiert:

Code: Alles auswählen

iptables -A INPUT -i eth0 -p tcp --sport ftp-data:ftp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --dport ftp-data:ftp -m state --state NEW,ESTABLISHED -j ACCEPT
Er beginnt auch mit der Verbindung, scheint dann aber keine Antwort vom Server zu bekommen (mein Rechner ist Client). Sprich die Kette in OUTPUT von iptables müsste hinhauen.
Hängt das zusammen mit passiv und aktiv ftp? Wenn klappt das dann überhaupt? Die Ports bei passiv ftp legt doch der Server fest.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.08.2005 17:54:35

Du mußt in beide Richtungen RELATED erlauben, also auch bei OUTPUT ein RELATED dazuhängen, dann sollte es funktionieren.

Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 22.08.2005 18:56:57

Das hilft leider auch nicht wirklich. Habe mir auch schon das Tut von selflinux.org angeschaut http://www.selflinux.org/selflinux/html/iptables.html
Habe dabei auch icmp Pakete zugelassen, so wie es das tut schreibt.
Leider bringt das alles nix. Hoffe das man das Problem irgendwie lösen kann zwecks apt-get install.
Ich poste nochmal kurz was ich bis jetzt habe und denke wichtig ist für ftp:

Code: Alles auswählen

iptables -A INPUT -i $INTERFACE -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $INTERFACE -p tcp -m multiport --sports ftp-data,ftp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -p tcp -m multiport --dports ftp-data,ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Ich sollte vielleicht zusätzlich erwähnen das ich hinter nem Router sitze, das dürfte meines erachtens aber nicht das Problem sein, da vorher ftp funktionierte.

Grüße Schwabi

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.08.2005 19:08:20

Das ip_conntrack_ftp Modul ist aber geladen oder ? Sicherheitshalber ein "modprobe ip_conntrack_ftp" in dein Firewallscript einbauen. Der ftp-data- Port sollte eigentlich nicht notwendig sein, wenn das ip_conntrack_ftp Modul geladen ist. Zumindest ist dafür der Status RELATED gedacht.

Gruß
gms

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.08.2005 19:16:26

schwabi hat geschrieben:Hoffe das man das Problem irgendwie lösen kann
wenns ohne Firewall funktioniert, wird es mit 100 prozentiger Sicherheit auch mit Firewall zu schaffen sein.
schwabi hat geschrieben: Ich sollte vielleicht zusätzlich erwähnen das ich hinter nem Router sitze, das dürfte meines erachtens aber nicht das Problem sein
Ein Router kann zwar diesbezüglich Probleme verursachen, aber auch hier gilt selbiges

Falls es mit dem "modprobe" auch nicht tut, dann poste einmal dein komplettes Script (eventuell auf NoPaste), dann teste ich es einmal bei mir

Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 22.08.2005 19:46:25

Man man man, linux könnt ich manchmal schon verfluchen, allerdings nur in solchen fällen ;-)
Habe das Modul ip_conntrack_ftp nachgeladen. Hatte ich ganz vergessen.
Leider mag mein Sarge immer noch net. Ich poste jetz mal mein Script, vier Augen sehen schließlich mehr als zwei.

Code: Alles auswählen

#!/bin/bash


INTERFACE="eth0"
LOOPBACK="lo"
HTML="80"
DNS="53"
ICQ="5190"
POP3="110"
SMTP="25"


case $1 in
	start)
		echo "Firewall wird gestartet."
		
		#firewall flushen und default policy setzen
		iptables -F
		iptables -P INPUT DROP
		iptables -P OUTPUT DROP
		iptables -P FORWARD DROP

		#Traffic der LOOPBACK Schnittstelle in beide Richtungen zulassen
		iptables -A INPUT -i $LOOPBACK -j ACCEPT
		iptables -A OUTPUT -o $LOOPBACK -j ACCEPT

		#DNS freischalten
		iptables -A INPUT -i $INTERFACE -p udp --sport $DNS -m state --state ESTABLISHED -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p udp --dport $DNS -m state --state NEW,ESTABLISHED -j ACCEPT
	 	#HTML freischalten
		iptables -A INPUT -i $INTERFACE -p tcp --sport $HTML -m state --state ESTABLISHED -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $HTML -m state --state NEW,ESTABLISHED -j ACCEPT
		
		#FTP freischalten
		iptables -A INPUT -i $INTERFACE -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
		iptables -A INPUT -i $INTERFACE -p tcp -m multiport --sports ftp-data,ftp -m state --state ESTABLISHED,RELATED -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp -m multiport --dports ftp-data,ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT	

		#ICQ freischalten	
		iptables -A INPUT -i eth0 -p tcp --sport $ICQ -m state --state ESTABLISHED -j ACCEPT
		iptables -A OUTPUT -o eth0 -p tcp --dport $ICQ -m state --state NEW,ESTABLISHED -j ACCEPT

		#E-Mail Accounting
		iptables -A INPUT -i eth0 -p tcp -m multiport --source-ports $POP3,$SMTP -m state --state ESTABLISHED -j ACCEPT
		iptables -A OUTPUT -o eth0 -p tcp -m multiport --destination-ports $POP3,$SMTP -m state --state NEW,ESTABLISHED -j ACCEPT

		;;

	stop)
		echo "Firewall wird gestoppt."
		echo "!!!Rechner unsicher !!"

		#firewall flushen und default policy setzen 
		iptables -F
		iptables -P INPUT ACCEPT
		iptables -P OUTPUT ACCEPT
		iptables -P FORWARD ACCEPT
		;;

	restart)
		$0 stop && $0 start
		;;

	status)
		iptables -nvL
		;;

	*)
		echo "Usage: $0 {start|stop|restart|status}"
	 	;;

esac

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.08.2005 21:22:42

ok, das Script funktioniert bei mir auch nicht, habe aber den Fehler im Script auch noch nicht gefunden. Ich teste derzeit noch, ob es an der Kombination "multiport und state" liegt. Bis dahin ein leicht adaptierter Auszug der funktioniert.

Code: Alles auswählen

FTP="21"

....

	start)
		echo "Firewall wird gestartet."
		modprobe ip_tables
		modprobe iptable_filter
		modprobe ip_conntrack
		modprobe ip_conntrack_ftp
		
		#firewall flushen und default policy setzen
		iptables -F
		iptables -P INPUT DROP
		iptables -P OUTPUT DROP
		iptables -P FORWARD DROP

		#Traffic der LOOPBACK Schnittstelle in beide Richtungen zulassen
		iptables -A INPUT -i $LOOPBACK -j ACCEPT
		iptables -A OUTPUT -o $LOOPBACK -j ACCEPT

		iptables -A INPUT -i $INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

		iptables -A OUTPUT -o $INTERFACE -p udp --dport $DNS -m state --state NEW -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $HTML -m state --state NEW -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $FTP -m state --state NEW -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $ICQ -m state --state NEW -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $SMTP -m state --state NEW -j ACCEPT
		iptables -A OUTPUT -o $INTERFACE -p tcp --dport $POP3 -m state --state NEW -j ACCEPT

		;;

Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 22.08.2005 21:55:40

Hmm, werde mich denke morgen noch ma dran setzen, bzw. mich etwas schlauer machen in Bezug auf iptables, da ich auf dem Gebiet noch nich so viel Erfahrung habe.
Werde aber auch das zusatz Script testen. Bis dahin erst mal thanks.


Grüße Schwabi

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 22.08.2005 22:34:12

OK, soweit so gut das scheint zu funzen. Ich stell nun aber mal eine kleine Theorie dazu auf (auch wenn ich noch nicht so viel Ahnung von dem ganzen habe).

Ich lass jetzt bei meinen Überlegungen mal den localhost weg.
Wenn ich das richtig sehe wird mit der folgenden Regel alles reingelassen, wenn eine Verbindung bereits besteht.

Code: Alles auswählen

iptables -A INPUT -i $IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
Sprich wenn ich surfen will, emails hole, etc. werden diese eröffneten Verbindungen durchgelassen.
Soweit so gut.
Was nun aber wenn ich mir, wodurch auch immer, einen Trojaner oder ähnliches aufs System ziehe (mal abgesehen davon das das unter Linux sehr unwahrscheinlich ist, was aber auch wohl ehr daran liegt das Linux nicht ganz so verbreitet ist wie Windows, wer weiß wie lange noch, aber ich schweife ab), und dieser eine bereits bestehende Verbindung nutzt um an die Daten zu kommen die er will. Ich kann mir das zwar nur sehr schwer vorstellen, da er ja quasi in einen lokalen Prozess eingreifen muss, aber wer weiß.

Hoffe ich hab hier jetz nich ganz so viel Mist geschrieben, freue mich aber auf eine Antwort.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.08.2005 22:52:24

war leider etwas länger mit anderen Dingen beschäftig.
Zuerst zu deinem Script, also an dem multiport für ftp lag es nicht, aber anscheinend muß zusätzlich eine portunabhängige Rule definiert sein, durch welche die RELATED (ftp-data) Pakete erlaubt werden. (Die Portabfrage hat also anscheinend eine höhere Priorität, als die Statusabfrage). Ich hoffe das ist soweit verständlich erklärt.

Nun zu deinem Trojaner, der kann sich das Leben viel viel einfacher machen, indem er eine neue Verbindung z.B. auf Port 80 (HTTP) aufbaut. Dazu muß er sich nicht in einen Prozeß einschleusen und muß sich auch nicht als Verbindungspirate betätigen :wink:

Gruß
gms

schwabi
Beiträge: 14
Registriert: 01.07.2005 19:21:28

Beitrag von schwabi » 25.08.2005 21:06:37

Sorry das ich mich nich schon früher gemeldet hab, hatte ziemlich viel zu tun.
Erst ma danke für deine Überlegungen und Hilfe. Werd mich mit dem ganzen noch mal etwas genauer beschäftigen wenn ich wieder Zeit habe.


Gruß Schwabi

Antworten