TOPへ
起票 2005.2.27/更新 2005.2.27
 目次へ  
   


Telnetのためのモジュール

 NetTelnet

 

 


Net-Telnetというモジュールでサーバーからtelnetを自動で使います。
目的はルーターの設定を時間で変えたかったからです。読んでいただければわかるでしょう。ではどうぞ。



時間によってInterNetに制限をかけるぞ

あまり必要ないかもしれませんが、ある時間帯だけアクセス制限をかけたい場合があります。
例えばMSのプロキシサーバーでは時間帯別の制限が細かく設定出来たのですが、同じことをルーターで実施するにはどうすれば良いのでしょうか?
他のルーターではどうなのか、わかりませんが、YAMAHA RTAはTELNETで設定が変えられるのがもっとも優れている機能。
(私は、ルーターの設定をする時に、あらかじめマクロ用configを作っておいて、TeraTermのマクロを使って一気に登録してしまいます)

せっかくだからcron と perl制御のTELNETコマンドで自動にconfigを変更することにします。

1、最初にルーターに新しくフィルタを作ります。
  ブラウザから、下記の用に、LANに対してフィルタを作ります。
  この例では 10 番のフィルタに 10.0.0.160〜10.0.0.240 の範囲のクライアントから発する 80番portのパケットを rejectするというものです。
  サーバーアドレスは当然、外しておきます。
  WEBだけを止めるために 80 portとしています。メールなどは影響されませんね。


  この状態でフィルタにチェックを入れません。

2、perlで使うNetTelnetモジュールの準備

use Net::Telnet; というモジュールを使います。圧縮ファイルは
Net-Telnet-3.01.tar.gz
です。ファイルは CPANにあるとのこと
http://www.perl.com/CPAN/
の窓口から
http://www.perl.com/CPAN/modules/by-module/Net/
まで降りてファイルをダウンロードします。

tar xvzf Net-Telnet-3.01.tar.gz
で解凍してから
cd Net-Telnet
に入ってから
perl Makefile.PL
make
make test
make install

これで、使える様になります。簡単です。

3、スクリプト

#! /usr/bin/perl

use Net::Telnet;

my($lines,$t,$pass,$adminpass,$rthost);
$rthost = '10.0.0.1'; <----ルーターアドレス
$pass = 'ログインパスワード';
$adminpass = 'アドミニのパスワード';

$tel = new Net::Telnet (-host => "$rthost");

select(undef,undef,undef,2); <---2秒待つ
$tel->waitfor('/Password:.*/');
$tel->print("$pass");
$tel->waitfor('/>.*$/');
$tel->print("administrator");
$tel->waitfor('/Password:.*$/');
$tel->print("$adminpass");
$tel->waitfor('/#.*$/');
$tel->print('ip lan1 secure filter in 100000 100001 100002 100003 100004 100005
  100006 100007 100008 100009 100010 100099');
$tel->print('save');
select(undef,undef,undef,0.5);
$tel->print('exit');
select(undef,undef,undef,0.5);
$tel->print('exit');
select(undef,undef,undef,0.5);
$tel->close;
exit;
これを実行するとフィルタが有効になります。
あ、あらかじめ実行権限をchmodで付けておいてくださいね。
そして、cronに登録して実施するとある時間になると100010 の新設したフィルタが作動します。
また、フィルタを無効にしたい場合は、100010を外した文を書きこんであげればOKです。
$tel->print('ip lan1 secure filter in 100000 100001 100002 100003 100004 100005
  100006 100007 100008 100009 100099');
こんな感じ。
必要に応じて、引数でON/OFFを分けたり、別のコマンドで分けたりして運用すれば良いでしょう。