精华内容
下载资源
问答
  • UPNP和端口转发

    千次阅读 2015-07-23 01:03:46
    1.1 What is UPnP? UPnP的概念最早来源于即插即用。即插即用是描述计算机总线特性、设备规格的一个专业术语。利用即插即用可以大大简化系统的整个硬件组成,而不需要再进行物理设备的配置,也避免了解决资源冲突时...

    1. 说明

    1.1 What is UPnP?    
    UPnP的概念最早来源于即插即用。即插即用是描述计算机总线特性、设备规格的一个专业术语。利用即插即用可以大大简化系统的整个硬件组成,而不需要再进行物理设备的配置,也避免了解决资源冲突时用户的干预[1][2]。整个思路就是:只需要在设备中插入,然后就可以使用。

    如今将UPnP将即插即用概念创造性地应用于网络环境下。UPnP可以自动搜索设备类别。它支持零配置,“隐形”网络,以及自动检索功能。这就意味着设备UPnP可以动态加入网络、获得IP地址、传输性能,从而得到当前设备以及其他设备的性能的相关信息——全自动化、完全零配置网络支持。
    【编程】UPNP和端口转发


    UPnP网络应用的步骤

    在UPnP机制下存在6种不同的步骤:

    (1)寻址
    寻址是通过控制点和设备取得网络地址的过程。这些控制点和设备先从DHCP服务器上获得一个IP地址;如果没有可用的IP地址,将会在169.254的子网上随机获取一个自动IP地址。

    注意: 在寻址过程中,AutoIP和DHCP都可以协助UPnP控制点和设备取得一个IP地址。但是DHCP要比AutoIP的更为常用和可靠。所以,在这篇应用手册和基于W5200的模型中,DHCP是获得IP地址的唯一方法。

    (2)搜索

    控制点可以通过搜索来查找对它们有意义的设备。
    当控制点进入网络时,它们以普通或者特殊方式释放search packets来搜索and/or服务的设备。搜索完成后,具有合适服务特性的设备或者子设备就会做出响应。
    同样地,UPnP设备首先将会以规律性间隔的方式在网络上表明自身的存在。控制点监听这些状态,检测这些新的设备并且判断它们在网络上的性能表现。
    网络上的其它UPnP设备将会发出通知表明它们提供的服务将不再有效。

    注意: 在搜索过程中,无论是Searching或者Advertising都可以帮助UPnP控制点来寻找UPnP设备。在Searching和Advertising这两种方法相同的情况下,在这篇应用手册和基于W5200的模型中都是保留了Searching方法,而Advertising方法将被忽略。

    (3)描述

    UPnP发送搜索包,将控制点送到一个它们能够检索Device Description Document(DDD)的位置。
    DDD包括:所有嵌入式设备的概述以及一个服务列表。
    被称做服务控制协议定义(SCPD)一个URL。SCPD描述了控制点如何使用这些设备提供的服务。
    控制和事件URLs:这些URLs表示控制点必须发送命令来配置UPnP设备,并且利用这些设备所提供的服务。
    用来陈述的URL(见第6步).

      (4)控制
     
    控制过程允许控制点向设备发送命令。如之前提到的,在DDD中指定发送命令的URL。

      (5) 事件

    事件过程允许控制点跟踪设备的状态变化。控制点首先订阅合适的服务,随后设备服务中任何状态的变化都会以事件的形式发送给已经订阅的控制点来保证它们的更新。

      (6) 陈述

    控制点能够选择性地为设备显示一个用户的界面。用来陈述的URL是在DDD中已经被指定。陈述页面显示基于HTML的用户界面,这样用户就可以参考and/or设备的状态。所以陈述过程是控制过程和事件过程的补充。

    2. 端口转发和UPnP
    端口转发

    简单来说,端口发送(另一种说法是NAT遍历)功能允许创建TCP和UDP协议映射。这些协议应用于外部因特网网关设备(IGD)端口(称为外部端口)和内部客户机地址。这里的内部客户地址与其中的一个端口相联系(分别称为内部客户机和内部端口)。

    请参考下面的图形来理解端口转发的应用:
    【编程】UPNP和端口转发



    展开全文
  • 通过upnp打开端口转发的实用程序。 用golang写。 什么时候有用? 如果您想将LAN上的IP地址公开给Internet,则可以通过UPnP与路由器一起设置端口转发,该端口将从路由器(公共IP)转发到本地网络上的计算机(192.168...
  • UPnP PortMapper是易于使用的程序,用于管理本地网络中启用UPnP的Internet网关设备(路由器)的端口映射(端口转发)。 您可以轻松查看,添加删除端口映射。 使用端口转发,可以从Internet访问在专用网络中运行...
  • UPnP PortMapper可用于轻松管理本地网络中启用UPnP的Internet网关/路由器的端口映射/端口转发
  • openup - 通过upnp打开端口转发的工具类,采用golang开发
  • 在NodeJS中使用UPnP和NAT-PMP进行快速端口映射。 安装 必需:NodeJS> = 10 npm install nat-api 用法 const NatAPI = require ( 'nat-api' ) const client = new NatAPI ( ) // Map public port 1000 to private ...
  • forwardPort 端口转发/映射工具 forward for port data 编译: 配置好你的GO开发环境,推荐GO 1.7以上; 执行build.dat,会自动编译出linuxwindows的执行程序
  • Java的UPnP端口转发再简单不过了! WaifUPnP是extermely轻量级的Java库,使您可以: 打开/关闭TCP / UDP端口 检查是否有可用的UPnP路由器 检查端口是否已经映射 应该使用字面意义上的1行代码! 就像这样简单: ...
  • c# upnp 端口转发 实例

    2012-10-31 10:22:17
    c# upnp 端口转发 实例,c#环境下开发upnp端口转发功能。
  • VB6.0制作的一款UPNP控制程序(带源码)。可以控制路由器的UPNP功能,无需登录路由器即可实现端口映射、内网穿透的功能。
  • delphi编写的端口转发,端口映射的例子 使用IdMappedPortTCP
  • UPNP端口映射简单流程

    千次阅读 2019-12-01 17:00:39
    文章目录0 简介1 寻址2发现2.1 广播2.2 响应3 描述3.1 GET描述文件3.2 获取并解析XML描述文件4 控制4.1 获取状态信息4.2 获取外网IP4.3 获取端口映射信息4.4端口映射5 一些疑问5.1 端口映射的有效期是多久?...


    参考文档:
    1.RFC 6970
    https://www.rfc-editor.org/info/rfc6970

    2.《UDA1.0-ChinesePDF.pdf》
    http://read.pudn.com/downloads37/doc/comm/125876/UDA1.0-ChinesePDF.pdf

    3.UPnP基本原理以及在NAT中的应用
    https://blog.csdn.net/wuruixn/article/details/23920871

    4.UPnP的介绍和理解
    https://blog.csdn.net/be_happy_mr_li/article/details/52919759

    5.UPnP的工作过程
    https://blog.csdn.net/ocean181/article/details/7406816

    6.upnp协议简介(一)
    https://blog.csdn.net/braddoris/article/details/41646789

    一些词语:
    control point(控制点):在本文中可以理解为需要端口映射的设备,比如内网的一些子设备
    root device(根设备):提供服务的设备,在本文中可以简单理解为路由器
    IGD(Internet Gateway Device):网络网关设备,比如路由器

    0 简介

    参考文档介绍了UPNP的相关原理,接下来进行一个简单的实战,用于练练手。
    我们在内网的设备只有内网的IP:PORT,因此公网设备无法主动和内网的设备进行主动连接。一个简单的方法便是使用UPNP端口映射,将内网设备的PORT(P1)映射到公网的PORT(P2),当其他公网设备主动和P2通信后,路由会将数据转发到P1上。

    下面就UPNP的端口映射功能整个流程做个梳理。

    1 寻址

    所谓的寻址,简单来说就是设备能够连上网络,能够获取IP。

    2发现

    发现设备,在《UDA1.0-ChinesePDF.pdf》中,有如下描述:

    当设备被添加到网络后, UPnP 发现协议允许该设备向网络中的控制点宣告其服务。同样,当一个控制点被添加到网络后,UPnP 发现协议允许该控制点在网上搜索感兴趣的设备。

    所以当控制点添加到网络中后,会搜索局域网内支持UPNP协议的设备。在本文中,可理解为发现支持UPNP端口映射的路由器。

    2.1 广播

    设备需要向239.255.255.250:1900发送多播信息,用于搜索周围支持UPNP的设备多播信息如下:

    M-SEARCH * HTTP/1.1
    HOST: 239.255.255.250:1900
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    MAN: "ssdp:discover"
    MX: 2
    

    各个字段含义如下:

    SEARCH:SSDP定义的搜索请求方法
    HTTP/1.1: HTTP版本
    HOST: 由IANA为SSDP保留的多播信道和端口,必须为239.255.255.250:1900
    MAN: 固定为"ssdp:discover",注意双引号不可少
    MX: 最长等待时间,设备会在0和这个值之间随机选择延迟的值,用于均衡负载。
    ST: 搜索目标,有以下类型:
    	ssdp:all
    		搜索所有设备和服务。
    	UPnP:rootdevice
    		只搜索根设备。
    	uuid:device-UUID
    		搜索特殊设备。设备 UUID 由 UPnP 厂商指定。
    	urn:schemas-UPnP-org:device:deviceType:v 
    		搜索同类设备。设备类型与版本由 UPnP 论坛工作委员会定义。 
    

    2.2 响应

    当设备收到多播消息后,会向控制点发送多播消息的源IP:PORT发送UDP响应,并回复给控制点信息。

    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=100
    DATE: Wed, 04 Jan 2006 00:58:36 GMT
    EXT:
    LOCATION: http://192.168.2.1:1900/igd.xml
    SERVER: Wireless N Router WR745N, UPnP/1.0
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    USN: uuid:upnp-InternetGatewayDevice-192168123178900001::urn:schemas-upnp-org:device:InternetGatewayDevice:1
    

    各个字段含义如下:

    CACHE-CONTROL: 表示宣告有效持续时间,如果超过此时间,控制点可以认为设备或服务不再可用
    DATE: 响应生成时间,此字段可以不使用
    EXT:表示上面discover中的MAN标头已经被理解
    LOCATION: 表示设备的UPNP描述的URL  
    SERVER:记录设备的版本信息
    ST: 搜索目标,取值如下:
    	ssdp:all
    		如果根设备带有 d 种嵌入式设备与 s 种嵌入服务且只有 K 种不同服务类型,那么其响应次数为 3+2d+k。 ST 标头值必须与采用ssdp:alive 的 NOTIFY 消息中的 NT 标头保持统一。
    	UPnP:rootdevice
    		向根设备响应一次。必须是 UPnP:rootdevice。
    	uuid:device-UUID 
    		向每种设备(根设备或嵌入式设备)响应一次。必须是uuid:device-UUID。设备 UUID 由 UPnP 厂商指定。
    	urn:schemas-UPnP-org:device:deviceType:v
    		向每种设备(根设备或嵌入式设备)响应一次。必须是urn:schemas-UPnP-org:device:deviceType:v。设备类型与版本由 UPnP 论坛工作委员会定义。 
    	USN:服务名称,取值如下:
    		uuid:device-UUID::UPnP:rootdevice
    			向根设备发送一次。设备 UUID 由 UPnP 厂商指定。
    		uuid:device-UUID 
    			向每种设备(根设备或嵌入式设备)发送一次。 设备 UUID 由 UPnP厂商指定。
    		uuid:device-UUID::urn:schemas-UPnP-org:device:deviceType:v
    			向每种设备(根设备或嵌入式设备)发送一次。 设备 UUID 由 UPnP厂商指定。设备类型与版本由 UPnP 论坛工作委员会定义。 
    

    在上面信息中心,有一个比较重要的便是LOCATION,在下面我们会通过这个设备描述URL来获取设备的服务。

    至此,整个发现过程便结束了,控制点已经获取到了局域网内的设备信息。

    3 描述

    在发现设备之后,我们只是发现了设备,但是并不知道设备有什么服务,有什么功能等等。因此我们需要从上面设备发现的消息中获取设备描述URL,从而来获取设备的描述。

    3.1 GET描述文件

    控制点会和设备描述URL中的IP:PORT建立TCP连接,并GET获取xml数据。请求如下:

    GET /igd.xml HTTP/1.1
    Host: 192.168.2.1:1900
    Connection: Close
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    

    3.2 获取并解析XML描述文件

    控制点会收到如下描述文件:

    HTTP/1.1 200 OK
    CONTENT-LENGTH: 2746
    CONTENT-TYPE: text/xml
    DATE: Wed, 04 Jan 2006 00:58:40 GMT
    LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONNECTION: close
    
    <?xml version="1.0"?>
    <root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
    <major>1</major>
    <minor>0</minor>
    </specVersion>
    <URLBase></URLBase>
    <device>
    <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
    <presentationURL>http://192.168.2.1:80 </presentationURL>
    <friendlyName >Wireless N Router WR745N</friendlyName>
    <manufacturer >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription >TL-WR745N 1.0</modelDescription>
    <modelName >TL-WR745N</modelName>
    <modelNumber >1.0</modelNumber>
    <UDN>uuid:upnp-InternetGatewayDevice-192168123178900001</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>
    <controlURL>/l3f</controlURL>
    <eventSubURL>/l3f</eventSubURL>
    <SCPDURL>/l3f.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
    <friendlyName>WAN Device</friendlyName>
    <manufacturer >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription>WAN Device</modelDescription>
    <modelName>WAN Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:upnp-WANDevice-192168123178900001</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId>
    <controlURL>/ifc</controlURL>
    <eventSubURL>/ifc</eventSubURL>
    <SCPDURL>/ifc.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
    <friendlyName>WAN Connection Device</friendlyName>
    <manufacturer >TP-LINK</manufacturer>
    <manufacturerURL >http://www.tp-link.com.cn</manufacturerURL>
    <modelDescription>WAN Connection Device</modelDescription>
    <modelName>WAN Connection Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:upnp-WANConnectionDevice-192168123178900001</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId>
    <controlURL>/ipc</controlURL>
    <eventSubURL>/ipc</eventSubURL>
    <SCPDURL>/ipc.xml</SCPDURL>
    </service>
    </serviceList>
    </device>
    </deviceList>
    </device>
    </deviceList>
    </device>
    </root>
    

    部分字段含义如下:

    UDN:全球唯一设备标识符
    serviceType:UPNP服务类型。 
    

    在上面的报文中,有WANIPConnection/Layer3Forwarding/WANCommonInterfaceConfig等服务类型。其中,WANIPConnection便是我们下面端口映射需要的服务,关于这个描述,有如下定义:

    此服务类型使UPnP控制点能够配置和控制符合UPnP的InternetGatewayDevice的WAN接口上的IP连接。
    可以支持IP连接的任何类型的WAN接口(例如,DSL或电缆)都可以使用此服务。
    […]
    为WANConnectionDevice上的每个实际Internet连接实例激活WANIPConnection服务的实例(请参阅状态变量表)。
    WANIPConnection服务为LAN上的联网客户端提供了与ISP的IP级连接。

    SCPDURL: 服务描述URL
    

    WANIPConnection的服务描述URL是/ipc.xml,因此我们可以在浏览器中输入设备的URL, http://192.168.2.1:1900/ipc.xml, 便可以看到详细的信息,里面包含了许多动作,如下:
    在这里插入图片描述

    controlURL:控制的URL
    

    WANIPConnection的控制URL是/ipc

    至此,描述结束。在这个阶段中,我们找到了需要的服务WANIPConnection,并且获取到了控制URL:/ipc

    4 控制

    在上面的过程中,我们获取了设备的服务,因此接下来便可以控制设备。在本文中,我们控制设备进行端口映射,相关的控制如下:

        AddPortMapping:增加端口映射
        DeletePortMapping:删除端口映射
        GetGenericPortMappingEntry:获得端口映射信息
    	GetExternalIPAddress:获取外网IP
    	GetStatusInfo: 获取状态信息
    

    4.1 获取状态信息

    交互过程如下:

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 271
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache
    
    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetStatusInfo xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetStatusInfo></s:Body></s:Envelope>
    

    上面信息中有几个需要关注的点:
    POST /ipc HTTP/1.1, 其中/ipc便是路径控制URL
    SOAPACTION:必须是要调用的服务类型、散列符号和动作名称

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 480
    CONTENT-TYPE: text/xml; charset="utf-8"
    
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewConnectionStatus>Connected</NewConnectionStatus><NewLastConnectionError>ERROR_NONE</NewLastConnectionError><NewUptime>3 Days, 01:46:46</NewUptime></u:GetStatusInfoResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    4.2 获取外网IP

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 285
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache
    
    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>
    
    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 402
    CONTENT-TYPE: text/xml; charset="utf-8"
    
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewExternalIPAddress>192.168.100.34</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    NewExternalIPAddress中的值便是外网IP,因为我的路由器是多级路由,所以并没有获取到真正的公网IP

    4.3 获取端口映射信息

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 341
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetGenericPortMappingEntry"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache
    
    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetGenericPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewPortMappingIndex>0</NewPortMappingIndex></u:GetGenericPortMappingEntry></s:Body></s:Envelope>
    
    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 687
    CONTENT-TYPE: text/xml; charset="utf-8"
    
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetGenericPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>10154</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>554</NewInternalPort><NewInternalClient>192.168.2.137</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>MasonUpnp_554_10154</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:GetGenericPortMappingEntryResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    4.4端口映射

    POST /ipc HTTP/1.1
    Host: 192.168.2.1:1900
    User-Agent: Ubuntu/12.04, UPnP/1.1, MiniUPnPc/1.9
    Content-Length: 604
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache
    
    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>26780</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>554</NewInternalPort><NewInternalClient>192.168.2.138</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>MasonUpnp_554_26780</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping></s:Body></s:Envelope>
    

    上面有几个值需要关注一下:
    NewExternalPort:需要映射的外网端口
    NewProtocol:TCP/UDP
    NewInternalPort:内部端口
    NewInternalClient:内部IP,即控制点IP
    NewPortMappingDescription:端口映射的描述
    NewLeaseDuration:控制点活动状态持续时间,0表示无限制

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Wireless N Router WR745N, UPnP/1.0
    CONTENT-LENGTH: 332
    CONTENT-TYPE: text/xml; charset="utf-8"
    
    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:AddPortMappingResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    设备返回200 OK,表示映射成功。如果是通过路由器上映射的话,我们便可以在路由器WEB页面看到相关信息。
    在这里插入图片描述
    以上便是UPNP端口映射的流程,本文只是简单介绍了端口映射。所以对UPNP后续的事件/展示等过程没有进行研究。

    5 一些疑问

    5.1 端口映射的有效期是多久?

    关于端口映射的有效期是多久,了解时间太短,没有找到有效的信息。不过在miniUPnP的官网上找到了一些信息,在控制点进行端口映射的时候会有NewLeaseDuration字段,表示控制点活动状态持续时间,将这个值设置为0则表示无限制。

    5.2 多级路由如何映射成功

    由于UPNP只能穿透一层网络,所以如果遇到多级路由这样的复杂网络环境,虽然端口映射成功,但是并没有真正映射到公网。但是查询了一圈资料,并没有找到如何能在多级路由中映射到真正的公网,如果有了解的,麻烦告知一下,共同探讨。

    6 开源库

    网上有一些开源的UPNP库,可以将我们从这些繁杂的交互过程中独立出来,专注于应用。虽然了解了轮子的构造过程,但是就不需要重新造轮子了。
    MiniUPnP:
    https://github.com/miniupnp/miniupnp
    Libupnp:
    http://pupnp.sourceforge.net/

    展开全文
  • UPnP端口映射设置操作

    2021-06-08 14:48:36
    目标:对UPnP服务的端口映射增删改查操作。 参考:这篇文章原理说的比较清楚。 方案一 使用gupnp-tools,gupnp是一个upnp开发库,其中gupnp-tools带了一个工具gupnp-universal-cp(GUPnp通用控制点)程序,可用于...

    目标:对UPnP服务的端口映射增删改查操作。

    参考:这篇文章原理说的比较清楚。

    方案一

    使用gupnp-tools,gupnp是一个upnp开发库,其中gupnp-tools带了一个工具gupnp-universal-cp(GUPnp通用控制点)程序,可用于控制。
    ubuntu下安装。

    sudo apt install gupnp-tools
    

    主页地址,也可从此处下载源码。
    以我的环境为例:
    主界面
    双击API,可以直接调用。
    调用界面

    方案二

    编写脚本,使用curl向upnp服务控制点发送POST请求,实现端口的增删改查增删改查。
    这是对应于我的环境的一个脚本,链接

    展开全文
  • upnp 端口映射

    万次阅读 2018-07-10 15:34:25
    当然这并不是唯一方案,穿透和转发也是一个较普遍的方式,本文只讨论UPNP端口映射的实现方式。UPNP端口映射将一个外部端口映射到一个【内网Ip:端口】,当然也指明了使用的协议是UDP,TCP,还是此映射同时适应UDPTCP...

    简介

    处于内网的机器,因为没有一个公有的Ip,外面是无法主动连接到内网的设备。如果希望外面可以连接到处于内网的指定设备。UPNP端口映射是一个较简易的方案。当然这并不是唯一方案,穿透和转发也是一个较普遍的方式,本文只讨论UPNP端口映射的实现方式。UPNP端口映射将一个外部端口映射到一个【内网Ip:端口】,当然也指明了使用的协议是UDP,TCP,还是此映射同时适应UDP和TCP。

     

    UPNP使用的常用命令:

         "GetStatusInfo",
         "GetExternalIPAddress",
         "AddPortMapping",
         "GetSpecificPortMappingEntry",

     

    1. 建立UDP socket,并绑定到一个自定的端口

    2、通过UDP发送组播包:M-search,端口1900,包的内容如下所示

    M-SEARCH * HTTP/1.1
    HOST: 239.255.255.250:1900
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    MAN: "ssdp:discover"
    MX: 2

    3、接收M-search的回应,并做相应的处理

    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=100
    DATE: Thu, 01 Jan 1970 21:39:02 GMT
    EXT:
    LOCATION: http://192.168.1.1:1900/igd.xml
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
    USN: uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9::urn:schemas-upnp-org:device:InternetGatewayDevice:1

    1》获取path(lacation) ,此为 : /igd.xml                                        #path#

         端口为: 1900 (有些路由并不一定是UPNP的端口1900)          #ServerPort#

         ip:192.168.1.1 (有时候我们的内网中可能存在多个路由,并且都开启了upnp服务,这时候我们要判断哪一个才是网关路由,并且只处理网关路由的回应)

    2》获取ST,此为:urn:schemas-upnp-org:device:InternetGatewayDevice:1       #ST#

    4、建立tcp连接,--》【网关:ServerPort】

    注意:有些路由不支持keep-alive特性,做每一次交互都做一次连接

    5、获取path位置的xml数据:

    GET /igd.xml HTTP/1.1
    Host: 192.168.1.1:1900
    Connection: Close
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6

    6、接收并分析得到的xml数据

    HTTP/1.1 200 OK
    CONTENT-LENGTH: 2733
    CONTENT-TYPE: text/xml
    DATE: Thu, 01 Jan 1970 21:39:02 GMT
    LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONNECTION: close

    <?xml version="1.0"?>
    <root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
    <major>1</major>
    <minor>0</minor>
    </specVersion>
    <URLBase></URLBase>
    <device>
    <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
    <presentationURL>http://192.168.1.1:80       </presentationURL>
    <friendlyName            >Mercury Router MR804</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription                       >MR804 8.0</modelDescription>
    <modelName                           >MR804</modelName>
    <modelNumber                             >8.0</modelNumber>
    <UDN>uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>
    <controlURL>/l3f</controlURL>
    <eventSubURL>/l3f</eventSubURL>
    <SCPDURL>/l3f.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
    <friendlyName>WAN Device</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription>WAN Device</modelDescription>
    <modelName>WAN Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:80104052-1dd2-11b2-a699-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId>
    <controlURL>/ifc</controlURL>
    <eventSubURL>/ifc</eventSubURL>
    <SCPDURL>/ifc.xml</SCPDURL>
    </service>
    </serviceList>
    <deviceList>
    <device>
    <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
    <friendlyName>WAN Connection Device</friendlyName>
    <manufacturer                         >Mercury</manufacturer>
    <manufacturerURL    >http://www.mercurycom.com.cn</manufacturerURL>
    <modelDescription>WAN Connection Device</modelDescription>
    <modelName>WAN Connection Device</modelName>
    <modelNumber>1</modelNumber>
    <modelURL></modelURL>
    <serialNumber>12345678900001</serialNumber>
    <UDN>uuid:8c99e7b0-1dd2-11b2-8291-e6838914e4d9</UDN>
    <UPC>123456789001</UPC>
    <serviceList>
    <service>
    <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
    <serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId>
    <controlURL>/ipc</controlURL>
    <eventSubURL>/ipc</eventSubURL>
    <SCPDURL>/ipc.xml</SCPDURL>
    </service>
    </serviceList>
    </device>
    </deviceList>
    </device>
    </deviceList>
    </device>
    </root>

    获取端口映射服务<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>

    的控制路径<controlURL>:/ipc               #ControlUrl#

    7、发送获取外网IP的命令请求:GetExternalIPAddress

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 285
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>

    8、分析接收数据

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 404
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewExternalIPAddress>113.119.126.148</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

     

    解析得到NewExternalIPAddress标签中的外网ip:113.119.126.148

    9、发送命令获取指定的外部端口的详细信息{内部端口,ip,协议,外部端口,。。。}

    使用命令GetSpecificPortMappingEntry,并在NewExternalPort指定要查询的外部端口

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 399
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetSpecificPortMappingEntry"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetSpecificPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol></u:GetSpecificPortMappingEntry></s:Body></s:Envelope>

    10、接收数据并并分析指定的端口有没有被映射

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 574
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:GetSpecificPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewInternalPort>80</NewInternalPort><NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>JUAN UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:GetSpecificPortMappingEntryResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    如上所示:外部端口5500已经做了映射,映射到{192.168.1.83:80,TCP}

    1.1》映射到期望的客户端

    1.2》没有映射到期望的客户端,如映射到别的ip

    2》未映射,会返回500错误:HTTP/1.0 500 Internal Server Error

    HTTP/1.1 500 Internal Server Error
    CONTENT-LENGTH: 481
    CONTENT-TYPE: text/xml; charset="utf-8"
    DATE: Thu, 01 Jan 1970 00:00:02 GMT
    EXT:
    SERVER: Mercury Router MR804 Router, UPnP/1.0

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
    <faultcode>SOAP-ENV:Client</faultcode>
    <faultstring>UPnPError</faultstring>
    <detail>
    <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
    <errorCode>402</errorCode>
    <errorDescription>Invalid ExternalPort</errorDescription>
    </UPnPError>
    </detail>
    </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    如果已经做了期望的映射,则进入等待下一轮的更新

    否则做端口映射

    11、发送命令添加端口映射:

    POST /ipc HTTP/1.1
    Host: 192.168.1.1:1900
    User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
    Content-Length: 589
    Content-Type: text/xml
    SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
    Connection: Close
    Cache-Control: no-cache
    Pragma: no-cache

    <?xml version="1.0"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>80</NewInternalPort><NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>JUAN UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping></s:Body></s:Envelope>

    12、接收并分析是否映射成功:

    HTTP/1.1 200 OK
    CONNECTION: close
    SERVER: Mercury Router MR804 Router, UPnP/1.0
    CONTENT-LENGTH: 332
    CONTENT-TYPE: text/xml; charset="utf-8"

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:AddPortMappingResponse></SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    返回HTTP/1.1 200 OK,可见操作成功,进入等待下一轮的更新

    展开全文
  • 端口映射与UPnP

    千次阅读 2009-05-14 09:59:00
    端口映射与UPnP UPnP是通用即插即用(Universal Plug and Play)的缩写,它主要用于实现设备的智能互联互通。使用UPnP协议不需要设备驱动程序,因此使用UPnP建立的网络是介质无关的,它可以运行在几乎所有的操作系统...
  • upnp复制到手机根目录的/system/bin 运行方式: 第一种:将手机连到电脑 运行 adb shell 输入upnp 就可以看到帮助文档了 第二种:下载安卓虚拟终端,直接运行upnp 第三种:通过java代码调用(开发android程序...
  • 可以用的自己写的socket端口转发程序,很简单,适合刚开始接触socket的人,有简单的错误判断,打开后不用管中转程序,只需要调整发送接收端就可以了。winsock为发送sock winsock2为接收sock
  • UPNP自动端口映射工具,可以将路由器UPNP开启
  • ssh 端口转发

    2019-06-25 21:46:54
    ssh 端口转发可以理解,ssh 作为一种数据通道而存在。所谓的端口转发,就存在一个直接业务。 ssh 在建立ssh 会话时启动额外的端口来完成端口转发,分为 local forward ssh -L [<localhost>]:<port>...
  • upnp-自动实现端口映射

    千次阅读 2015-04-13 10:41:00
    UPnP基本原理以及在NAT中的应用 案例分析Upnp协议实现自动端口映射 转载于:https://www.cnblogs.com/liyou-blog/p/4421549.html
  • ros端口转发

    2020-07-28 22:39:16
    一、端口转发 静态配置: [admin@MikroTik] > /ip firewall nat add chain=dstnat dst-address=x.x.x.x(静态公网IP) protocol=tcp dst-port=22 action=dst-nat to-addresses=x.x.x.x(本地静态内网IP) to-...
  • pfSense上的端口转发是一个相当简单的过程。以前版本添加端口转发时,还必须添加防火墙规则,以便流量转发到端口指定的内部IP地址。 现在创建端口转发定义时可以自动添加此规则,并且默认情况下已启用该选项。 端口...
  • 本地端口,远程转发,用来访问远程的服务;远程端口,本地转发,用来暴露本地的服务
  • 如果你用了恩山的OpenWrt固件(Lean),刚好你又做了端口转发,你可能会遇到以下问题: 通过外网端口转发到内网端口,如果内外端口不一样,远程访问速度会非常慢(通常表现为JS/字体文件/图片)加载缓慢 转发到443...
  • 第二,介绍UPnP工作组定义的端口转发概念。最后,这篇文章会说明W5200芯片如何添加删除端口映射。今天为大家分享第一部分,端午节后继续为大家分享后面两部分~希望对大家有帮助~ 1. 说明 1.1 概念 请参考...
  • UPNP端口映射Android实现

    千次阅读 2016-11-17 14:40:29
    这一段一直研究UPNP协议,搞得头都快炸了,找到一个upnp的jar包,感觉对发现InternetGatewayDevice非常方便。下面写了一个小程序,是发现路由器并进行端口映射的。 package com.example.laozhou.upnptest; import...
  • 简单聊聊OpenWrt的UPnP协议

    千次阅读 2019-10-25 09:45:38
    通用即插即用(Universal Plug and Play,UPnP)是一种分布式、开放的网络架构,此 标准由微软公司于 1999 年提出,由非盈利的通用即插即用论坛(UPnP Forum)负责体系 架构标准的维护更新升级,此标准现已开放 ...
  • netsh windows7 自带端口映射(转发)使用教程netsh interface portproxy add v4tov4 listenaddress=10.10.10.234 listenport=64822 connectaddress=172.168.128.68 connectport=221. 查看netsh interface portproxy...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,308
精华内容 523
关键字:

upnp和端口转发