ラベル ネットワーク の投稿を表示しています。 すべての投稿を表示
ラベル ネットワーク の投稿を表示しています。 すべての投稿を表示

2012年8月23日木曜日

Ciscoの設定ファイルを自動SVN管理

Ciscoの設定をいじって、あとあと「しまった!」と思うことがあったりする。 何をどう変えたか分からなくなってしまったり…。 変更ごとにtftpでローカルに落として、自分で世代管理して、とかやってたけど、やっぱり面倒。 世代管理はSVNに任せられるから、リポジトリを作ってみた。
そうすると欲が出てきて、なんとか自動的にできないかなぁ、と思ってきた。
Linuxサーバからなんらかの方法でconfigが取れれば、あとはSVNのワーキングディレクトリに突っ込めばどうとでもなる。 ここがどうにかならないか、と調べて分かったのが、PerlのNet::Telnet::Ciscoモジュール。 Perlで、Ciscoデバイスにtelnet接続し、任意のコマンドを実行できるモジュールらしい。 これで入って、show running-config でも show startup-config でも実行すれば求めるものは取れる。 ということで、簡単なPerlスクリプトを書いてみた。 とりあえずget_config.plと命名。

#!/usr/bin/perl
# オプション解析モジュールのロード
use Getopt::Long;
# Ciscoコマンド操作モジュールのロード
use Net::Telnet::Cisco;

# IPアドレス
my $host = '';
# ユーザ名
my $username = '';
# vtyログインパスワード
my $password = '';
# ENABLEモード パスワード
my $epassword = '';

GetOptions( 'host=s' => \$host, 'username=s' => \$username, 'password=s' => \$password, 'epassword=s' => \$epassword );

# Cisco.pm用オブジェクトの作成 -> ルータに接続
my $obj_Session= Net::Telnet::Cisco->new( Host => $host );

# vtyパスワードを用いてログイン
$obj_Session->login($username, $password, );
# enable
$obj_Session->enable( $epassword );

# コマンドの実行
@cmd_output = $obj_Session->cmd('show running-config');

# コマンド実行結果のアウトプット
print "Last command: <", $obj_Session->last_cmd, ">\n";
print "Last error: <", $obj_Session->errmsg, ">\n";
print "Cmd output: <", @cmd_output, ">\n";

exit 0;
./getconfig.pl -h <ホスト名> -p <パスワード> -e <特権モードパスワード> で、sh run 結果を返してくれる。 まぁ、最初と最後に若干情報が出るけど…。
$ ./get_config.pl -h 172.xxx.xxx.xxx -p password -e enable_password
Last command:
Last error: <>Cmd output:Current configuration : 18623 bytes ! ! Last configuration change at 11:58:40 JST Fri Aug 17 2012 ! NVRAM config last updated at 11:05:37 JST Sat Aug 11 2012 ! ~(省略)~ end
>
ここからシェルスクリプトの出番。 最初3行と最後1行は不要なので、続くシェルスクリプトで削る。 あと、やってみると分かるけどntp clock-periodはよく変わるので、有用な情報とは言えないので削る。 Ciscoデバイスの名前、IPアドレス、ログインパスワード、特権モードパスワードをスペース区切りでテキストファイルに保存。 cisco_file.txtとしよう。 こんな感じ。

cisco_router1 172.xxx.xxx.xxx password1 enable_password1cisco_router2 172.yyy.yyy.yyy password2 enable_password2
SVNのワークディレクトリを作っておく とりあえず
/home/foo/networks/trunk
にした
シェルスクリプトを実行すれば、指定したCiscoデバイスの設定ファイルを取って、SVNのワークディレクトリに書き込み。 で、SVNコミットさせる。 違いがあれば、コミットするし、なければコミットしない。 とそんな仕様のスクリプト。

#!/bin/bash

# Cisco機器のstartup-configファイルを取得し、リポジトリと違っていればコミットしておく

REPO=http://<リポジトリ>/networks/trunk
WORK_DIR=/home/foo/networks/trunk

PNAME=$( basename $0 )

