2016-05-13 8 views
0

Ich habe online geschaut, und alles, was ich finde, zeigt, wie man einen separaten Server zur Verbindung mit dem Hauptserver macht, wenn es hinter einer NAT oder Firewall ist.Wie verbinde ich einen ActiveMQ Client, der hinter einem NAT steht mit einem Server, der das nicht tut?

Aber in meinem Fall ist der Client hinter dem NAT, und der Server ist im lokalen Netzwerk.

So ist es ein bisschen wie folgt einstellen:

Client Actual:10.0.0.1 -> Client NAT:100.0.0.2:1111 <--> Server 10.0.0.0:1099 

Der Java-Code, den ich auf dem Server verbinden verwenden, wie unten:

String serviceUrl = "service:jmx:rmi:///jndi/rmi://10.0.0.0:1099/jmxrmi"; 
String[] credentials = new String[] {"username", "password"}; 
String objectName = "org.apache.activemq:type=Broker,brokerName=test"; 
JMXServiceURL url = new JMXServiceURL(serviceUrl); 

Map<String, String[]> env = new HashMap<String, String[]>(); 
env.put(JMXConnector.CREDENTIALS, credentials); 

JMXConnector jmxc = JMXConnectorFactory.connect(url, env); 
conn = jmxc.getMBeanServerConnection(); 

broker = MBeanServerInvocationHandler.newProxyInstance(conn, new ObjectName(objectName), BrokerViewMBean.class, true); 

Und der Fehler wirft es ist:

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

Also meine Frage ist, wie kann ich diesen Client hinter NAT-Verbindung arbeiten?

+1

Haben Sie versucht, den Client mit dem lokalen Netzwerk zu verbinden, ohne das NAT zu durchlaufen und zu sehen, ob Ihr Code funktioniert? Dann wissen Sie, ob es das NAT ist und nicht Ihr Code. –

+0

Schauen Sie auf https://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx –

+0

Oh ja, es funktioniert gut. Ich habe es auf einer anderen Maschine laufen, das ist nicht hinter dem NAT. Und ich zeige eine Warteschlange von meinem Broker. – user1479897

Antwort

0

Verwenden Sie Hostnamen auf beiden Seiten, indem Sie denselben -Djava.rmi.server.hostname=XXX einstellen. Stellen Sie sicher, dass der Hostname auf beiden Seiten aufgelöst werden kann. Sie können einen Blick auf http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/faq.html#nethostname

+0

Thx, aber wie oben erwähnt, habe ich das versucht und es in der Host-Datei gesetzt. Auch setze ich die Parameter: com.sun.management.jmxremote.port = <1099> com.sun.management.jmxremote.rmi.port = <1098|1099> @ alexandre-cartapanis – user1479897

1

Zunächst einmal: Es gibt nichts Besonderes in Bezug auf die Netzwerkkonfiguration für ActiveMQ zu arbeiten. Das ActiveMQ-Protokoll ist ein einzelner Port und kann einfach wie die meisten anderen TCP/IP-Protokolle geroutet werden.

Daher kann dieses Problem analysiert werden, als ob es sich um ein anderes Netzwerkproblem handeln würde, da der Server seinen TCP-Anschluss ordnungsgemäß überwacht und dass ein Client erfolgreich eine Verbindung zu ihm lokal herstellen kann.

Kann der Client die Servermaschine anpingen? Es ist schwierig von dem IP-Adressschema, das Sie präsentieren, um Ihr Netzwerk richtig zu verstehen, aber wie es jetzt präsentiert wird, nimmt der Clientcomputer einfach an, dass der Server im lokalen Netzwerk ist und sendet daher eine ARP-Anfrage nach der MAC-Adresse von "10.0.0.0" (was zu einem Timeout führt, da kein solcher Rechner die Anfrage beantwortet), anstatt die Anfrage an ihren NAT-Gateway weiterzuleiten. Wenn dies das Problem ist, das Sie haben, dann gibt es drei mögliche Lösungen: a) Ändern Sie das Netzwerk-Layout (haben Sie einen anderen IP-Schema Client), b) eine statische Route für die IP des Servers auf dem Client-Rechner zu erzwingen Routing über das Gateway oder c) Hinzufügen einer Portumleitung auf dem Gateway und stattdessen Verbinden des Clients mit der IP-Adresse des Gateways. Jetzt ist Lösung a nicht sehr praktisch, es sei denn, Ihr Setup ist kaum eine Laborkonfiguration. Lösung b ist eine Möglichkeit, aber eine wirklich schlechte. Lösung C, die Portumleitung am Gateway einrichtet, ist die gängigste Lösung für diese Art von Problem.

+0

Die Client-Seite Maschine auf dem Server-Rechner telnet kann. Und die echten IPs sind gültig, Sie müssen sich nicht darum kümmern. Ich werde Ihre Vorschläge mit unserem Netzwerk-Typ untersuchen, derzeit wird die fragliche Maschine für Integrationstests verwendet, die nicht Teil des oben genannten Problems sind und daher nicht darauf zugreifen können. @jwatkins – user1479897

Verwandte Themen