如何将NAT后面的ActiveMQ客户端连接到不是的服务器?

时间:2016-05-13 10:53:02

标签: java activemq rmi jmx

我已经在线查看了,我发现的一切都显示了如果它位于nat或防火墙后面,如何建立一个单独的服务器连接到主服务器。

但在我的情况下,客户端在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连接后工作?

2 个答案:

答案 0 :(得分:1)

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

因此,假设服务器正在侦听其TCP端口并且客户端可以在本地成功连接到该服务器,则可以分析此问题,就好像它是任何其他与网络相关的问题一样。

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

答案 1 :(得分:0)

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