upnp 端口映射

简介

处于内网的机器,因为没有一个公有的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




1
0



urn:schemas-upnp-org:device:InternetGatewayDevice:1
http://192.168.1.1:80      
Mercury Router MR804
Mercury
http://www.mercurycom.com.cn
MR804 8.0
MR804
8.0
uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9
123456789001


urn:schemas-upnp-org:service:Layer3Forwarding:1
urn:upnp-org:serviceId:L3Forwarding1
/l3f
/l3f
/l3f.xml




urn:schemas-upnp-org:device:WANDevice:1
WAN Device
Mercury
http://www.mercurycom.com.cn
WAN Device
WAN Device
1

12345678900001
uuid:80104052-1dd2-11b2-a699-e6838914e4d9
123456789001


urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
urn:upnp-org:serviceId:WANCommonInterfaceConfig
/ifc
/ifc
/ifc.xml




urn:schemas-upnp-org:device:WANConnectionDevice:1
WAN Connection Device
Mercury
http://www.mercurycom.com.cn
WAN Connection Device
WAN Connection Device
1

12345678900001
uuid:8c99e7b0-1dd2-11b2-8291-e6838914e4d9
123456789001


urn:schemas-upnp-org:service:WANIPConnection:1
urn:upnp-org:serviceId:WANIPConnection
/ipc
/ipc
/ipc.xml







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

的控制路径:/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


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"




113.119.126.148

 

解析得到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


5500TCP

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"




80192.168.1.831JUAN UPNP0

如上所示:外部端口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:Client
UPnPError


402
Invalid ExternalPort




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

否则做端口映射

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


5500TCP80192.168.1.831JUAN UPNP0

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"





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

你可能感兴趣的:(通用工具)