RMI: Server hinter Router&Firewall

Winnetoupopper

Grünschnabel
Dem Compiler zum Gruße!

Ich komme mit dem scheinbar wohlbekannten Problem eines RMI-Servers innerhalb eines gerouteten LANs nicht zurecht.

Die IST-Situation:

Auf meinem Rechner läuft ein RMI-Server-Prozess ( Server/Reg. Port 1099 ).
Dieser Rechner hängt an so nem dämlichen DSL-Router inkl. Firewall mit externer IP.
Diesem Router hab ich gesagt, er soll Anfragen auf Port 1099 auf meine interne IP (192.1681.11) umleiten, die Firewall lässt den Port natürlich auch durch.

So nun starte ich den Serverprozess mit dem parameter
-Djava.rmi.server.hostname=<externe IP des Routers>,

und ein Client von draussen nimmt Verbindung auf.
Code:
server = (ServerChatKommunikator)Naming.lookup(url);
Das funktioniert auch noch.

Aber sobald der Client richtig in Interaktion mit dem Server (erster Methodenaufruf) tritt, fällt clientseitig diese Exception:

Code:
Connection refused to host: 192.168.1.11; nested exception is: 
java.net.ConnectException: Connection timed out: connect

Tja und da fällt auf, der Client versucht über meine lokale Adresse an den Server heranzutreten.
Aber das sollte ich doch mit der Property "-Djava.rmi.server.hostname" verhindert haben?


Ich bin am verzweifeln, man findet diese Frage beim recherchieren tierisch oft und die wenigen Antworten helfen einfach nicht. Aber das muss doch machbar sein!

bin wie immer für jede Idee SEHR dankbar ;)
gruß kev

PS:
Innerhalb des LANs funktioniert das Programm natürlich fehlerfrei
 
Oehm, mal eine Frage ich hoffe ich hab das richtig in erinnerung.

Und zwar schau dir folgendes Szenario an:

Du stellst an deinen Router eine anfrage an Port1099 (welchen du forwardest!) dieser geht auch wie gewünscht auf die Zieladresse. Jetzt würde aber ein dauerhafter block auf diesem Port, andere Anfragen von anderen quellen sperren. Also wird ein Subprozess auf einem anderen Port geöffnet und darüber die kommunikation gemacht, um den Hauptport 1099 wieder frei zugeben.

Jetzt hast du aber nur über Port 1099 die weiterleitung gemacht. Andere anfragen vom Client an den Server werden nicht geforwarded. Ich glaube da liegt der Knackpunkt.

Bitte korrigiert mich, falls ich falsch liege und etwas nicht beachtet habe. Hab schon lange nix mehr mit der RMI schnittstelle gemacht.
Das würde mir so auf anhieb einfallen.

Schau mal in deinem Log vom Router nach, ob du verworfene antworten von dem Client host hast.

Intern läuft das auch wunderbar, da hier nichts zu routen ist, bzw. nicht geblockt und verworfen wird. Du kommunizierst ja ws. direkt mit dem RMI Host und nicht über eine weiterleitende Zwischenstation


Gruss
Torsten
 
Zuletzt bearbeitet:
torsch2711 hat gesagt.:
Du stellst an deinen Router eine anfrage an Port1099 (welchen du forwardest!) dieser geht auch wie gewünscht auf die Zieladresse. Jetzt würde aber ein dauerhafter block auf diesem Port, andere Anfragen von anderen quellen sperren. Also wird ein Subprozess auf einem anderen Port geöffnet und darüber die kommunikation gemacht, um den Hauptport 1099 wieder frei zugeben.

Dieser dauerhafte Block tritt aber nur ein, wenn ich 2 Prozesse verwende, oder?
z.B. rmireg.exe und java.exe, aber die Registrierung mach ich in der Main des Serversprozesses..

torsch2711 hat gesagt.:
Jetzt hast du aber nur über Port 1099 die weiterleitung gemacht. Andere anfragen vom Client an den Server werden nicht geforwarded. Ich glaube da liegt der Knackpunkt.

Ich habe testweise versucht, 1099 nur zum registrieren zu benutzen und 1098 (welcher auch gefrowarded wird) in den Konstruktor meines Servers( UnicastRemoteObject ) übergeben, so sollte ja eigentlich auf dem Port 1098 telefoniert werden, oder?
Gibt es denn noch mehr Ports, die benutzt werden? Oder wie ist meine Einflußmöglichkeit? kann ich dem Client den 1098 explizit mitteilen?

danke
gruß kev
 
Jap, der Block tritt auf wenn du 2 Prozesse hast, korrekt.

Hmm, mal so rum, dein Client bekommt keine verbindung mehr zum server, sprich er macht eine Anfrage (welche den Server nie erreicht, weil diese Weggeblockt wird.) und erhält keine Antwort. Das ist das Szenarion.

Ich weiss leider nicht welche ports noch benutzt werden, wie gesagt hab schon lange nix mehr mit RMI gemacht. haste mal auf der Java Homepage bei RMI Tutorial nachgeschaut?

Gruss
Torsten
 
si, und mich vor allem durch das Forum geklickt.
Den gleichen Fehler gabs oftmals bei Problemen mit Routing usw, allerdings ist der Lösungsvorschlag fast durchgängig der Parameter "-Djava.rmi.server.hostname=<externe IP des Routers>".

Ich halte immernoch für möglich, dass der Client auf einmal anfängt, statt der externen IP des Routers meine interne anzufragen. Weil woher kennt der die eigentlich Hat doch damit absolut nix zu tun..

Natürlich wäre die schönste (weil am einfachsten zu behebende) Lösung, dass einfach ein weiterer Port ur KOmmunikation fehlt...
 
Zurück