繁体   English   中英

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

[英]how to upnp forward ports via two levels of routers

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

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

我能想到有两种解决方案。

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

希望我能提供帮助。

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

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

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

    1. 与需要打开端口的应用程序用户进行通信。 正如您在评论中提到的那样,这是一个不幸的解决方案,因为它假定用户具有高级技术知识。 但它似乎确实是一些公司实际做的事情。 例如,见这里

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

它比你想象的要复杂一些。 我正在尝试做同样的事情。 我可以访问连接到 ISP 的调制解调器(我知道这一点是因为我可以从笔记本电脑访问路由器)。 但我在路由器(我的网关)后面。 为了使其工作,您需要先将调制解调器映射到您需要的端口的路由器。 然后另一个从路由器到您的 PC。

这有两个问题。

1-问题是UPNP软件总是要求映射到您当前PC(您的路由器)的网关。 我找不到可让您自定义要要求运行 UPnP 配置的网关的软件。 (通常当路由器为 192.168.0.1 时,调制解调器为 192.168.1.1 或 192.168.2.##)。

2-为了映射路由器,您需要知道您的路由器在调制解调器网络中的指定地址。 这样,UPnP 将配置端口直接转发给它。

所以......这是可能的,但不能使用当前的软件。 PS:在stackoverflow中问这种事情的人不需要回答说。 “您可以 go 到调制解调器端口转发菜单并手动执行”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM