UPnPã®NATè¶ãã«ã¤ãã¦èª¿ã¹ã¦ã¿ã
ã¯ããã«
P2Pã¢ããªã±ã¼ã·ã§ã³ãä½ããï¼ã¨æãç«ã£ãã®ã§P2Pã«ã¤ãã¦èª¿ã¹ã¦ãã¾ãããããã¨ãNAT(ã¾ãã¯NAPT)è¶ããããªãã¨P2Péä¿¡ãåºæ¥ãªãããããããã¾ãããï¼ï¼
ã¨ãããã¨ã§ãä»åº¦ã¯NATè¶ãã«ã¤ãã¦èª¿ã¹ã¦ã¿ãã¨UPnPãSTUNãUDP Hole Punchingã¨ããæ¹æ³ãããããã§ããããªã®ã§ãä»åã¯UPnPã®NATè¶ãã«ã¤ãã¦èª¿ã¹ã¦ã¿ã¾ãããUPnPã«ã¤ãã¦ã¯ä»¥ä¸ã®ãã¼ã¸ãåèã«ãã¾ããã
UPnPとポートマッピング(GARAさんのページ)
作業メモ -upnpデバイスの取得-
UPnPを利用してグローバルIPを取得する - 2 | ::Hikaru's blog
ãããã¯ã¼ã¯ç°å¢(èªå® )
NTTからレンタルしているモデムãUPnPã«å¯¾å¿ãã¦ããã®ã§ãå¤é¨ããèªå®
ã®PCã«ã¢ã¯ã»ã¹ã§ãã(NATè¶ããã§ãã)ããã«ãã¦ã¿ã¾ãããèªå®
ã®ãããã¯ã¼ã¯ç°å¢ãå³ã§è¡¨ãã¨ã以ä¸ã®ãããªæãã§ãã

