おのたく日記 YouTubeも始めました→
2009-06-17(Wed) ルータから外側のアドレスを取得する [長年日記]
■ ルータから外側のアドレスを取得する
以前つかっていたNEC atermの時にはADSLモデム Aterm WD735GV の WAN 側 IP アドレスを取得する方法に書いてある
#!/usr/bin/perl
use SOAP::Lite;
my $soap = SOAP::Lite
->ns('urn:schemas-upnp-org:service:WANPPPConnection:1')
->proxy('http://te4100:2869/upnp/control/WANPPPConn1');
my $som = $soap->GetExternalIPAddress();
my $ip = $som->valueof('//GetExternalIPAddressResponse/NewExternalIPAddress');
print "$ip\n";
で取得できていたけど、最近利用しているFujitsu FA11-W5では、これでは動かなかった。
UPnPのサービス名がちがっているのかもしれないと思って、探してみることにした。
まず、ルータのUPuPを見つけるために「 適当なスクリプト集」のssdp:discoverの改良版を利用してルータのアクセスURLを見つけた
$ UPnPls.pl
M-SEARCH * HTTP/1.1
Host:239.255.255.250:1900
Man:"ssdp:discover"
ST:upnp:rootdevice
MX:3
------------------------------
HTTP/1.1 200 OK
Server: Unknown/0.0 UPnP/1.0 Web Server
EXT:
LOCATION: http://192.168.0.1:80/InternetGatewayDevice.xml
CACHE-CONTROL: max-age = 1830
ST: upnp:rootdevice
USN: uuid:69ab1a4c-ea86-b043-5396-19384cb7aebf::upnp:rootdevice
==============================
------------------------------
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=60
EXT:
LOCATION: http://192.168.0.20:51001/MediaServerGen.xml
SERVER: MontaVista Linux/2.1 UPnP/1.0 SONY NSC SDK (UPnP Core)/1.3.4
ST: upnp:rootdevice
USN: uuid:68ea2c50-9bf1-129d-2813-123456789012::upnp:rootdevice
X-AV-Server-Info: av = 2.0 ; cn = "Sony Corporation" ; mn = "CSV-E77" ; mv = "1.0.0" ;
X-AV-Physical-Unit-Info: pa = "CoCoon Channel Server CSV-E77" ; pl = b13D2b9OuENPWd5ZufaWgVadfadyVIEeitVFtNec= ;
==============================
CoCoonも見つかっているけど、ルータはInternetGatewayDevice.xmlでルートデバイスのDevice description情報がとれることが分かった。
つぎに、そのURLにアクセスすると
<service>
<serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType>
<serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId>
<SCPDURL>WANPPPConnection.xml</SCPDURL>
<controlURL>/EmWeb/UPnP/Control/4</controlURL>
<eventSubURL>/EmWeb/UPnP/Eventing/4</eventSubURL>
</service>
[http://FA11-W5/InternetGatewayDevice.xmlより引用]
となっていて、controlURLが分かった。そこで
*** atermGrobalIP 2007-09-25 13:46:41.000000000 +0900
--- fw11-w5-GrolbalIP 2009-06-17 14:09:00.000000000 +0900
***************
*** 2,8 ****
use SOAP::Lite;
my $soap = SOAP::Lite
->ns('urn:schemas-upnp-org:service:WANPPPConnection:1')
! ->proxy('http://te4100:2869/upnp/control/WANPPPConn1');
my $som = $soap->GetExternalIPAddress();
my $ip = $som->valueof('//GetExternalIPAddressResponse/NewExternalIPAddress');
print "$ip\n";
--- 2,8 ----
use SOAP::Lite;
my $soap = SOAP::Lite
->ns('urn:schemas-upnp-org:service:WANPPPConnection:1')
! ->proxy('http://te4100/EmWeb/UPnP/Control/4');
my $som = $soap->GetExternalIPAddress();
my $ip = $som->valueof('//GetExternalIPAddressResponse/NewExternalIPAddress');
print "$ip\n";
とproxyの所を微妙に変えれば良いみたい。念のために
<action>
<name>GetExternalIPAddress</name>
−<argumentList>
[http://FW11-W5/WANPPPConnection.xmlより引用]
で、同じサービスが有ることを確認して、実行した見たら見事外側のIPアドレスを取得できた。
参考: 「UPnPを利用してグローバルIPを取得する - 2」 UPnPでのグローバルIPを取る仕組みについて解説
|