【问题标题】:How to connect an ActiveMQ Client that's behind a NAT to a Server that isn't?如何将位于 NAT 后面的 ActiveMQ 客户端连接到不在 NAT 后面的服务器?
【发布时间】:2016-09-09 13:01:15
【问题描述】:

我在网上查看过,我发现的所有内容都显示了如何创建一个单独的服务器来连接到主服务器(如果它位于 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 连接后面的客户端工作?

【问题讨论】:

  • 您是否尝试过将客户端连接到本地网络,而不通过 NAT,并查看您的代码是否有效?然后你就会知道它是不是 NAT 而不是你的代码。
  • 哦,是的,它工作得很好。我让它在另一台机器上运行,它不在 NAT 后面。我正在显示我的经纪人的队列。
  • 顺便说一句,地址@AlexandreCartapanis。我已经阅读了该页面,但据我所知,该实现也适用于服务器位于 NAT 后面而不是客户端的情况。还是我误会了?另外以防万一有人想知道我也尝试过专门设置远程 rmi 端口等。使用:com.sun.management.jmxremote.port= com.sun.management.jmxremote.rmi.port= 以及通过 java.rmi.server.hostname= 在主机文件中设置主机名
  • 我对您提供的 IP 地址方案表示严重怀疑。这些是实际的IP吗?如果没有,是否可以编写实际IP?

标签: java activemq rmi jmx


【解决方案1】:

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

因此,假设服务器在其 TCP 端口上正确侦听并且客户端可以在本地成功连接到它,那么可以将此问题分析为任何其他与网络相关的问题。

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

【讨论】:

  • 客户端机器可以telnet到服务器机器。真正的 IP 是有效的,你不必担心。我将与我们的网络人员一起研究您的建议,目前有问题的机器正在用于集成测试,而不是上述问题的一部分,因此无法访问它。 @jwatkins
【解决方案2】:

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

【讨论】:

  • Thx 但如上所述,我尝试过并将其设置在主机文件中。我还设置了参数:com.sun.management.jmxremote.port= com.sun.management.jmxremote.rmi.port= @alexandre-cartapanis
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多