2016-05-13 86 views
0

我在网上看过,而且我找到的所有东西都显示了如何在独立服务器连接到主服务器(如果它位于NAT或防火墙后)。如何将位于NAT后面的ActiveMQ客户端连接到不是的服务器?

但在我的情况下,客户是NAT后面,服务器是在本地网络上。

所以它的设置有点象下面这样:

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

我用它来连接到服务器的Java代码如下:

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); 

而且它抛出的错误是:

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

所以我的问题是,如何让我的背后NAT连接工作这个客户端?

+1

您是否尝试过将客户端连接到本地网络,而无需通过NAT,并查看您的代码是否正常工作?然后你会知道它是否是NAT,而不是你的代码。 –

+0

看看https://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx –

+0

哦,是的,它工作得很好。 我让它在不同的机器上运行,不在NAT后面。 而我正在显示来自我的经纪人的队列。 – user1479897

回答

0

两侧使用主机名,通过设置相同-Djava.rmi.server.hostname=XXX。确保主机名在双方都可解析。你可以看看http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/faq.html#nethostname

+0

Thx但如上所述,我尝试过,并将其设置在主机文件中。 此外,我设定参数: com.sun.management.jmxremote.port = <1099> com.sun.management.jmxremote.rmi.port = <1098|1099> @亚历山大-cartapanis – user1479897

1

首先:没有什么特殊与与ActiveMQ的工作网络配置方面。 ActiveMQ的协议是单端口,可以像大多数其他TCP/IP协议一样轻松路由。

因此,鉴于服务器是否正常监听的TCP端口和客户端可以成功连接到在本地,那么这个问题就可以,如果它是任何其他网络相关的问题进行分析。

可以在客户端计算机ping服务器的机器?从您提供的IP地址方案中很难正确理解您的网络,但是就目前来看,客户端机器会简单地假定服务器位于本地网络上,因此会发送一个请求MAC地址的ARP请求的“10.0.0.0”(因为没有这样的机器来回答请求而会超时),而不是将请求转发给它的NAT网关。如果这确实是你的问题,那么有三种可能的解决方案:a)修改网络布局(让客户端使用不同的IP方案),b)在客户端机器上为服务器的IP设置静态路由以强制其通过网关进行路由,或者c)在网关上添加端口重定向,并让客户端连接到网关的IP地址。现在解决方案a不是很实用,除非您的设置几乎不是实验室配置。解决方案b是一种可能性,但是非常糟糕。解决方案C,即在网关上设置端口重定向,是解决这类问题的最常见解决方案。

+0

的客户端机器可以远程连接到服务器计算机。 而真正的IP是有效的,你不必担心这一点。 我会用我们的网络人员来看看你的建议,目前有问题的机器正在用于集成测试,而不是上述问题的一部分,所以无法访问它。 @jwatkins – user1479897

相关问题