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;

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!