NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Apache, Lighttpd, nginx, Cherokee
fids3
Posts: 22
Joined: 2005-12-26 14:39

NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 13:49

Hallo,

ich habe ein Plugin für den Firefox Browser geschrieben, welches
auf einem Socket Port auf Verbindungen wartet. Wenn ich nun mit dem
Browser auf ein entsprechendes Tomcat Servlet gehe und dieses im gegenzug
eine Verbindung mit dem Browser-Plugin aufnehmen möchte, bekomme
ich die Exception

NoRouteToHostException

Woran kann das liegen. Ist irgendeine Einstellung in der Firewall und/oder
im Routing verantwortlich. Was muß ich machen, damit der Serverprozeß
sich mit jedem beliebigen Browser auf einem port X verbinden kann ?

juergen
Posts: 133
Joined: 2004-03-30 14:44

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by juergen » 2007-05-21 15:44

Ist das eine Neuerfindung von aktivem FTP? Wie Du schon gemerkt hast ist das
Firewall/NAT-Technisch eine schlechte Idee. Wie teilst du dem Servlet die Client-Adresse mit?

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 16:17

Zweck des ganzen ist es den browser als rendering engine für
Flugdatenanzeige zu verwenden. Der browser erhält über die portverbindung dann u.a. seine URLs und wird auch gepusht, wenn Datenaktualisierungen anstehen, was nur der Server weiß. Auch speichert sich der
browser seine persönlichen Identifizierungs- und Serverkontakt-Daten persistent und kann bei einem Wiederstart sich sofort wieder beim Server anmelden. Die IP des browser clients zu erhalten ist über den Servlet kontext kein Problem, die Port Nummer ist Vereinbarungssache.

Netzwerkkonfiguration ist allerdings nicht mein Spezialthema. Ich benötige nun einen Tip, was ich an meinem Rootserver, der eine ganz normale Defaultkonfiguration hat, einstellen muß (Ich tippe mal so auf Routing-Konfiguration), damit der Server sich mit den dynamisch vergebenen Browser-IPs und dem vereinbarten Port verbinden kann.

Eine einfache step-by-step Anleitung wäre schön :-)

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-21 16:33

Das Problem wird vermutlich folgendes sein:

Dein Client sitzt hinter einem NAT Router (Fritzbox) und hat eine 192.168.X Adresse. Diese werden normalerweise nicht im Internet geroutet und sind so nicht erreichbar.

Gibt dir dochmal aus welche Addresse der Client hat bezw dein Servlet meint nutzen zu wollen eine 192.X? eine externe/gültige?

In Zeichen von NAT und Firewalls halte ich dein Konstrukt für relativ Fehleranfällig bzw. userunfreundlich.

ggf ist eine Lösung andersrum (Client connected zum Server) doch die bessere Möglichkeit

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 16:54

ja, es ist eine 192.168 Adresse.

Von konzeptionellen Fragen einmal abgesehen, besteht in dieser Konstellation eine Möglichkeit den Client vom Server aus zu connecten ?

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 17:00

Ach ja, wenn ich in Sacehn Fehleranfälligkeit nähere Hinweise bekommen könnte (potentielle Probleme) wäre ich dankbar.

Was die Userunfreundlichkeit angeht, so ist das eigentlich kein Thema, da es sich um eine reine Anzeige handelt und keinerlei Userinteraktion stattfindet. Der Browser wird auf Fullscreen umgeschaltet und es nicht mehr
erkennbar, dass es sich um einen Browser handelt.

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by dtdesign » 2007-05-21 17:05

Wenn der Client die Verbindung aufmacht, läufst du auch in keine Probleme. Je nachdem wie viele Clients damit angesprochen werdne, wäre es u.U. einfacherer und weniger problematisch (oder willst du den Rechner in eine DMZ packen?) den Browser die Drecksarbeit - sprich mit JavaScript - machen zu lassen.

Bei 10 Clients kann man ohne weiteres mal eben jede Minute aktualisieren oder benötigst du das ganze Sekundengenau?

Ausserdem überleg dir, ob du mit deinem Vorhaben nicht den Rahmen sprengst, sprich lieber auf ein Program umsteigst, damit du permanente TCP Verbindungen aufbauen kannst?

Gruß
dtdesign

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 17:17

Die Aktualisierung muß schon sehr zeitnah sein. Wenn der Client die Verbindung aufbaut läuft das ganze auf ein Pollen hinaus, es sei denn ich lasse die Verbindungen, und das könnten Hunderte sein, stehen. Wenn ich die Verbindungen nicht stehen lasse, was ich in der jetzigen Lösung auch bewußt vermeide, kann ich ja auch einen normalen HTTP port 80 request machen. Alle Verbindungen führt aber auch wieder zu anderen Problemen, da die Konsistenz und der Status des ganzen Verbindungspools ständig überwacht werden muß. Irgendwo in Africa, wo ständig der Strom ausfällt und Server und Monitore ständig neu booten, wo die USV schon vor Jahren verrotet ist :-), hat man bei so einer Varianten einen sehr hohen Überwachungs-/Recoveryaufwand in Sachen Netzwerkverbindungen.