# Cisco機器の名前、IPアドレス、ログインパスワード、Enableパスワードをスペース区切りで
CISCO_FILE=/home/foo/cisco_file.txt

get_config()
{
  typeset HOSTNAME=$1
  typeset HOST=$2
  typeset PASSWD=$3
  typeset ENABLE_PASSWD=$4

  ./get_config.pl -h $HOST -p $PASSWD -e $ENABLE_PASSWD | sed '/^ntp clock-period/d' | sed -e '1,3d' | sed -e '$d' &gt; $WORK_DIR/${HOSTNAME}.config
}

while read LINE
do
  get_config $LINE
done &lt; $CISCO_FILE

if [ "$1" != "" ]
then
  echo "You can commit by $ svn commit -m \"comments\" $WORK_DIR"
else
  svn commit --username  --password  -m "Change detected. Automatically commited by $PNAME" $WORK_DIR
fi
これをcheckciscoconfig.shと命名して、crontabで毎晩23:30とかに仕込んでおけば、その日の変更は必ずコミットされる。
30 23 * * * /home/foo/checkciscoconfig.sh > /dev/null
コメントは実態を反映していないけど、「忘れた!」よりマシという考え。
手動実行でちゃんとコメント付けてコミットしたいときは、
./checkciscoconfig.sh manual
とか、とにかく引数を与えてやれば設定ファイルだけをとってくるようになってます。

2012年8月17日金曜日

EIGRPあれこれ


EIGRPで分かったこと
詳しい人から見たら当たり前なんだろうけど…。


  • インターフェイスの遅延と帯域幅
    EIGRPのデフォルトでメトリック計算に使われる。
    誤解していたんだが、「遅延」は実際のパケットの到達時間とかで自動的に割り出してくれるものではない。
    両方とも静的。
    管理者の裁量である程度変えてもよさそう。
  • VLAN上のインターフェイスの遅延と帯域幅
    VLAN上にインターフェイスを乗っけていたら、いくらインターフェイスの帯域幅と遅延をいじってもメトリックが変わらなかった。
    なんで?と調べてみたら、こういう場合はインターフェイスをいじっても仕方ないのね。
    該当のVLANを変えないと。
    int vlan
    でdelay 500
    とかやったらすぐに反映された。


2011年7月13日水曜日

tsharkでパケットキャプチャ

Ciscoのスイッチに大量のパケットが送られているようでネットワーク帯域のほとんどを消費してしまい、ネットワークが非常に遅くなってしまった。
どんなパケットが送られてきているのか調べるためにwiresharkのCUI版、tsharkでキャプチャしてみた。

まずはスイッチ上での設定。
FastEther0/1のポートが本番稼動しているが、そこにキャプチャ用のサーバを入れて、というわけにはいかないので、monitorコマンドを使用。
空いている10番ポートに同じパケットが流れるようにする
monitor session 1 source interface Fa0/1
monitor session 1 destination interface Fa0/10
キャプチャするサーバのeth1にはアドレスも何も振らず10番ポートと接続。
これで準備完了。
$ tshark -i eth1 -t ad -w <ファイル名>
これで指定したファイルにキャプチャが取られて行く。
止めないと永遠にキャプチャし続けるので適当なところでCtrl+Cで打ち切る。

キャプチャしたファイルを読み込むには
$ tshark -r <ファイル名>
で読める。

ただダラダラ読んでも解析が難しい…。
ログ集計スクリプトを組まなくちゃダメかなぁ、と思ったらちゃんとtsharkに統計機能があった!

というわけで、
$ tshark -r <ファイル名> -z conv,ip            # IPごとに集計
$ tshark -r <ファイル名> -z io,phs             # プロトコル階層で集計
$ tshark -r <ファイル名> -z io,stat,600,eth    # 600秒ごとにethフレームとして集計
とすればログのあとに統計情報が出てくる。
これは便利!

tsharkに関してはこちらを参考にしました。
集計の部分がすごく分かりやすい!
http://assimane.blog.so-net.ne.jp/2011-01-08