SOHOルータの外部接続を切断(Net::UPnP::ControlPointを利用)
最近は、NATを利用したSOHOルータを使ってイントラネットを構築する事が一般的になってきました。 それらのSOHOルータの多くは、UPnP機能を有しています。 UPnPを利用すると、SOHOルータの情報を取得したり、設定を行ったりできます。
ここでは、PPPを使って接続しているSOHOルータの外部側ネットワークを切断してしまう方法を説明したいと思います。 ここで紹介しているサンプルコードを実行すると、SOHOルータとISPとのPPP接続が切断されてしまうのでご注意下さい。 PPP接続が切断されてしまうとインターネットとの通信ができなくなります。
SOHOルータの外部接続を復活させるには、SOHOルータの管理用ページや管理用アプリケーションで再度PPP接続を確立して下さい。 SOHOルータをリセットしても外部接続が復活できるかも知れません。 ルータを復活させる方法に自信が無い人はこのサンプルを実行しない事をお勧め致します。
SOHOルータ外部接続切断サンプル
SOHOルータのPPP接続を切断するサンプルです。 このForceTermination ActionはUPnP IGDの規格書にはよるとRequiredなので、恐らくほとんどのSOHOルータに実装されていると思われます。 パスワードなどの認証なしでこんな事できてもいいのか?とは思いますが。。。
#!/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";
# 切断命令を送信
$resp = $serv->postaction("ForceTermination");
if ($resp->getstatuscode() != 200) {
next;
}
# HTTP Status Codeが200ならActionは成功
print "ForceTermination action success\n";
}
exit;