Aber was ist eigenlich mit meinem Ursprungsproblem :-), der Routingproblematik ?

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by dtdesign » 2007-05-21 18:55

Also, wenn ich dein Routing-Problem verstehe, kommst du einfach nicht zu deinem Client durch. Hier mal eine simple Aufstellung, wie der Client den Server kontaktiert.

1) Client -> Server
Client will auf Port 80 von example.com -> Router merkt sich: example.com:80 -> Server bekommt die Anfrage und antwortet -> Router bekommt die Antwort und sieht, dass von _innen_ eine Anfrage kam (nämlich auf example.com:80) und leitet die Antwort durch.
2) Server -> Client
Server weiss, dass Client auf mein.isp.tld:23456 in vormals angesprochen hat -> Server schickt Anfrage -> Router hat inzwischen den Eintrag in der NAT-Tabelle verworfen, kann nichts mit der Anfrage anfangen und spielt stillschweigend Herrn Hase.

Du könntest höchstens den Client-Router anweisen, Port XY (Router) auf Port Z (Client) permanent weiterzuleiten. Solange aber kein Programm dort horcht, bist du egtl. wieder da, wo du herkamst.

Dein Grundproblem: Ein Webbrowser kontaktiert auf einem x-beliebigen und zu gleich exotischen (was halt frei war...) Port den Server. Faktisch kannst du aber nich auf Port 80 in umgekehrt kontaktieren (kontaktieren, nicht antworten auf die Anfrage!!!), da Port 80 - wenn überhaupt - ebenfalls ein Webserver ist.

Du brauchst _zwangsweise_ ein Program, das auf einen bestimmten Port horcht, die Weiterleitung des Ports seitens des Routers spielt dabei die geringste Rolle.

Dementsprechend kannst du mit deiner Ideal-Lösung nie auf einen grünen Zweig kommen.

PS: Sollte etwas grundlegendes hiervon nicht stimmen, so darf man mich gerne korrigieren ;)

Gruß
dtdesign

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 20:53

Zunächst einmal habe ich eben nochmal auf meine FritzBox geschaut und die IP 87.166.178.33 festgestellt. Das ist auch genau die IP, welche beim Server zu sehen ist, wenn ich einen request an ein tomcat servlet sende.

Ich habe es vielleicht zu kompliziert erklärt. Es geht einfach nur darum, das der Server eine TCP/IP Verbindung zu meinem Browser aufnimmt, in dem ein Listener, sagen wir auf Port 7080 horcht. Gehen wir einfach mal davon aus, das der Server einfach von der IP Adresse 87.166.178.33 und dem Port 7080 weiß und auch niemals ein Request zuvor von dem Client bekommen hat, das ist für das Problem unerheblich.

Versuche ich die Socketverbindung aufzubauen, so klappt es nicht. Vergiss einfach mal den Kontakt vom Client zum Server. Das wäre nur ein Weg für das Servlet an die IP ADresse zu kommen, ist aber für das Problem unerheblich.

Also

RootServer bootet
Servlet versucht Socketverbindung zu o.a. 87.166.178.33 + Port 7080
Failed, NoRouteToHostException

Ich bin mit meinem PC hinter der Fritzbox 87.166.178.33, habe den Browser gestartet, auf dem meine Firefox Extension auf eingehende Requests auf dem Port 7080 wartet, um Steuerungsbefehle vom Server entgegenzunehmen, das könnte auch ein Monitor (mit PC+Linux+Browser) sein, welcher bei Sixt am
Airport hängt und Departure Flüge anzeigt). Der Server kennt den Monitor Linux PC durchaus schon lange, da in der DB konfiguriert.

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 20:59

Was ich so langsam verstehe ist, das das Problem wohl dieser NAT Router ist und der wohl nicht wissen wird, das ich mit meinem PC+Browser in meinem Hausnetzwerk einen PC mit einer internen IP mit einem Listener auf Port 7080 habe, zu dem dieser Request eigentlich geroutet werden müste.

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 21:03

Ach ja, noch was: Der ping vom Server auf die IP klappt.

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 21:04

telnet: connect to address 87.166.178.33: No route to host

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-21 21:09

Dein Server ist ein Server im Internet (nehme ich an) die Addresse eine offizielle IP (soweit gut).

