如何通过两级路由器向上转发端口

时间:2012-12-04 21:29:46

标签: java networking port nat upnp

我正在使用java sbbi库来转发端口。 但我的路由器连接到另一台路由器, 所以第一个路由器的外部ip是 第二个路由器dhcp给出的ip。 有没有办法转发第二个路由器上的端口? 这是我的代码:

InternetGatewayDevice[] devices=InternetGatewayDevice.getDevices( 1000 );
System.out.println("Found "+devices.length+" Devices");
InternetGatewayDevice dev = devices[ 0 ];
System.out.println(dev);
System.out.println( "External IP = " + dev.getExternalIPAddress() );

System.out.println( dev.addPortMapping( "Streamternet", "TCP", null, 1333,
                                        "192.168.0.105", 8888, 0 ) );

System.out.println( "waiting for connection" );
HTTPServer.main(null);

2 个答案:

答案 0 :(得分:4)

正如@Danpe在回答中所说,当你在多个NAT后面时,UPnP不会让你打开端口。

由于我还在研究P2P软件,而且从我收集到的内容中,可以尝试连接两个同行:

  1. 使用TCP或UDP hole punching进行连接。
  2. 如果上述方法无效,则任何一方的路由器都使用Symmetric NAT。尝试UPnP或NAT-PNP。
  3. 如果以上操作不起作用,应用程序要么位于不支持UPnP,NAT-PNP的路由器之后......要么是在多级NAT之后。现在你可以:

    1. 与应用程序用户沟通,打开这些路由器上的端口。正如您在评论中提到的那样,这是一个不幸的解决方案,因为它假定用户具有高级技术知识。但它似乎确实是一些公司实际做的事情。例如,请参阅here

    2. 使用中继服务器,例如使用TURN protocol的中继服务器,具有关闭端口的用户将通过该服务器进行通信。此中继服务器可能是端口打开的对等端中的一个或多个(如uTorrent的情况),或者它可以是您的服​​务器,或两者的组合:如果有开放端口的对等端,请使用这些,否则使用你自己的服务器(这是Skype的情况)。

答案 1 :(得分:3)

据我所知,目前的设置无法实现,因为您无法直接访问路由器的网关。

我能想到两种解决方案。

  1. 禁用您的路由器DHCP服务器,以便他和您将从第二台路由器获取IP,而且您将拥有相同的子网,并且您可以访问每台路由器。
  2. 让另一台PC连接到第二个路由器网络,并使他成为一个监听命令的服务器,该服务器将为您执行UPNP任务。 (这可能需要先手动设置端口转发)
  3. 希望我能提供帮助。