7

我正在使用 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);
4

2 回答 2

4

正如@Danpe 在他的回答中所说,当您位于多个 NAT 之后时,UPnP 不会让您打开端口。

由于我也在开发 P2P 软件,从我收集到的信息来看,这里是一个可以尝试连接两个对等点的方法:

  1. 使用 TCP 或 UDP打孔连接。
  2. 如果上述方法不起作用,则任一侧的路由器之一使用Symmetric NAT。尝试 UPnP 或 NAT-PNP。
  3. 如果上述方法不起作用,则应用程序位于不支持 UPnP、NAT-PNP 的路由器后面……或者您位于多个级别的 NAT 后面。现在您可以:

    1. 与应用程序的用户沟通,她需要在这些路由器上打开端口。正如您在评论中提到的那样,这是一个不幸的解决方案,因为它假设用户拥有先进的技术知识。但这似乎确实是一些公司实际所做的。例如,请参见此处

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

于 2013-10-27T17:37:07.027 回答
4

据我所知,您当前的设置是不可能的,因为您无法直接访问路由器的网关。

我能想到2个解决方案。

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

希望我能帮上忙。

于 2013-04-20T14:10:35.450 回答