PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serveranwendung von IPTables Geblockt



H-net
28.07.10, 17:49
hi,

ich hoffe ich bin hier im richtigen forum.
folgendes:

ich habe eine serveranwendung die auf einen port listend (tcp 55).
wenn ein client dahin connectiert wird ein thread gestartet. (soweit alles einwandfrei)
der client hat jetzt aber in diesem thread die möglichkeit dem server zu sagen das er eine weitere verbindung aufbauen möchte. daraufhin macht der server einen neuen serversocket und schaltet ihn auf listen. Nur das dieser port jetzt natürlich von iptables geblockt wird, und der client dadurch nicht an den port connectieren kann...

habe versucht mittels "modprobe ip_conntrack_ftp ports=21,55" so zutun als ob meien serveranwendung ein ftp-server wäre, weil das prinziep ja das gleiche ist wie bei einem PASV-ftp-befehl. da geht es ja komischer weise.
bei meiner serveranwendung geht das aber nicht. (anscheinend schneidet ip_contrack den ftp-traffic mit und gibt dann die entsprechenden ports vor dem verbindungsaufbau frei?)

wie kann ich mein problem lösen (dass also meine serveranwendung einen port öffnen kann und die clients dahin connectieren)?

vielen dank schonmal
aj

asi_dkn
30.07.10, 11:59
Hi,

Ich denke was du suchst ist so etwas wie das hier:


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

Das heisst das alle Pakete die zu einer bereits bestehenden oder einer anderen bereits erlaubten Verbindung gehören zugelassen werden.

H-net
30.07.10, 14:15
danke für die antwort,

aber leider funktioniert das auch nicht.

woher soll iptables wissen welche ports freigegeben werden sollen, es weis ja nicht welche ich mit meiner serveranwendung öffne (also welche related sind)?

noch ideen?

HirschHeisseIch
30.07.10, 14:28
ip_conntrack
Ohne _ftp. Das Modul gibts auch für andere Serverdienste als FTP ;)

H-net
30.07.10, 22:53
nee... das geht auch nicht... der dienst ist ja von mir selber geschrieben, also wird ip_contrack das warscheinlich nicht erkennen...

sonst noch ideen?

BedriddenTech
01.08.10, 21:19
Warum erzeugt Dein Programm denn keine IPTables-Regel? Wenn es auf Port 55 horcht, dann läuft es sowieso mit Root-Rechten.

ctFreez
03.08.10, 21:58
Nur weil es mit root Rechten läuft muss es ja nicht auch gleich auf dem Router laufen. Ausserdem ist das irgendwie dreckig.

Wie schaut es in der Software mit einer definierten PortRange aus also z.B. Ports 10000 - 10010 für weitere Verbindungen?
Oder du baust die zweite Verbindung nicht vom Client zum Server sondern anderes herum auf. Das funktieniert zumindest solange du nicht durch 2 NATRouter durch must. Und da wir ja ab nächstes Jahr sowieso keine weiteren IPv4 Adressen mehr bekommen macht es Sinn das ganz auch gleich auf IPv6 aus zu legen, dann hast du auch kein Problem mehr die direkt an die Adresse des Clients Daten zu schicken.

Wenn das auch keine Option ist dann google doch mal wie z.B. Skype eine Punkt zu Punkt verbindung durch zwei Firewall's aufbaut, dafür must du dir allerdings einen eigenen Socket schreiben (fürchte ich).
Ganz grob könnte das so aus schaun:
- Server Öffnet Socket und versucht ein Syn an den client zu schicken. der wird an der Client Firwall verworfen/zurückgewiesen.
- Server Informiert Client über die bestehende Verbindung das ein Syn unterwegs sein müsste.
- Client Antwortet mit einem SynAck, dadurch wird die Firewall beim Client geöffnet

Du must den Firewall quasi zwei ausgehende Verbindungen vortäuschen, das ist ein bischen so als würde man einen Tunnel von zwei seiten durch einen Berg Graben ...

Magst du uns Vieleich erklären, warum dir nicht eine Verbindung zu deinem Server reicht? Wofür brauchst du die zweite?

Gruß Felix

MiGo
04.08.10, 00:25
Wenn das auch keine Option ist dann google doch mal wie z.B. Skype eine Punkt zu Punkt verbindung durch zwei Firewall's aufbaut, dafür must du dir allerdings einen eigenen Socket schreiben (fürchte ich).
Klar, die Admins dieser Welt werden dich für diesen Vorschlag lieben. Besserer Vorschlag: Verpack die Daten per Steganographie in ein JPG-File und verschick das per http :)

Ausserdem ist das irgendwie dreckig.
Und holepunching ist weniger dreckig??

Die einzige saubere Möglichkeit wäre imho in diesem Fall ein passendes iptables-Modul zu schreiben, das die payload auswertet und entsprechend Ports öffnet (entsprechend ftp_contrack) - einfacher wäre es allerdings, das Protololl wenn den möglich, auf definierte Ports umzustellen.

ctFreez
04.08.10, 08:26
Moin,


Die einzige saubere Möglichkeit wäre imho in diesem Fall ein passendes iptables-Modul zu schreiben ...

Das ja ne tolle Idee ... das ganze wird dann noch als RFC niedergeschrieben und wenn du glückhast, dann kannst du in 10 bis 15 Jahren mit den ersten Routern rechnen, die dein Protokoll unterstützen.
Ich war davon ausgegangen, das H-Net eine Server Anwendung schreiben will und keine Firewall Module.

Die Option von der Anwendung aus die Firewall Regeln zu ändern ist sehr dumm ... das scheitert sobald die Firewall nicht mehr auf der selben Maschiene läuft. Also an deinem DSL Router :-)
Ein eigenes ip_contrack Modul bringt dich auch nicht weiter, da du meistens nicht die Kontrolle über die geladenen Module deines Routeres hast.
Holepunching ist dreckig, aber es geht in 90% der fälle. Auch durch einen Hardware Router.
Die zweite Verbindung vom Server zum Client auf zu baun, geht nur solange nur eine NATFirewall im Spiel ist. Bei IPv6 gibts kein NAT mehr, da kommt es dann auf den Regelsatz der Firewall an.

Vieleicht guckst du dir mal an was die IETF dazu meint:
http://www.six.heise.de/newsticker/meldung/Internet-Entwickler-sollen-Ende-zu-Ende-Prinzip-hochhalten-1043888.html

Mich interessiert immernoch wofür eigentlich die zweite Verbindung benötigt wird. Vieleicht sollte man lieber mal das Programmdesign unter die Lupe nehmen.

Gruß ctFreez

MiGo
04.08.10, 09:44
Mich interessiert immernoch wofür eigentlich die zweite Verbindung benötigt wird. Vieleicht sollte man lieber mal das Programmdesign unter die Lupe nehmen.
Exakt meine Rede :)