Dein Client hat eine IP aus einem privaten Band, diese kann NICHT vom Server erreicht werden. (Punkt! - die Möglichkeit das Clients ein VPN aufbauen lasse ich aus)

Du könntest (theoretisch) die Anfrage IP nehmen, das ist die externe IP die das DSL Modem/Router von z.B. T-Online bekommt (nicht die die dein Firefoxplugin meldet das ist im privaten Netzberiech bei Dir im Wohnzimmer und weiß nichts von der Außenwelt), aber auch da würde ein Portforwarding auf dem Router nötig sein.

Kurz: mit nem Serverport auf dem Client hast Du Probleme die sich nicht einfach (wenn überhaupt) lösen lassen.

Ohne Polling/Ajax Zeugs (das kann doch alles ;-)) sehe ich da wenig Chancen wenn Du wirklich http nehmen mußt/willst.

Entweder stische TCP Verbindungen (mit dem Problem ~60000 parallele Verbindungen haben zu können) oder ne Software die auf nem festen Port beim Client lauscht und dieser muß dann in jeder Firewall/Router freigeschaltet und weitergeleitet werden.

Das was Du dir vorgestellt hast geht nicht (im Allgemeinen)

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-21 21:12

traceroute sollte dir den Weg geben den das Packet nimmt und dir auch aufzeigen wo es happert.

Deine Fritzbox muß 7080 auf deinen Heimpc weiterleiten (schliesslich läuft das Plugin ja nicht auf der Fritzbox.

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-21 22:21

Erstmal danke,

nachdem ich nun auf der Fritzbox Port 7080 eine Freischaltung v. 7080 und Weiterleitung an die lokale IP konfiguriert habe, bekomme ich bei dem Verbindungsversuch nicht mehr NoRoutToHostException, sondern 'normal'
Connection Refused.

Ist es nun unmöglich von dem Server 87.106.xx.xx eine Connection zur dyn. vergebenen Fritzbox IP 87.166.xx.xx aufzubauen ?

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-21 22:50

jein.

Du willst ja keine Connection zur Fritzbox sondern zu deinem PC, Du mußt also Port 7080 der Fritzbox per Portforwarding auf deinen PC 192.168.X.X:7080 weiterleiten und auf deinem PC diesen port ggf in der Personal/Windows/iptables Firewall öffnen.
netstat sollte Auskunft geben, ob was auf deinem PC lauscht, ein Test von einem anderen PC im lokalen Netz mittels Telnet 192.168.X.X 7080 guckst Du ob Du drauf kommst (um die Fritzbox als Fehlerquelle auszuschliessen) und dann testest Du von deinem Server aus.

Aber diese Schritte (freischalten/weiterleiten) muß jeder User von Dir machen und das ist für den 0815 Dau eine Riesenhürde.

Ein connect ist/sollte dann möglich sein, aber eben nur mit den o.g. Vorarbeiten

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by captaincrunch » 2007-05-22 08:11

Um das Ganze jetzt mal abzukürzen: die Stichworte JavaScript / AJAX sind bereits gefallen. Sofern du in diese Richtugn weiter forscht, sparst du dir viel Zeit und Energie...
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-22 17:10

Nach meinem jetzigen Verständnis nehme ich mit dem TCP/IP Connect doch eine einfache Verbindung mit der Fritzbox auf und verbinde mich mit dieser mit dem Port 7080, den ich ja dort nun freigegeben habe. Die Box wird dann ja wohl einen Listener/Thread instanzieren, der Verbindungen annimmt. Die ganze Geschichte hintendran zu meinem PC ist doch dann nur noch ein Fritzbox-internes Tunneln des TCP Datenverkehrs und nach außen transparent.

Stimmt mein Verständnis ? Was ich nun immer noch nicht weiß ist wie ich nun das fremde Netzwerk 87.166 von meinem Linux Server Netz 87.106 per Connect erreichen kann. Da ist doch bestimmt irgendeine Netzwerkkonfiguration in Abänderungen der Defaultsettings notwendig. Der Connect wird ja auch zurückgewiesen.

Was Benutzerkomfort angeht, so ist das ja kein Thema, da es sich um einmalig aufgehängte/installierte Monitore mit Fluginformationsanzeige handelt. Es gibt keinen Benutzerdialog. Es ist keine Kioskanwendung. Selbst wenn sich die dynamisch zugeteilte IP dieses Clients einmal ändern sollte, so wird durch erneute Registrierung des nach wie vor bekannten Servers diese demselben mitgeteilt, woraufhin dieser diese als dann aktuelles Setting persistiert.

Was AJAX angeht, so ist dieses auch nicht unbedingt die Lösung aller Probleme, da ich einfach keine Kontrolle über die Monitore habe. Über das Firefox TCP Plugin habe ich die volle Steuerung und kann theoretisch beliebigste Kommandos einbauen, parsen und damit den Browser fernsteuern. Der Monitor könnte durchaus dazu angehalten offline zu gehen, etwas anderes anzuzeigen, er könnte in einem Cluster hängen und dynamisch vom Zustand anderer Clustergeräte unterschiedliche Anzeigeinhalte darstellen. Möchte ich den wirklichen realen Inhalt der Monitoranzeige dem Server übermitteln, kann ich screenshots persistieren und dem Server zur Verfügung stellen (per FTP) usw. Die Aufgabenstellung ist also nicht so trivial wie sie auf den ersten Blick erscheinen mag.

Letztendlich wird die Regel eher sein in einem Intranet statisch vergebene IP Adressen zu haben. In so einem Fall stellt sich die Problematik auch überhaupt nicht. Ich möchte aber auch, das die Fritzbox-NAT-Härtevariante auch geht.

Also, was muß ich nun auf Linux konfigurieren, um vorgenannten Connect erfolgreich durchzuführen :-)

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-22 19:18