UPnPå¯¾å¿æ©å¨ãæ¢ãåºã
ã¾ãã¯ãèªå® LANå ã®UPnPå¯¾å¿æ©å¨(ä¸ã®å³ã®ã¢ãã )ãæ¢ãåºãã¾ãã以ä¸ã®M-SEARCHã¡ãã»ã¼ã¸ããã«ããã£ã¹ããã¦UPnPå¯¾å¿æ©å¨ããã®ã¬ã¹ãã³ã¹ã調ã¹ã¾ãã
M-SEARCH * HTTP/1.1 MX: 3 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" ST: upnp:rootdevice
ãã®M-SEARCHã¡ãã»ã¼ã¸ããã«ããã£ã¹ãããPythonã¹ã¯ãªãããæ¸ãã¾ããã以ä¸ã®ã³ã¼ããsearchRootDevice.pyã¨ããååã§ä¿åãã¾ãã
#!/usr/bin/env python #-*- coding:utf-8 -*- import socket M_SEARCH = 'M-SEARCH * HTTP/1.1\r\n' M_SEARCH += 'MX: 3\r\n' M_SEARCH += 'HOST: 239.255.255.250:1900\r\n' M_SEARCH += 'MAN: "ssdp:discover"\r\n' M_SEARCH += 'ST: upnp:rootdevice\r\n' M_SEARCH += '\r\n' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.settimeout(5) # 5ç§ã§ã¿ã¤ã ã¢ã¦ã s.bind(('', 1900)) # M-SEARCHããã«ããã£ã¹ããã s.sendto(M_SEARCH, ('239.255.255.250', 1900)) while True: try: response, address = s.recvfrom(8192) print 'from', address print response print '=' * 40 except socket.timeout, e: # ã¿ã¤ã ã¢ã¦ãããã¨ãã®å¦ç print e break s.close()
ãã®ã¹ã¯ãªãããå®è¡ããã¨ä»¥ä¸ã®ãããªçµæã«ãªãã¾ããã
% ./searcheRootDevice.py
from ('192.168.1.1', 1900)
HTTP/1.1 200 OK
Ext:
Date: WED, 22 JAN 2070 04:40:41 GMT
ST: upnp:rootdevice
USN: uuid:53563300-0101-0000-000ba233dcd7::upnp:rootdevice
Location: http://192.168.1.1:2869/DeviceDescription.xml â ãã大äºï¼
Cache-Control: max-age=600
Server: VxWorks/5.4.2 UPnP/1.0 UPnP-Device-Host/1.0
Content-Length: 0
========================================
timed outåãã¡ãã»ã¼ã¸ãç¹°ãè¿ã表示ãããã¨ããããã¾ããããã®çµæã§æ³¨ç®ããã®ã¯Locationã®å¤ã§ããããã«ã¯ããã¤ã¹æ å ±ãåå¾ããããã«ã¢ã¯ã»ã¹ããURLãæ¸ããã¦ãã¾ãããªã®ã§ãå®éã«ãã®URLã«ã¢ã¯ã»ã¹ãã¦ã¿ã¾ãã
% wget http://192.168.1.1:2869/DeviceDescription.xml
--23:28:17-- http://192.168.1.1:2869/DeviceDescription.xml
=> `DeviceDescription.xml'
Connecting to 192.168.1.1:2869... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5,056 (4.9K) [text/xml]
100%[==================================================>] 5,056 --.--K/s
23:28:17 (161.25 KB/s) - `DeviceDescription.xml' saved [5056/5056]ãã®ãã¡ã¤ã«(DeviceDescription.xml)ã®å 容ã¯ä»¥ä¸ã®ã¨ããã§ãã
<?xml version="1.0"?> <root xmlns="urn:schemas-upnp-org:device-1-0"> <specVersion> <major>1</major> <minor>0</minor> </specVersion> <URLBase>http://192.168.1.1:2869/</URLBase> <device> <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> <friendlyName>ADSL Modem-SV3</friendlyName> <manufacturer>NTTEAST/NTTWEST</manufacturer> <manufacturerURL></manufacturerURL> <modelDescription>ADSL Broadband Router with VoIP function</modelDescription> <modelName>ADSL Modem-SV3</modelName> <modelNumber></modelNumber> <modelURL></modelURL> <serialNumber></serialNumber> <UDN>uuid:53563300-0101-0000-000ba233dcd7</UDN> <UPC></UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType> <serviceId>urn:upnp-org:serviceId:Layer3Forwarding1</serviceId> <SCPDURL>/Layer3Forwarding.xml</SCPDURL> <controlURL>/UD/?0</controlURL> <eventSubURL>/?0</eventSubURL> </service> <service> <serviceType>urn:schemas-microsoft-com:service:OSInfo:1</serviceType> <serviceId>urn:microsoft-com:serviceId:OSInfo1</serviceId> <SCPDURL>/OSInfo.xml</SCPDURL> <controlURL>/UD/?1</controlURL> <eventSubURL>/?1</eventSubURL> </service> </serviceList> <deviceList> <device> <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> <friendlyName>WANDevice1</friendlyName> <manufacturer>NTTEAST/NTTWEST</manufacturer> <manufacturerURL></manufacturerURL> <modelDescription>ADSL Broadband Router with VoIP function</modelDescription> <modelName>ADSL Modem-SV3</modelName> <modelNumber></modelNumber> <modelURL></modelURL> <serialNumber></serialNumber> <UDN>uuid:53563300-0201-0000-000ba233dcd7</UDN> <UPC></UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId> <SCPDURL>/WANCommonInterfaceConfig.xml</SCPDURL> <controlURL>/UD/?2</controlURL> <eventSubURL>/?2</eventSubURL> </service> </serviceList> <deviceList> <device> <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> <friendlyName>WANConnectionDevice1</friendlyName> <manufacturer>NTTEAST/NTTWEST</manufacturer> <manufacturerURL></manufacturerURL> <modelDescription>ADSL Broadband Router with VoIP function</modelDescription> <modelName>ADSL Modem-SV3</modelName> <modelNumber></modelNumber> <modelURL></modelURL> <serialNumber></serialNumber> <UDN>uuid:53563300-0301-0000-000ba233dcd7</UDN> <UPC></UPC> <serviceList> <service> <serviceType>urn:schemas-upnp-org:service:WANDSLLinkConfig:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANDSLLinkC1</serviceId> <SCPDURL>/WANDSLLinkConfig.xml</SCPDURL> <controlURL>/UD/?4</controlURL> <eventSubURL>/?4</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?6</controlURL> <eventSubURL>/?6</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn2</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?7</controlURL> <eventSubURL>/?7</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn3</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?8</controlURL> <eventSubURL>/?8</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn4</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?9</controlURL> <eventSubURL>/?9</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn5</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?10</controlURL> <eventSubURL>/?10</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn6</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?11</controlURL> <eventSubURL>/?11</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn7</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?12</controlURL> <eventSubURL>/?12</eventSubURL> </service> <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn8</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?13</controlURL> <eventSubURL>/?13</eventSubURL> </service> </serviceList> </device> </deviceList> </device> </deviceList> <presentationURL>http://192.168.1.1/</presentationURL> </device> </root>
ãã®ãã¡ã¤ã«ã®ä¸ã§å¤§äºãªã®ã¯ä»¥ä¸ã®é¨åã§ãã
<?xml version="1.0"?> <root xmlns="urn:schemas-upnp-org:device-1-0"> <specVersion> <major>1</major> <minor>0</minor> </specVersion> <URLBase>http://192.168.1.1:2869/</URLBase> â ããã大äºï¼ <device> <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> ãããããçç¥ <service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId> <SCPDURL>/WANPPPConnection.xml</SCPDURL> <controlURL>/UD/?6</controlURL> â ããã大äºï¼ <eventSubURL>/?6</eventSubURL> </service> <service>
ä¸è¨ã®URLBaseã¨controlURLã®å¤ãç¨ãã¦WANå´ã®IPã¢ãã¬ã¹ã®åå¾ããã¼ããããã³ã°ã®è¨å®ã»åé¤ãªã©ãè¡ã£ã¦ããã¾ãã
WANå´ã®IPã¢ãã¬ã¹ã®åå¾
ä¸è¨ã®æ¹æ³ã§controlURLãåããã°ã以ä¸ã®ãããªSOAPã¢ã¯ã·ã§ã³ãUPnPå¯¾å¿æ©å¨ã«éä¿¡ãããã¨ã§WANå´ã®IPã¢ãã¬ã¹(ã°ãã¼ãã«)ãåå¾ã§ãã¾ãã
POST /UD/?6 HTTP/1.1 HOST: 192.168.1.1:2869 CONTENT-LENGTH: 294 CONTENT-TYPE: text/xml; charset="utf-8" SOAPACTION: "urn:schemas-upnp-org:service:WANPPPConnection:1#GetExternalIPAddress" <?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:WANPPPConnection:1"> </u:GetExternalIPAddress> </s:Body> </s:Envelope>
SOAPã¢ã¯ã·ã§ã³ã¯telnetã³ãã³ãã§192.168.1.1:2869ã«éä¿¡ã§ãã¾ãããã¨ããããPythonã¹ã¯ãªãããæ¸ãã¦ã¿ã¾ããã以ä¸ã®ã³ã¼ããgetExternalIPAddress.pyã¨ããååã§ä¿åãã¾ãã
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2 HOST = '192.168.1.1' PORT = 2869 CONTROL = '/UD/?6' URL = 'http://' + HOST + ':' + str(PORT) + CONTROL SOAP = '<?xml version="1.0"?>\r\n' SOAP += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\r\n' SOAP += '<s:Body>\r\n' SOAP += '<u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">\r\n' SOAP += '</u:GetExternalIPAddress>\r\n' SOAP += '</s:Body>\r\n' SOAP += '</s:Envelope>\r\n' req = urllib2.Request(URL) req.add_header('Content-Type', 'text/xml; charset="utf-8"') req.add_header('SOAPACTION', '"urn:schemas-upnp-org:service:WANPPPConnection:1#GetExternalIPAddress"') req.add_data(SOAP) res = urllib2.urlopen(req) print res.read()
ãã®ã¹ã¯ãªãããå®è¡ããã¨ä»¥ä¸ã®ãããªçµæã«ãªãã¾ããã
% ./getExternalIPAddress.py <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewExternalIPAddress>XXX.XXX.XXX.XXX</NewExternalIPAddress> â ãã大äºï¼ </u:GetExternalIPAddressResponse> </s:Body> </s:Envelope>
WANå´ã®IPã¢ãã¬ã¹ãè¨è¿°ããã¦ããé¨åã¯é ãã¦ãã¾ãããã¡ããã¨åå¾ãããã¨ãã§ãã¾ããã念ã®ãããã¬ã³ã¿ã«ãã¦ããã¢ãã ã«Webãã©ã¦ã¶ã¼ããã¢ã¯ã»ã¹ãã¦WANå´ã®IPã¢ãã¬ã¹(ã¢ãã ã§ã¯ADSLã¢ãã¬ã¹ã¨ãã表ç¾ããã¦ã)ãè¦ã¦ã¿ãã¨ãSOAPã¢ã¯ã·ã§ã³ã§åå¾ããã¢ãã¬ã¹ã¨ä¸è´ãã¦ãã¾ããã
ç¾å¨ã®ãã¼ããããã³ã°æ å ±ã®åå¾
WANå´ã®IPã¢ãã¬ã¹åå¾ã¨åæ§ã«ã以ä¸ã®SOAPã¢ã¯ã·ã§ã³ãéä¿¡ãããã¨ã§ç¾å¨ã®ãã¼ããããã³ã°æ å ±ãåå¾ã§ãã¾ãã
POST /UD/?6 HTTP/1.1 HOST: 192.168.1.1:2869 CONTENT-LENGTH: 353 CONTENT-TYPE: text/xml; charset="utf-8" SOAPACTION: "urn:schemas-upnp-org:service:WANPPPConnection:1#GetGenericPortMappingEntry" <?xml version="1.0"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <m:GetGenericPortMappingEntry xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewPortMappingIndex>0</NewPortMappingIndex> â ããã大äºï¼ </m:GetGenericPortMappingEntry> </s:Body> </s:Envelope>
ãã®SOAPã¢ã¯ã·ã§ã³ã®NewPortMappingIndexã®å¤ã0ããé ã«å¤åããããã¨ã§ãã¼ããããã³ã°ã®æ å ±ãåå¾ã§ãã¾ãããããNewPortMappingIndexã®å¤ãç»é²ããã¦ãããã¼ããããã³ã°ã®æ°ãã大ããã¨HTTPã¹ãã¼ã¿ã¹ã³ã¼ã 500ãè¿ãããã§ãã以ä¸ã®ã³ã¼ããgetGenericPortMappingEntry.pyã¨ããååã§ä¿åãã¾ãã
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2 HOST = '192.168.1.1' PORT = 2869 CONTROL = '/UD/?6' URL = 'http://' + HOST + ':' + str(PORT) + CONTROL ID = 0 while True: SOAP = '<?xml version="1.0"?>\r\n' SOAP += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\r\n' SOAP += '<s:Body>\r\n' SOAP += '<m:GetGenericPortMappingEntry xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1">\r\n' SOAP += '<NewPortMappingIndex>' + str(ID) + '</NewPortMappingIndex>\r\n' SOAP += '</m:GetGenericPortMappingEntry>\r\n' SOAP += '</s:Body>\r\n' SOAP += '</s:Envelope>\r\n' req = urllib2.Request(URL) req.add_header('Content-Type', 'text/xml; charset="utf-8"') req.add_header('SOAPACTION', '"urn:schemas-upnp-org:service:WANPPPConnection:1#GetGenericPortMappingEntry"') req.add_data(SOAP) try: res = urllib2.urlopen(req) print res.read() except urllib2.HTTPError, e: if e.code != 500: print e.code print e.msg break print '=' * 40 ID += 1
ãã®ã¹ã¯ãªãããå®è¡ããã¨ä»¥ä¸ã®ãããªçµæã«ãªãã¾ããã
% ./getGenericPortMappingEntry.py <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:GetGenericPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewRemoteHost></NewRemoteHost> <NewExternalPort>80</NewExternalPort> <NewProtocol>TCP</NewProtocol> <NewInternalPort>80</NewInternalPort> <NewInternalClient></NewInternalClient> <NewEnabled>0</NewEnabled> <NewPortMappingDescription>Webãµã¼ã (HTTP)</NewPortMappingDescription> <NewLeaseDuration>0</NewLeaseDuration> </u:GetGenericPortMappingEntryResponse> </s:Body> </s:Envelope> ========================================
ç§ã¯ä½ãè¨å®ãã¦ãã¾ããã§ããããå§ããã80çªãã¼ãã«å¯¾ãã¦ä½ããã®è»¢éè¨å®ãããã¦ãã¾ãããããã§ãå
ã»ã©ã®getExternalIPAddress.pyã§åå¾ããWANå´ã®IPã¢ãã¬ã¹ã«Webãã©ã¦ã¶ã¼ããã¢ã¯ã»ã¹ããã¨ãhttp://192.168.1.1ã¨åãç»é¢(ã¢ãã ã®è¨å®ç»é¢)ã表示ããããã¨ããããã¾ããããªã®ã§ãæ¢ã«ç»é²ããã転éè¨å®ã¯WANå´ã®IPã¢ãã¬ã¹ããã§ãã¢ãã ã®è¨å®ãè¡ããããã«ããããã ã¨æãã¾ãã
ãã¼ããããã³ã°ã®è¨å®ãè¡ã
以ä¸ã®SOAPã¢ã¯ã·ã§ã³ãéä¿¡ãã¦ãã¢ãã ã®9090çªãã¼ãã«ããã¢ã¯ã»ã¹ãèªå® PC(192.168.1.3)ã®9090çªãã¼ãã«è»¢éããããã«è¨å®ãã¾ãã
POST /UD/?6 HTTP/1.1 Host: 192.168.1.1:2869 Content-Length: 671 Content-Type: text/xml; charset="utf-8" Connection: Close SOAPACTION: "urn:schemas-upnp-org:service:WANPPPConnection:1#AddPortMapping" <?xml version="1.0"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <m:AddPortMapping xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewRemoteHost></NewRemoteHost> <NewExternalPort>9090</NewExternalPort> <NewProtocol>TCP</NewProtocol> <NewInternalPort>9090</NewInternalPort> <NewInternalClient>192.168.1.3</NewInternalClient> <NewEnabled>1</NewEnabled> <NewPortMappingDescription>Test</NewPortMappingDescription> <NewLeaseDuration>0</NewLeaseDuration> </m:AddPortMapping> </s:Body> </s:Envelope>
ãããPythonã¹ã¯ãªããã§è¡ãããã«ã以ä¸ã®ã³ã¼ããaddPortMapping.pyã¨ããååã§ä¿åãã¾ãã
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2 HOST = '192.168.1.1' PORT = 2869 CONTROL = '/UD/?6' URL = 'http://' + HOST + ':' + str(PORT) + CONTROL NEW_EXTERNAL_PORT = 9090 # WANå´ã®ãã¼ãçªå· NEW_INTERNAL_PORT = 9090 # 転éå ãã¹ãã®ãã¼ãçªå· NEW_INTERNAL_CLIENT = '192.168.1.3' # 転éå ãã¹ãã®IPã¢ãã¬ã¹ NEW_PROTOCOL = 'TCP' LEASE_DURATION = '0' # è¨å®ã®æå¹æé(ç§)ã0ã®ã¨ãã¯ç¡æé DESCRIPTION = 'test' SOAP = '<?xml version="1.0"?>\r\n' SOAP += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\r\n' SOAP += '<s:Body>\r\n' SOAP += '<m:AddPortMapping xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1">\r\n' SOAP += '<NewRemoteHost></NewRemoteHost>\r\n' SOAP += '<NewExternalPort>' + str(NEW_EXTERNAL_PORT) + '</NewExternalPort>\r\n' SOAP += '<NewProtocol>' + NEW_PROTOCOL + '</NewProtocol>\r\n' SOAP += '<NewInternalPort>' + str(NEW_INTERNAL_PORT) + '</NewInternalPort>\r\n' SOAP += '<NewInternalClient>' + NEW_INTERNAL_CLIENT + '</NewInternalClient>\r\n' SOAP += '<NewEnabled>1</NewEnabled>\r\n' SOAP += '<NewPortMappingDescription>' + DESCRIPTION + '</NewPortMappingDescription>\r\n' SOAP += '<NewLeaseDuration>' + LEASE_DURATION + '</NewLeaseDuration>\r\n' SOAP += '</m:AddPortMapping>\r\n' SOAP += '</s:Body>\r\n' SOAP += '</s:Envelope>\r\n' req = urllib2.Request(URL) req.add_header('Content-Type', 'text/xml; charset="utf-8"') req.add_header('SOAPACTION', '"urn:schemas-upnp-org:service:WANPPPConnection:1#AddPortMapping"') req.add_data(SOAP) try: res = urllib2.urlopen(req) print res.read() except urllib2.HTTPError, e: print e.code print e.msg
ãã®ã¹ã¯ãªãããå®è¡ããã¨ã以ä¸ã®ãããªçµæã«ãªãã¾ããã
% ./addPortMapping.py <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> </u:AddPortMappingResponse> </s:Body> </s:Envelope>
ç¹ã«ã¨ã©ã¼ããããã®ãåºåããã¦ããªãã®ã§ã9090çªãã¼ãã«å¯¾ããè¨å®ãè¡ãããã¨æãã¾ããæ¬å½ã«è¨å®ã§ããã®ããgetGenericPortMappingEntry.pyãå®è¡ãã¦ç¢ºèªãã¦ã¿ã¾ãã
% ./getGenericPortMappingEntry.py <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:GetGenericPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewRemoteHost></NewRemoteHost> <NewExternalPort>9090</NewExternalPort> <NewProtocol>TCP</NewProtocol> <NewInternalPort>9090</NewInternalPort> <NewInternalClient>192.168.1.3</NewInternalClient> <NewEnabled>1</NewEnabled> <NewPortMappingDescription>test</NewPortMappingDescription> <NewLeaseDuration>0</NewLeaseDuration> </u:GetGenericPortMappingEntryResponse> </s:Body> </s:Envelope> ======================================== <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:GetGenericPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewRemoteHost></NewRemoteHost> <NewExternalPort>80</NewExternalPort> <NewProtocol>TCP</NewProtocol> <NewInternalPort>80</NewInternalPort> <NewInternalClient></NewInternalClient> <NewEnabled>0</NewEnabled> <NewPortMappingDescription>Webãµã¼ã (HTTP)</NewPortMappingDescription> <NewLeaseDuration>0</NewLeaseDuration> </u:GetGenericPortMappingEntryResponse> </s:Body> </s:Envelope> ========================================
ãã®å®è¡çµæãããæ°ãã«9090çªãã¼ãã¸ã®è»¢éè¨å®ã追å ããã¦ãããã¨ãåããã¾ããã¾ããå®éã«èªå®
PCä¸ã§echoãµã¼ãã¼ãç«ã¡ä¸ã(192.168.1.3:9090)ãå¤é¨ã®ãããã¯ã¼ã¯ããWANå´ã®IPã¢ãã¬ã¹:9090ã«telnetã§ã¢ã¯ã»ã¹ããã¨ãNATè¶ãããã¦echoãµã¼ãã¼ã¨éä¿¡ãããã¨ãã§ãã¾ããï¼
ãã¼ããããã³ã°ã®è¨å®ãåé¤ãã
以ä¸ã®SOAPã¢ã¯ã·ã§ã³ãéä¿¡ãã¦ãå ã»ã©è¿½å ãã9090çªãã¼ãã¸ã®è»¢éè¨å®ãåé¤ãããã¨ãã§ãã¾ãã
POST /UD/?6 HTTP/1.1 Host: 192.168.1.1:2869 Content-Length: 424 Content-Type: text/xml; charset="utf-8" Connection: Close SOAPACTION: "urn:schemas-upnp-org:service:WANPPPConnection:1#DeletePortMapping" <?xml version="1.0"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <m:DeletePortMapping xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewRemoteHost></NewRemoteHost> <NewExternalPort>9090</NewExternalPort> <NewProtocol>TCP</NewProtocol> </m:DeletePortMapping> </s:Body> </s:Envelope>
ãããPythonã¹ã¯ãªããã§è¡ãããã«ã以ä¸ã®ã³ã¼ããdeletePortMapping.pyã¨ããååã§ä¿åãã¾ããã
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2 HOST = '192.168.1.1' PORT = 2869 CONTROL = '/UD/?6' URL = 'http://' + HOST + ':' + str(PORT) + CONTROL NEW_EXTERNAL_PORT = 9090 NEW_PROTOCOL = 'TCP' SOAP = '<?xml version="1.0"?>\r\n' SOAP += '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\r\n' SOAP += '<s:Body>\r\n' SOAP += '<m:DeletePortMapping xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1">\r\n' SOAP += '<NewRemoteHost></NewRemoteHost>\r\n' SOAP += '<NewExternalPort>' + str(NEW_EXTERNAL_PORT) + '</NewExternalPort>\r\n' SOAP += '<NewProtocol>' + NEW_PROTOCOL + '</NewProtocol>\r\n' SOAP += '</m:DeletePortMapping>\r\n' SOAP += '</s:Body>\r\n' SOAP += '</s:Envelope>\r\n' req = urllib2.Request(URL) req.add_header('Content-Type', 'text/xml; charset="utf-8"') req.add_header('SOAPACTION', '"urn:schemas-upnp-org:service:WANPPPConnection:1#DeletePortMapping"') req.add_data(SOAP) try: res = urllib2.urlopen(req) print res.read() except urllib2.HTTPError, e: print e.code print e.msg
ãã®ã¹ã¯ãªãããå®è¡ããã¨ã以ä¸ã®ãããªçµæã«ãªãã¾ããã
% ./deletePortMapping.py <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:DeletePortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> </u:DeletePortMappingResponse> </s:Body> </s:Envelope>
ç¹ã«ã¨ã©ã¼ããããã®ãåºåãããã¦ããªãã®ã§ã9090çªãã¼ãã¸ã®è»¢éè¨å®ã¯åé¤ãããã¯ãã§ãããã®å¾ã®getGenericPortMappingEntry.pyã®å®è¡çµæã¯å²æãã¾ãããå®éã«å¤é¨ããWANå´ã®IPã¢ãã¬ã¹:9090ã¸ã®éä¿¡ã¯ã§ããªããªã£ã¦ãã¾ããã
WANå´ã®IPã¢ãã¬ã¹ããã©ã¤ãã¼ãã ã£ãå ´å
å¤åã2éã«ã¼ãã£ã³ã°ã«ãªã£ã¦ãã¨æãã¾ããç§ã®èªå®
ããå§ãã¯2éã«ã¼ãã£ã³ã°ã«ãªã£ã¦ããã®ã§getExternalIPAddress.pyãå®è¡ããã¨WANå´ã®IPã¢ãã¬ã¹ã192.168.1.2ã¨ãããã©ã¤ãã¼ãã¢ãã¬ã¹ã«ãªã£ã¦ãã¾ãããåå ã¯ãã¢ãã ã¨PCã®éã«ããç¡ç·LANã«ã¼ã¿ã¼ãã«ã¼ãã£ã³ã°ã¢ã¼ãã«è¨å®ããã¦ããããã§ããããªã®ã§ãWebãã©ã¦ã¶ã¼ããç¡ç·LANã«ã¼ã¿ã¼ã®è¨å®ãããªãã¸ã¢ã¼ãã«å¤æãããã¨ã§è§£æ±ºã§ãã¾ããã
ãããã«
ã¨ãããããç§ã®èªå®
ã«ããã¦ã¯UPnPã§NATè¶ããè¡ããã¨ãåºæ¥ã¾ãããä»ã®ç°å¢ã§ã¯è©¦ãã¦ããªãã®ã§ãä¸ã®ã¹ã¯ãªãããã¡ããã¨åããã©ãããããã¾ããããããããã
ãã®èª¿åã§ã次ã¯STUNãUDP Hole Punchingã«ã¤ãã¦èª¿ã¹ã¦ã¿ããã¨æãã¾ãã