我试图从私有网络外的设备到私有网络内部和NAT后面的设备进行p2p连接。
我使用lib net.sb..nnp为我的路由器添加端口映射。
import net.sbbi.upnp.impls.InternetGatewayDevice;
import net.sbbi.upnp.messages.UPNPResponseException;
.....
uPnPPortMapper = new UPnPPortMapper();
try {
uPnPPortMapper.openRouterPort(externalIP, externalPort,internalIP,internalPort, ApplicationConstants.ADD_PORT_DESCRIPTION);
} catch (IOException e) {
e.printStackTrace();
} catch (UPNPResponseException e) {
e.printStackTrace();
}
public boolean openRouterPort(String externalRouterIP,int externalRouterPort, String internalIP,int internalPort, String description) throws IOException, UPNPResponseException {
/** Upnp devices - router search*/
if(internetGatewayDevices == null){
internetGatewayDevices = InternetGatewayDevice.getDevices(ApplicationConstants.SCAN_TIMEOUT);
}
if(internetGatewayDevices != null){
for (InternetGatewayDevice addIGD : internetGatewayDevices) {
addIGD.addPortMapping(description, externalRouterIP, internalPort, externalRouterPort, internalIP, 0, ApplicationConstants.TCP_PROTOCOL);
addIGD.addPortMapping(description, externalRouterIP, internalPort, externalRouterPort, internalIP, 0, ApplicationConstants.UDP_PROTOCOL);
}
return true;
}else{
return false;
}
}
此代码确实在我的路由器中添加了一个端口映射,就像我在TP Link TL-WR940ND的UPnP表中看到的那样:
当前UPnP设置列表
ID App说明外部端口协议内部端口IP地址状态
1 Skype UDP at 192.168.0.101:3105 31051 UDP 31051 192.168.0.101已启用
2 Skype TCP at 192.168.0.101:3105 31051 TCP 31051 192.168.0.101已启用
3使用UNPN 31052 TCP 31052 192.168.0.102启用IGD打开端口
4使用UNPN 31052在IGD上打开端口UDP 31052 192.168.0.102已启用
问题在于,当我尝试建立从网络外部到公共IP +端口31052的连接时,我收到超时。
我使用网站(http://www.ipfingerprints.com/portscan.php)检查端口状态,端口31052标记为'已过滤'而skype的端口标记为' open':
港口国服务
31051 / tcp open unknown
31052 / tcp过滤未知
我在路由器上找不到任何其他设置,skype可能会像防火墙规则一样改变,以使端口打开。
我已经测试了一些应用程序,例如Droid UPnP Port Mapper' (Android应用程序)和' UPnP PortMapper' (Windows应用程序),但所有这些都成功地在我的路由器内创建了一个端口映射,但没有一个让端口打开'。
我的路由器不在双NAT后面,因为http://www.ipfingerprints.com/给出的外部IP是189.xx.xxx.xxx,也是我的路由器WAN IP。