SOHOルータのExternal IPアドレスを取得(Net::UPnP::ControlPointを利用)
最近は、NATを利用したSOHOルータを使ってイントラネットを構築する事が一般的になってきました。 それらのSOHOルータの多くは、UPnP機能を有しています。 UPnPを利用すると、SOHOルータの情報を取得したり、設定を行ったりできます。
ここでは、PPPを使って接続しているSOHOルータの外部側ネットワークインターフェースに割り当てられているIPアドレスを取得する方法を説明したいと思います。
IPアドレス取得サンプル
SOHOルータがPPPで取得した外部アドレス(一般的にはグローバルIPアドレス)を、UPnPを使ってイントラネット側(家庭側)から取得する方法です。
#!/usr/bin/perl
use Net::UPnP::ControlPoint;
$upnp = Net::UPnP::ControlPoint->new();
# UPnP deviceを検索
@devs = $upnp->search(st => 'upnp:rootdevice', mx => 3);
$n = 0;
foreach $dev (@devs) {
print $n;
print "\n";
$n++;
$type = $dev->getdevicetype();
if ($type ne 'urn:schemas-upnp-org:device:InternetGatewayDevice:1') {
next;
}
$serv = $dev->getservicebyname(
'urn:schemas-upnp-org:service:WANPPPConnection:1');
unless ($serv) {
next;
}
# デバイスの通名を表示
print $dev->getfriendlyname();
print "\n";
# 外部IPアドレス取得サービスを指定
$resp = $serv->postaction("GetExternalIPAddress");
if ($resp->getstatuscode() != 200) {
next;
}
# 結果を取得
$args = $resp->getargumentlist();
# 外部IPアドレスを表示
print $args->{'NewExternalIPAddress'};
}
exit;