Wie das genau innerhalb der Fritzbox aussieht weiß ich nicht (ob da Listener/Thread erzeugt werden)

Mit der Weiterleitung sollte die Fritzbox Pakete für diesen Port garnicht anschauen sondern direkt an die konfigurierte (interne) IP weiterleiten.

Es sollte wie du richtig gesehen hast transparent sein.

Du solltest eigentlich nichts an deinem Rootserver einstellen müßen, per Defaultroute sollte das Paket den richtigen Weg finden, debug Möglichkeiten habe ich Dir im letzten Post gegeben ohne diese ist weiteres nur stochern im trüben.

Ich kann von meinem Server aus die von dir genannte IP problemlos per Ping erreichen, wie das bei Schlund aussieht weiß ich nicht, wäre mir aber neu wenn es da ein Problem gibt.

Ich bekomme bei einem Telnet auf diesen Port das gleiche was Du siehst (no route to host), Ich tippe also auf eine falsch konfigurierte Fritzbox die icmp ping durchläßt, den rest aber nicht.

Wie gesat: Debug nach o.g. tips

Nachtrag: was genau hast Du bei der Fritzbox gemacht?
Internet -> Portfreigabe -> Neue Portfreigabe TCP 7080 auf [Die IP deines PCs 192.168.X.X] 7080 sollte reichen (aktivieren nicht vergessen)

Du solltest deinem PC eine feste IP geben, da die Fritzbox sonst auch mal eine andere zuweisen kann.

fids3
Posts: 22
Joined: 2005-12-26 14:39

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by fids3 » 2007-05-22 21:19

Das routing landed nach der 8. Station bei der Fritz Box.
Ich kann das allerdings nicht sicher interpretieren. Da die Portfreigabe und auch Weiterleitung auf die interne IP mit genau der selben Nummer in der Box konfiguriert ist, bin ich nun wirklich etwas ratlos.

8 p57a6a40a.dip0.t-ipconnect.de (87.166.164.10)(N!) 12.012 ms (N!) 10.069 ms *

Wie ist denn diese letzte Zeile zu interpretieren ?

Das Ergebnis ist im übrigen dasselbe, egal ob der Listener auf dem Port aktiv ist oder nicht. Es muß wohl irgendwie bei der Box liegen, aber da gibt es so sehr viel eigentlich gar nicht einzustellen.

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by rootsvr » 2007-05-22 23:58

Die Portfreigabe/Portforwarding sollte im Handbuch der Fritzbox erklärt sein.

Du wirst beim Ping sicherlich keine Rückmeldung des HeimPCs bekommen, deshalb ja der Test im internen (Heimnetz) zu Port 7080 deines PCs (wo ja Firefox lauschen sollte).

Zu eventuellen Firewalls hast Du auch nichts gesagt, also auch hier ein "?"

Ich kenn mich mit der Fritzbox nicht weiter aus, aber Blick ins Handtuch sollte helfen. Dein FirefoxPlugin nimmt Verbindungen an? Getestet von nem anderen PC?

Es nutzt nur diesen Port?

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: NoRouteToHostException - Vom Server auf einen Client Port im Browser verbinden

Post by captaincrunch » 2007-05-23 09:33

Was AJAX angeht, so ist dieses auch nicht unbedingt die Lösung aller Probleme, da ich einfach keine Kontrolle über die Monitore habe
Kontrolle über die Monitore? Sorry, aber spätestens wenn's um Flugdaten geht, bist du mit deiner (arg merkwürdigen) Insellösung spätestens an Firewalls von entsprechenden Airports, bzw. -lines komplett aufgeschmissen. Da kannst du noch so viel rumtesten und rumspielen.

Aber du machst das sicherlich schon...
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc