PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables -> ICQ funktioniert nicht



Cerox
16.12.05, 22:37
Hallo zusammen,

ich beschäftige mich gerade mit iptables, habe alle Policies auf DROP gesetzt und möchte nun ICQ-Datenverkehr erlauben. Ethereal sagt mir, Pakete gehen zu Port 5190 (Destination-Port) und kommen vom Server natürlich wieder von Port 5190.

Insgesamt habe ich folgendes Script:



# Alle Regeln löschen
iptables -F

# Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Eingehende Verbindungen - INPUT-chain

#ICMP
iptables -A INPUT -p icmp -j ACCEPT

# TCP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSH
iptables -A INPUT -p tcp --sport 5190 -j ACCEPT #ICQ

# Ausgehende Verbindungen - OUTPUT-chain

# ICMP
iptables -A OUTPUT -p icmp -j ACCEPT

# TCP
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT #FTP Data
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT #FTP Control
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT #SSH
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT #SMTP
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT #HTTP
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT #POP
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #HTTPS
iptables -A OUTPUT -p tcp --dport 5190 -j ACCEPT #ICQ

# UDP
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #DNS


Damit funktioniert ICQ nicht obwohl ich Pakete von Source-Port 5190 und Pakete an Destination-Port 5190 zulasse. Ich habe jetzt mehrmals mit Ethreal den Datenverkehr dafür kurz mitgeschnitten - andere Ports werden nicht verwendet.

Wenn ich die iptables wieder flushe, fällt auf, das ich die Policies bei INPUT und OUTPUT auf ACCEPT setzen muss, damit ICQ wieder funktioniert.

Kann mir bitte jemand helfen?

jacky0815
16.12.05, 23:41
Nunja, zum einen würde ich zum schluss noch eine Policy setzen, welche alle restlichen Pakete auf REJECT setzt. Ist freundlicher und die Programme wissen gleich das sie abgewiesen werden.

Zum anderen, war da mal sowas in der FAQ (obs noch aktuell ist weiß ich nicht, denke aber ja):

Client to server Communication:
This is done via port 5190 TCP to login.icq.com (please note- allow a bi-directional connection to the port for login.icq.com and not any specific IP address, since it stands for more than one IP address).

Client to client communication:

Client to client connection is done using the TCP protocol, using port range 1024-65535. This means that the client needs an open listening port within the mentioned range-- 1024-65535.

CheGuevara
17.12.05, 06:52
Nunja, zum einen würde ich zum schluss noch eine Policy setzen, welche alle restlichen Pakete auf REJECT setzt. Ist freundlicher und die Programme wissen gleich das sie abgewiesen werden.

Das ist zwar freundlicher, bietet aber eine Angriffsfläche. Wenn jemand weiss, dass dort ein PC ist (wird durch einen REJECT benachrichtigt), ist die warscheinlichkeit grösser das ein Angriff erfolgt.

Gruss
Che

steve-e
17.12.05, 07:29
Ports auf denen kein Dienst läuft lassen sich auch so gut angreifen.

Ne mal ehrlich. Die Diskussion hatten wir schon öfters.

jacky0815
17.12.05, 10:02
Ich meinte ehr so, weil er von innen ja viel gesperrt hat (OUTPUT). Da weiß der Benutzer des Rechners ja, dass der Rechner da ist. Das Programm, welches er eventuell verwenden will connectet sich aber tot, weil keine Rückantwort :D

Cerox
17.12.05, 13:12
Client to server Communication:
This is done via port 5190 TCP to login.icq.com (please note- allow a bi-directional connection to the port for login.icq.com and not any specific IP address, since it stands for more than one IP address).

Das habe ich gemacht der Port 5190 TCP ist für ausgehende Pakete auf.


Client to client communication:

Client to client connection is done using the TCP protocol, using port range 1024-65535. This means that the client needs an open listening port within the mentioned range-- 1024-65535.

Läuft bei ICQ nicht alles über den Server, wieso dann Client to Client communication? Des Weiteren lasse ich ja auch Pakete durch, die den Quellport 5190 haben (eingehende Pakete). Wozu sollte ich dann eine Range von 1024-65535 öffnen?

jacky0815
17.12.05, 13:25
Wo steht denn das die Kommunikation von port 5190 kommt?
Ein Browser z.B. kommuniziert auch nicht von port 80 aus, wenn der zu port 80 will, sondern nimmt sich ports oberhalb von 1024.
das --sport 5190 kannst du dir - so glaube ich - sparen. Bis jetzt hab ich sowas nur bei udp gebraucht.

Cerox
17.12.05, 13:41
Wo steht denn das die Kommunikation von port 5190 kommt?

Der ICQ-Server läuft doch auf Port 5190 und Ethereal bestätigt mir das.

Erstes Paket:
S-port: Zufallsport
D-port: 5190

Reply des Servers:
S-port: 5190
D-port: der vorher gewählte Zufallsport

Genau das erlaube ich doch hier:

iptables -A INPUT -p tcp --sport 5190 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5190 -j ACCEPT

Was mache ich jetzt falsch?

jacky0815
17.12.05, 14:08
iptables -A INPUT -p tcp --sport 5190 -j ACCEPT
sollte überflüssig sein, da du ja bestehende Verbindungen durchlässt.

Nun ist die Frage: Kannst du nicht connecten zu icq, oder nur nicht mit anderen Leuten kommunizieren? Für letzteres Problem, hab ich dir bereits eine Lösung aufgezeigt.

Cerox
17.12.05, 14:23
Hm ok das hab ich mir gedacht, dass ist das mit sport weglassen kann, denn bei FTP-Sessions, wo ja auch eine TCP Verbindung besteht, brauche ich die Regel ja auch nicht, da ich es bereits erlaube (oder auch bei HTTP).

Mein Problem ist erstmal, dass ich gar nicht zu ICQ connecten kann, ich benutze Kopete.

jacky0815
17.12.05, 14:38
Mal eine ganz dumme Frage. Arbeitest nur du mit dem PC? Wenn ja, warum sperrst du dann alles nach auße hin? Ich würde nur von außen beschränken.

Cerox
17.12.05, 15:18
Nein es ist nicht der einzige PC und es geht mir ums Prinzip: Die Dinge, die ich brauche, möchte ich erlauben - der Rest soll gesperrt sein.

jacky0815
17.12.05, 15:34
Gut, dann solltest du dich näher mit dem Thema beschäftigen. Ich kann jetzt nur raten warum kopete nicht geht, aber hier ein paar grundlegenden Ansätze:


iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

sollte immer rein, am besten gleich nach iptables -P ...


iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Dies hast du bei dir eingebaut, warum? Damit lässt du doch im Prinzip alle Kommunikation von innen nach außen zu. Die einzelnen Freigaben weiter unten sind dann nur noch redundant und überflüssig.
Im übrigen schreibst du ja, dass du genau dies nicht willst :)

Dann ist natürlich noch interessant wie du ins Netz gehst. Hast du einen router? Spielt der PC selbst router? usw


iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Da fehlt das entsprechende Gegenstück mit INPUT (weil udp ja ein verbindungsloses Protokoll ist also:

iptables -A INPUT -p udp --dport 53 -j ACCEPT
desweiteren werden größere Anfragen auch per tcp bearbeitet:

iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

Wie du sieht, könnten deine Probleme schon auf 2 Dinge zurückzuführen sein.
1. keine lo-kommunikation zugelassen (keine ahunug ob kopete damit was anstellt)
2. DNS-Auflösung hat nicht funktioniert.

Cerox
17.12.05, 16:07
Also ich kann mich jetzt mit dem ICQ-Server verbinden - es lag tatsächlich an dem Loopback.


Dies hast du bei dir eingebaut, warum? Damit lässt du doch im Prinzip alle Kommunikation von innen nach außen zu. Die einzelnen Freigaben weiter unten sind dann nur noch redundant und überflüssig.
Im übrigen schreibst du ja, dass du genau dies nicht willst

Ja du hast Recht, fällt mir beim genaueren Hinsehen auch auf - dann werde ich das rausnehmen. Ich dachte ich muss zusätzlich zu den einzelnen Protkollen, die ich erlauben will (z.B. HTTP, SSH etc. nach außen) sagen, dass Pakete von hergestellten TCP-Verbindungen auch angenommen werden sollen. Im Endeffekt werden so ja alle angenommen - danke für den Hinweis.


Dann ist natürlich noch interessant wie du ins Netz gehst. Hast du einen router? Spielt der PC selbst router? usw

Der PC soll in Zukunft Router spielen. Zuerst möchte ich aber einen vernünftigen Paketfilter am Laufen haben - erst dann werde ich mich um NAT kümmern und dies in das Script mit einbinden. Ich teste den Paketfilter so lange auch lokal auf meinem Rechner.


Da fehlt das entsprechende Gegenstück mit INPUT (weil udp ja ein verbindungsloses Protokoll ist also:

iptables -A INPUT -p udp --dport 53 -j ACCEPT

Auf meinem Rechner läuft kein DNS Server, was soll er dann mit Paketen an Zielport 53 anfangen? Die DNS-Auflösung funktioniert definitiv. Wenn dann müsste ich das ja auf den sport beziehen.

Ich poste mal mein abgeändertes Script:



# Alle Regeln löschen
iptables -F

# Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Logging
iptables -A INPUT -j LOG -m limit --limit 4/s --log-prefix "Input: "
iptables -A OUTPUT -j LOG -m limit --limit 4/s --log-prefix "Output: "
iptables -A FORWARD -j LOG -m limit --limit 4/s --log-prefix "Forward: "

# Eingehende Verbindungen - INPUT-chain

# ICMP
iptables -A INPUT -p icmp -j ACCEPT

# TCP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -d 192.168.1.2 --dport 22 -j ACCEPT #SSH

# Ausgehende Verbindungen - OUTPUT-chain

# ICMP
iptables -A OUTPUT -p icmp -j ACCEPT

# TCP
iptables -A OUTPUT -p tcp --dport 20:21 -j ACCEPT #FTP
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT #SSH
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT #SMTP
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT #HTTP
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT #POP
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #HTTPS
iptables -A OUTPUT -p tcp --dport 5190 -j ACCEPT #ICQ

# UDP
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #DNS


Jetzt werden eingehende Paket akzeptiert, die zu einer bereits hergestellten Verbindung gehören. Das heißt, die Verbindung muss zuerst von mir hergestellt werden - und da lasse ich ja nur bestimmte Protokolle in der OUTPUT-chain zu.

Noch eine Frage:
Wie kann ich den Ort für die Log-Dateien festlegen, ich hätte gerne drei separate Dateien für die Logs. Es braucht nur geloggt werden, was verworfen (gedroppt) wird.