このブログを検索

2012/12/31

さくらのVPSへの不審なアクセス

lastbをやると、膨大な数の不審なアクセスがあることがわかる。

ほぼすべて、ユーザ名を変えつつssh接続を試みているものだ。

そしてちょっとした「ビッグデータ」なので、件数を数えてみた。

10270 176.227.XX.XX GB
4638 211.144.XX.XX CN
4505 116.255.XX.XX CN
3566 49.212.XX.XX JP
3241 178.79.XX.XX GB
1728 58.241.XX.XX CN
1572 217.12.XX.XX RU
1427 61.130.XX.XX CN
792 111.74.XX.XX CN
466 112.65.XX.XX CN
(以下略)


最多だったアドレスはイギリスからであった。中国からが多い。ちなみに国名はアドレスをwhoisで引いて調べた。アドレスは晒してもいいのだが一応一部伏せた。こういうアクセスは、スクリプトが流布していて、興味本位かダメ元でやってるだけではないかと思う。プロバイダに文句を言ってもキリがないしな・・・。

使われているユーザ名も数えてみた。

root,35928
test,886
nagios,800
admin,632
oracle,572
user,446
postgres,392
webmaste,322
web,320
ftpuser,308
backup,294
www,260
tomcat,234
guest,232
mysql,222
support,178
testuser,170
user1,148
hadoop,142
user2,128
temp,126
teamspea,124
mythtv,112
download,106
www-data,104
ftpguest,104
info,102
prueba,102
ftptest,100
teste,92
webuser,90
mailman,84
cacti,82
gast,76
suporte,72
office,70
bin,70
student,68
mailtest,64
gnats,62
koha,62
squid,56
alex,54
minecraf,52
firefly,52
news,52
informix,52
ftp,50
david,50
postmast,50
kiosk,48
(以下略)


ひとつ、使われている可能性が非常に高い(実際私が使っている)ユーザ名を試していないことに気づいた。そんなものすら試していないことからも、この手のアクセスが「本気」でないことが想像できる。

別に痛くもかゆくもないし・・・と思っていたが、時々sshがすごく重くなるのはこのせいかと思って、sshdのポート番号を変えた。

使われているユーザ名を数えたスクリプト。

最初にlastbの結果をファイルに書いておいてそれを読ませる。

while(<>){
    ($name) = split;
    push @list, $name;
}

%hash;

for (@list){
    if(exists $hash{$_}){
        $hash{$_}++;
    }else{
        $hash{$_}=1;
    }
}

foreach my $name (sort { $hash{$b} <=> $hash{$a} } keys %hash){
    print "$name,$hash{$name}\n";
}


キモはハッシュをキーでなくデータ(この場合ユーザ名)でソートするところだ。

「キーがハッシュに存在すれば値を加算、なければ追加」というところが、もっと簡単にできそうなのだが、こうするしかないかな?

for (@list){
    $hash{$_}++;
}


これでいいみたいだ。わざわざ「なければ」とかしなくても。




2012/12/30

pukiwikiが動かない

pukiwikiを入れた。

前回VPSを借りたときにもインストールしたはず。

が、動かない。

インストールといってもtarで展開するだけだ。

ブラウザで、「サーバーエラー」となり、下の方に「500(Internal Server Error)」と書いてある。しかし、/var/log/httpd/error_log には何も出ない。

フォルダをcgi-binの下に移動したりしてみたがダメだ。

違うPHPのファイルを index.phpという名前にして置いてみると動く。

なんだろう?PHPのバージョンだろうか?

index.phpの、エラーレポートのレベルのようなものを指定している箇所を E_ALLに変更してみると、/var/log/httpd/error_log が出た。

// Error reporting
//error_reporting(0); // Nothing
//error_reporting(E_ERROR | E_PARSE); // Avoid E_WARNING, E_NOTICE, etc
error_reporting(E_ALL); // Debug purpose


[error] [client xx.xx.xx.xx] PHP Fatal error:  Cannot redeclare hex2bin() in /var/www/html/wiki/lib/func.php on line 317


調べるとやっぱりバージョンのせいのようだ。要は、phpが新しすぎるのだ。

回避方法があるようだが、メンドクサそうなので、後にする。


2012/12/29

postfix

送信メールサーバ(MTAと呼ぶのか)はsendmailではなくpostfixを使った。

しばらく前にインストールしたのだがクライアント(Windows7のLiveメール)から送信ができなかった。

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination
-o milter_macro_daemon_name=ORIGINATING


さっきできるようになったのだが、直したところは /etc/postfix/master.cf の、



  • o smtpd_tls_security_level=encrypt を mayにしてpoxtfix reloadしただけだ。

ここがencryptになっていると暗号化を強制するのかな?

encryptにしてあると、クライアントからサーバにアクセスしたとたんに切断され、

STARTTLSが必要とかなんとかいうエラーになる。

クライアント側でTLSを使うようにしてもよいのだろうがよくわからない。

あと、submission... という行があるが、これがあるとサブミッションポートというものが有効になる。

サブミッションポートというのは「587番でも待つ」という仕組みらしい。単に、SMTPのポート番号を変える、というものではないようなのだが何が違うのかよくわからない。

クライアント側の設定は、送信メールサーバのポート番号を587にし、「送信メールサーバで認証が必要」の設定にする。




つづいて、pythonを最新にする。

今までのは2.6.6だったが、2.7.3にする。

ソースを持ってきてコンパイルする。

$ sudo yum install zlib zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel db4-devel


$ wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar zxvf Python-2.7.3.tgz


$ cd Python-2.7.3
$ ./configure --with-threads --enable-shared
$ make
$ sudo make install


enabled-sharedオプションは、mod_wsgiを使用する場合に必要だとのこと。

mod_wsgiはapacheで動かすときに必要とのことなのでつけておく。

[hoge]# python --version
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory


となるが、シンボリックリンクを張ればOK.

[hoge]# ln -s /usr/local/lib/libpython2.7.so.1.0 /lib64/
[hoge]# python --version
Python 2.7.3


つづいて、sphinxのインストール

wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py


easy_install sphinx


とやると、ダウンロードしてインストールしてくれる。

MySQL

yum --enablerepo=remi install mysql mysql-server mysql-devel mysql-libs


remiを指定しないとエラーになった。




2012/12/28

phpのcgi

OSはデフォルトのCentOS6

cgiはperlで書いている。

phpでも何か動かせるようにしようとしたのだが、

phpのスクリプトを動かすと、htmlタグがそのまま表示されてしまう。

apacheのhttpd.confで、

AddType application/x-httpd-php .php

を書くと、ファイルがダウンロードされる。

コメントにすると、実行されるがhtmlタグがそのまま表示される。

WEBをさがしてみたが同じ状況の人がいない・・・。

「ソースが表示されてしまう」

「ダウンロードしてしまう」

という人はいる。

httpd.confの設定がどうこう、という情報はあるのだが、さくらのVPSでうまくいっている人は特に変更していない。

が、phpのバージョンが違う。

一応、あわせてみるか・・・。

「remiリポジトリ」を登録する必要があるとのことなので、


rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm


その後、以下を実行。


yum install php-mbstring --enablerepo=remi
yum install php-gd --enablerepo=remi
yum install php-pear --enablerepo=remi
yum install php-mcrypt --enablerepo=remi
yum install php-mysql --enablerepo=remi
yum install php-devel --enablerepo=remi


バージョンは


[hoge]# php -v
PHP 5.4.10 (cli) (built: Dec 19 2012 11:45:14)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies


動いた・・・

httpd.confのAddHandler, AddType applicationとかはデフォルトに戻した。

バージョンが違うというより、その後に入れたモジュールが入ったせいじゃないかな・・・

くわしくはわからん。

あと、php.iniのtimezoneの設定を変更


[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone ="Asia/Tokyo"


その下に、コメントアウトされているがlatitudeとかlongitudeとかいう設定があるのだが、なんだろう?

とりあえず無視。




2012/12/26

ログのパース

今まではスペースでsplitして、何番目が何で、などとやっていたが、「プログラミングPerl」をざっと読んで、 いろいろ新しいことを覚えたのでそれを生かして改善してみた。
my $logfilename = './access_log';
open my $logfh,"<$logfilename" or die $!;

while(<$logfh>){

    my @dataname = qw/client_address identifier user_name time request last_status sent_bytes referer user_agent/;
    my @logdata = $_ =~ /(.*) (.*) (.*) \[(.*)\] "(.*)" (\d+) (\d+) "(.*)" "(.*)"/;
    my %logdata;

    my $i=0;
    for (@logdata){
        $logdata{$dataname[$i]} = $_;
        $i++;
    }


    foreach my $key(keys %logdata){
        print "$key : $logdata{$key}";
    }
}
close($logfh);
これはcgiのソースの一部である。 キモはパースした内容をハッシュに格納しているところだ。 今までは配列(リスト)に格納して欲しい内容の位置にアクセスしていた。 それを、いったんデータの名前だけをリストで定義し、それをキーとしてパースした結果をハッシュに格納した。 こうすれば、欲しいデータを名前で探せる。 foreachするときに、配列のインデックスが知りたかったのだがわからなかった。 「$.」ではなかった。 なのでインデックスを変数としてインクリメントした。 ここはダサい。 apacheのログパースをするモジュールなんてのもあるが、これくらいは自分でやりたい。 正規表現も、検索すればちゃんとしたものが見つかるが、これくらいは自分で書きたい。

 1.まずフォーマットを書く。
.* .* [.*]

2.取り出したいところをカッコで囲む
(.*) (.*) [(.*)]

3.エスケープを必要なところに入れる。
(.*) (.*) \[(.*)\]

4.動かして、うまくいかなかったら直す。

 「プログラミングPerl」は、Perlの聖典であるかのように、かつ、難しいと言われているが、夕べなんとなく開いて読んでいたらおもしろくて、それほど難解なこともなく、すーっと読んでしまった。

関数やライブラリモジュールの一覧解説があるので分量が多いが、それを除けばそれほどでもない。 私のもっているのは古くて、2nd Edition、1997年発行のものである。

 「初めてのPerl」「続・初めてのPerl」ももっていてだいたい読んだが、「プログラミングPerl」も早いうちに読むべきだと思う。 文中に紹介されているサンプルを知っているといないとでも大違いだ。

私はPerlを書いていてゴチャゴチャしてくると、「こんな難しくなるはずはない」と、それらのサンプルを思い出しながら、思う。

2012/12/24

Net::TwitterをNet::Twitter::Liteに変える

わたしは自分のサイトにサーチエンジン経由でアクセスがあったときにそのキーワードをtweetさせている。

今日そこをいじって気づいたのだが、tweetさせると数十秒程度時間がかかっている。

tweetするまでではなく、tweetした後に時間がかかっている(と見えたが勘違いかもしれない)。

tweet自体はちゃんとできている。

原因はわからないが、Net::Twitter::Liteに変えたら治った。

Net::Twitterはボットでも使っていたがしばらく動かしていると死んでしまうのでLiteに変えていた。

やっぱりなんかおかしい・・・。




2012/12/21

MeCab

さくらのVPSにmecabをインストールする。

本体と辞書をインストールする。

辞書はデフォルトでeucなので、configureのオプションでutf8にする。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer


wget http://mecab.googlecode.com/files/mecab-0.994.tar.gz
tar xvzf mecab-0.994.tar.gz
cd mecab-0.994
./configure
make
make check
make install

wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf-8
make
make install
mecab


起動してみる。


[hoge]# mecab
母は歯は丈夫だ
母 名詞,一般,*,*,*,*,母,ハハ,ハハ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
歯 名詞,一般,*,*,*,*,歯,ハ,ハ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
丈夫 名詞,形容動詞語幹,*,*,*,*,丈夫,ジョウブ,ジョーブ
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS
^C


さて、何をしたらおもしろいかな?

・・・と、スクリプトで使うにはそのスクリプトの「バインディング」というものが必要なので、それもインストールする。


wget http://mecab.googlecode.com/files/mecab-perl-0.994.tar.gz
tar zxvf mecab-perl-0.994.tar.gz


READMEに書いてあるが、以下を実行。


perl Makefile.PL
make
su
make install


これで、use MeCab を書けば、perlで使えるようになる。

前回使ったときは辞書がeucだったのでencode/decodeが必要だったが、今度はutf8にしたのでそのままいける。

・・・さて、何をしようか。




話は変わるが、perlで日付を取得したいときに、どうやるんだっけと調べると以下のような方法が見つかる。


@youbi = ('日', '月', '火', '水', '木', '金', '土');
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
print "$year年$mon月$mday日($youbi[$wday]) $hour時$min分$sec秒\n";


日付の用途はいろいろで、これならフォーマットや足し引きなども万能かもしれないが、メンドクサイ。コピペするにしても、なんかめんどくさすぎる。

単に表示するだけなら、


print scalar(localtime())."\n";


または


my $tmp = localtime();
print $tmp."\n";


結果は以下のようになる。

centosで試した。プラットフォームによって変わるのかな?


Fri Dec 21 23:26:48 2012


今日は何曜日か?を知りたいときは、上にあげたようにすればいいが、わざわざ変数をいくつも並べるのは面倒だから、


@datedata = localtime();


として、曜日であれば配列の7番目 $datedata[6] を見ればよい。

日付処理に関するモジュールがいろいろあるようだが、何でもかんでもすぐモジュールを使うのもアレだし。

perlの配列を添え字をつけて参照するときは、@array[1] ではなく、 $array[1] とするんだね。

@がつくと、配列全体を指すのか。一個一個の配列をさすときは変数扱いで $となるのか。

私はperlの配列を添え字を使って特定の変数を取り出すことはあまりしない。

たいていは丸ごとあるいはpushでどかどか突っ込んで、foreachで吐き出しながら正規表現で引っ掛けて何かする、という風に使う。




2012/12/20

2ちゃんねるでスクレイピングが失敗する

さくらのVPSサーバから、あるサイトにアクセスし、そのWEBサイトの情報の一部を取り出すという事をしている。いわゆる「スクレイピング」である。 

最初はperlで、LWP::Useragentなどを使って、あるサイトの情報を取り、あとは正規表現などを使って試行錯誤しつつ欲しい情報のみを取り出した。 特に難しいことはない。

ところが、同じ事を2ちゃんねるでやってみたら、うまくいかない。やろうとしたのは、ニュース速報の上位のスレッドタイトルを取得することだった。 2ちゃんねるは掲示板のメニューがあってそこに各掲示板のURLが記載されている。そしてその掲示板のURLはかなり頻繁に変更されるので、そのときアクセスできているURLに固定でアクセスせずに、メニューからURLを取得しなければならない。 その、メニューからURLを取得することはできたのだが、そこから取得したURLへアクセスすると、どうしてもHTMLの内容が取得できないのだ。

まずは、「302 Found」というエラーになる。これはリダイレクトされたときに出るもののようで、あるところで

push @{ $ua->requests_redirectable }, 'POST';
をやればいいという情報を見つけたのでやってみたら、今度は「ボボンハウス」のページが表示されてしまう。

同じperlスクリプトをローカルPCで動かしても同じ状況になる。 もちろん、ブラウザやギコナビなどでは問題なくアクセスできている。 昨日はここまでやって、あきらめて寝た。 

そして今日、perlのスクリプトでアクセスしたときと、ブラウザでアクセスしたときのパケットをwiresharkでキャプチャして比較してみた。

すると、GETしているときに、・・・・ と、ここまで書いてuseragentが違うことに気づいた。 perlで書いたものは何も設定しておらず、lwpの初期値が入っている。 これを'Mozilla'に変えたら・・・いけた。

昨日、変えてダメだったような記憶があったんだけどな・・・ ま、いいや。 これだけでいけるようになるということは、2ちゃんねるの「スクリプトキディ」除けかな。

今日はWEBでphpをつかったスクレイピング例を見つけてそれがうまく動いたのでそれをいじっていた。

しかし今度はphpの動作で不可解なところがでてきた。 まず、phpをcgiとして動かすために必要な設定がなんなのか。 いろいろと情報があるのだが、皆条件付でスパっと「ここをこうする!」という情報がない。

これも試行錯誤で試して、なんとかうごいた。 前回はこんなに苦労した記憶はないのに・・・。 さらに、いちおう動いたのだが、出力する内容が全部そのまま出てしまう。 htmlのリンクとかを書いても、そのまま表示されてリンクにならないのだ? なんでだ? 

話は変わるが、正規表現であるパターンにマッチする文字列が複数あり、それをすべて取り出したいときにはどうすればいいのだろう? たとえば、今まさにやりたかったのは、httpでgetしたデータの中にあるリンク(a href) を全部取り出して配列に格納する、というようなケースだ。 パッと思いつかず、サラっと探しても見つからなかったので、a hrefの前で改行してファイルに吐き出し、そのファイルを読んで一行ずつ処理するというメンドクサイことをしている。 こんなことしなくてもできるよね・・・。

2012/12/09

sedで一括置換できない

わけあって、以下のような置換をそこそこたくさんのファイルについて実行しなければならなかった。

%s/\n<br>/<br>/g


viで一個ずつ置換していたのだが、sedでやれば一括でできるだろうとやってみたが、できない。

sed -i -e 's/\\n<br>/<br>/g'


なんでだろう?

まあ、たいした数ではなかったので、一個ずつviで開いて置換をしていった。




2012/12/07

twitterのbotが動かなくなった



以前使っていて特に不満はなかったのだが諸事情により解約したVPSを再度契約した。

レンタルサーバにしようか、VPSにしようか迷ったのだが、480円しか違わないのでお勉強のためも兼ねようと、VPSにした。

twitterのbotを復活させようとしてNet::Twitterを入れようと、いつものようにやったらエラーになった。

[hoge]# perl -MCPAN -e shell
Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.


調べるとモジュールのインストールが必要とのことだった。

yum install perl-CPAN


いつもおまじないのように実行していたが、モジュールを使っていたんだね。

さて、前に動かしていたbotが動かない。tweetができない。ascii文字とリテラルならいけるが、ファイルから読み込んだutf8の日本語がtweetできない。

自宅にあるcentosで、同じスクリプトが動いている。

Encodeのバージョンが、動かないVPSの方が新しい。

Centosはともに6.3だが、VPSは64ビット版、家は32ビット。

Perlのバージョンは同じ。

Net::Twitterも同じ。

Encodeのバージョンが違うというのが一番あやしい。下げてみようか・・・

でもそれより、動いているスクリプトがおかしくて、本来よくないやり方なのがたまたま動いていた、という問題な気がする・・・・

Net::Twitter::Liteにしたらうまくいった・・・。

原因は不明。

あー時間を空費した。

その後・・・

今度はblockしているユーザの一覧とその解除をする、OAuthを使うcgiを動かしたらこれも動かない・・・

最近apiの仕様が変わったという話は聞いていたが、そんな問題じゃない感じがする・・・

あれこれやってもどうしてもわからず、access token等を直接書いてblockしているユーザーを表示するスクリプトを動かしてみたら、数十秒かかる。

なんだこれ・・・




2012/11/25

「ブリッジ接続」の使い方

ノートPCに入れたCentOS6.3での無線LANアダプタの利用はあきらめて、とりあえずケーブルでWindows7パソコンにつないで使っていたが、やはりインターネットにつなげないと困る。

じゃあWindows7でルーティングしてみようか・・・でもNATとかしないといけない・・・

と、「ブリッジ接続」を思い出した。

これはたしかXPから追加された機能であるが、使い方がよくわからなかったのだが、まさに私がいま利用しているような場合にぴったりの機能だった。

「ネットワークと共有センター」→「アダプタの設定の変更」で、インターネットに接続しているアダプタと、もう一個のアダプタを両方選択してから右クリックし、「ブリッジ接続」を選択する。

そして私の場合でいえば、ノートPCのインタフェースの設定を、インターネットに接続しているネットワークのアドレスにし、ゲートウェイはWindowsパソコンに設定しているのと同じものをしていすればよい。

こうすると、二つのインタフェースが一つのインターネット接続を共有できる。

こうやって使うのか・・・。




2012/11/24

CentOSで無線LAN

CentOS6.3をdellのノートPCにインストールした。
CGIの試験などをするために。
そのノートPCは普段無線LANで使っているのだが、
CentOSで無線LANを使ったことがないのでできるだろうかと不安になった。
WEBで調べると、使えるようだったがちょっと面倒なようだった。
なんとか、make, make install, insmodまでできて、
iwlist ra0 scan をしてAPの情報も見えた。
ところが、どうしてもDHCPでアドレスが取れない。
固定IPを設定しても、ゲートウェイと通信できない。
SSID、暗号方式、パスワード等が間違っているような動きに見えるのだが、
何度も確認してみたがどうしても接続できない・・・・。

無線LANアダプタは BuffaloのWLI-UC-GNM
lsusbをすると、Ralink RT8070 となっている。
ドライバは http://www.ralinktech.com からダウンロードできる。
無線LANルータは Emobileの GL01Pでデフォルト設定のまま
暗号化方式は WPA/WPA2
WPA暗号化方式は TKIP+AES
これがちょっと気になるんだけど、PC側はWPA2、TKIPで設定してるけどいいんだよね?
iPhoneはSSIDとパスワード(WPA key)しかいらない。
Windows7は「セキュリティの種類:WPA-パーソナル」「暗号化の種類:TKIP」、「ネットワークセキュリティ」にWPA Keyを設定してつながっている。




2012/11/21

ブリッジとスイッチの本質的な違い


Ethernet, TCP/IPについて勉強し始めた頃、「ブリッジとスイッチ(L2スイッチ、スイッチングハブ)の違いは何か?」という疑問を抱いたことのある人は多いと思う。

よく言われることは、「スイッチはマルチポートである」「スイッチはHW処理である」「スイッチは転送方式が異なる(カットアンドスルー等)」などであるが、私はそれらの違いのどれもブリッジとスイッチの本質的な違いを説明しているようには思えなかった。

しかし、私はようやく本質的な違いを理解した。それはすでに挙げたことであるが「マルチポートであること」である。マルチポートであるというのは単にポート数が増えただけで本質的ではないように思えるが、そうではないのだ。

ブリッジもスイッチもアドレス学習機能を持ち、その原理は同じである。フレームを受信するとその送信元MACアドレスは受信したポートに接続されていると認識し記憶する。その後、記憶してあるMACアドレス宛のフレームを受信したら、そのポートへ送信する。記憶していない未学習のMACアドレス宛のフレームを受信した場合は、受信ポート以外のポートから、そのフレームをコピーして送出する。

このアドレス学習機能の目的は何だろうか?それは「不要なフレーム転送の抑制」である。「あるMACアドレスがどのポートに所属しているかの区別」ではない。確かにこの学習においてアドレスとポートの関連付けはおこなわれるのであるが、それは目的ではなく手段である。

アドレス学習機能の目的が「不要な転送の抑制」であることがわかると、どうしてスイッチがスイッチと呼ばれるようになったかがわかる。スイッチとは初期は単なるマルチポートブリッジでしかなかった。アドレス未学習のときにフレームを受信したポート以外から転送することはポート数が2個だろうとそれより多かろうと同じである。

しかし、ポート数が2個であれば、ブリッジのすることはそのフレームを受信ポートでないひとつのポートから送出するか否かを判断することでしかないが、マルチポートつまり3個以上になると、「受信ポートでない複数のポートのどこから送出するか」を判断することになる。

ブリッジというと、二つの場所を「接続する」というイメージがある。実際に接続することにはなるのだが、そもそもブリッジが登場した目的はノード数の増加とともに増大するコリジョンを削減するためであった。ひとつの大きなコリジョンドメインを分割する目的で考え出された装置なのである。

ブリッジが3つ以上の場所を接続することになっても、それは同じであるが、接続する場所が3つ以上になったことにより、それまでは「出すか出さないか」でしかなかった判断が「どこに出すか」という判断になった。それを判断するための原理は2ポートの時と同じでも機能したのであるが、単なる不要な転送の抑制だけが目的であったのに加え、「どのポートへ転送するか」という目的も兼ねるようになったのである。これは2ポートの場合にはなかったことである。

HW処理になったり、転送方式が改良されたりしたのも、この新しい目的の為である。だからブリッジとスイッチの一番本質的な違いはマルチポートであることである。

2012/11/13

javascriptによる画像ビューア

javascriptがアツい。 javascriptのコンパクトな画像ビューアがあったので、 cgiの中に入れることにした。 ヒアドキュメントを使ったら、文字化けしている。 それは、変数展開によるものであった。

print <<"END_OF_TXT";

apple
banana
$test

END_OF_TXT


とやると、$testが変数展開されてしまう。 それをさせないようにするには、

print <<'END_OF_TXT';


とすればよい。ちなみにそのjavascriptによるビューアは動きが重かったので不採用。




ファイルの拡張子を取り出そうと調べたら、以下のようなソースがあった。

$name = "aaa.jpg";

if( index($name, '.', 0) != -1){
$suffix = (split(/\./, $name))[-1];
}

print $suffix."\n";


なるほどね、ピリオドで区切ってsplitすればいいのか・・・ と思ったがsplitしたものの取り出し方がちょっと変わっている。 私だったら、

@tmp = split /\./, $name;
$suffix = pop(@tmp);


とやるところだ。 おそらくそれを一発でできるのだろうが、どういうことなのかよくわからない。

[-1]で配列の最後を意味するのかな?




2012/09/19

重複ファイルの検索

picasaで写真から顔を検出する機能があっておもしろいなあと見ていたら、同じ画像ファイルがやたらとたくさんあるのが気になった。もう最近はハードディスクの空き容量がなくなるということがすっかりなくなったが、やっぱり同じファイルがたくさんあるのは気持ち悪いので、重複する画像ファイルを探してリストアップしようと思った。しばらく前にperlでそれを作ってあったので動かしてみたがなかなか終わらない。おかしいなと調べてみるとある場所をずっと繰り返して検索している。以前はちゃんと動いたはずなのに・・・最近perlは使っていず忘れていたのと、pythonの勉強を兼ねてpythonで作ろうとしてみた。しかし、数時間かけたがうまくいかない。

あきらめて、とりあえず画像ファイルをすべてリストアップしてテキストに書き出し、それをexcelで開いてファイル名で並べ替えて重複をチェックしてみた。しかし、ファイル名だけではちぇっくにならない。「1.jpg」という名前でも全然違うファイルがある。perlで作ったときは、ファイルサイズも調べて、サイズと名前が一致するものを重複候補とした。そこまですれば、後は目視でチェックしてもそれほど手間ではなかった。が、pythonで同じ事をやろうとしたがうまくできなかった。くやしいな・・・・




こんなものを作ってみた。

class MyFile:
def __init__(self,name1,size1,path1):
self.name = name1
self.size = size1
self.path = path1
def getName(self):
return self.name
def getSize(self):
return self.size
def getPath(self):
return self.path
file1 = MyFile("taro",110,"c:\\file\\")
file2 = MyFile("jiro",120,"c:\\file\\")
file3 = MyFile("saburo",130,"c:\\file\\")
print file1.getName()
print file2.getPath()
print file2.getSize()


実行してみた。

C:\>python ob.py
taro
c:\file\
120


"MyFile"というクラスを作ってみた。「クラス」というのは、プロトタイプのようなものだ。「概念」と言えばいいだろうか。クラスそのものは実体ではない。

file1 = MyFile("taro",110,"c:\\file\\")


とやって、初めて file1 という「実体」が存在する。これを「インスタンス」と呼ぶ。このクラスを使って、PCに存在するファイルの名前、サイズ、パスを記録するにはどうすればいいか。このクラスを配列にすることができるか?もしくはインスタンス名を変数にすることができるか?・・・・わからない。

考え方を変える。配列に「ファイルサイズ(スペース)ファイル名」、「パス」という順番に記録していく。そしてその配列を全部読んで、別のリストに「ファイルサイズ(スペース)ファイル名」が存在しなければ記録していく。このときすでに存在していれば、サイズとファイル名が両方同じファイルだということになる。

import os
list1=[]
filelist=[]
duplicate_count =0
file_count=0
rootdir = "/"
for (root, dirs, files) in os.walk(rootdir):
for f in files:
name, ext = os.path.splitext(f)
if ext == (".jpg" or ".png" or ".bmp"):
try:
fsize=os.path.getsize(os.path.join(root, f))
except:
print "some error happened. keep on going anyway..."
str1 = str(fsize) + " " + f
list1.append(str1)
list1.append(os.path.join(root, f))
for i in range(len(list1)):
#    print list1[i]
if ((i % 2) == 0):
file_count += 1
if list1[i] in filelist:
print "already exists:  " + list1[i]
duplicate_count += 1
else:
filelist.append(list1[i])

2012/09/18

twitterでblockしているユーザの一覧

python-twitterには block 関連が実装されていない。自分がblockしているユーザを知りたい。これくらいしかわざわざAPIを使おうと思う機会はない。直接APIを呼ぼうかと思ったがわからず、tweepyがあることを知る。

ついでに easy_install という、perlのppmみたいなものがあることを知る。pythonのインストールフォルダの下に scripts というフォルダがあり、そこにインストールされている。さっきsetup_toolsとかいうのをインストールしたときにインストールされたのかな?それとも最初からあったのかな?不明。pathに c:\python27\scripts を追加すると、コマンドプロンプトで以下のようにしてtweepyをインストールできた

easy_install tweepy
では、ブロックユーザ一覧のサンプルです。
import tweepy
consumer_key = '***'
consumer_secret = ' *** '
access_key = ' *** '
access_secret = ' *** '
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth_handler=auth)
results = api.blocks()
for result in results:
print result.screen_name

How simple!
最後を以下のようにすれば、block解除できる。
for result in results:
api.destroy_block(result.id)

perlよりいいかも。ちなみに、access_key と access_secret は、twitterのアプリケーション登録画面で取得できる。もし、第三者にAPIを利用させたい場合は、これらをユーザの了解のうえで取得することができる。「Authorize app」とかいうボタンが表示されるあの画面である。今回のように、自分のPCでちゃちゃっと使うような場合はソースの中に直接書いてしまえばよい。

2012/09/17

python-twitter

twitter apiを使ってみる。モジュールのダウンロードとインストールが必要。ちょっと多い。

まずpython-twitter

http://code.google.com/p/python-twitter/


python-twitterを使うには以下のモジュールが必要。

http://cheeseshop.python.org/pypi/simplejson
http://code.google.com/p/httplib2/
http://github.com/simplegeo/python-oauth2


さらに、python-oauth2をインストールするには setuptoolsというモジュールが必要。

http://pypi.python.org/pypi/setuptools#files


必要なモジュールがそろったら、以下の順にインストールする。

setuptools→ simplejson, httplib2, oauth2 → python-twitter

setuptoolsはwindows用のインストーラがある。

次の3つのモジュールは皆、解凍したフォルダの中で以下のコマンドでインストールできる。

python setup.py install


python-twitterは、以下のようにbuild と installが必要。

C:\python-twitter-0.8.1>python setup.py build
C:\python-twitter-0.8.1>python setup.py install


・・・やっぱりperlのCPANみたいに楽ではない。




<サンプル>

import twitter
api = twitter.Api()
statuses = api.GetPublicTimeline()

print '<html><head><title>tl</title><meta charset="utf-8"></head>'
print "<body>"


for s in statuses:
print "<p>"
print "<b>" + s.GetUser().GetScreenName()+ "</b><br>",
s.GetText().encode("utf-8","replace") + "<br>"
print "</p>"

print "</body></html>"


python twi.py > tl.html


とやってブラウザで見てください。




tweetするやつ。

# -*- coding: utf-8 -*-
import twitter
from urllib import urlencode
from oauth2 import Client, Consumer, Token
account_name = 'your_account_name'
account_pass = 'your_password'
consumer_key = 'your_consumer_key'
consumer_secret = 'your_consumer_secret'
access_token_key = 'your_access_token_key'
access_token_secret = 'your_access_token_secret'
client = Client(Consumer(consumer_key, consumer_secret),
Token(access_token_key, access_token_secret))
client.request('http://api.twitter.com/1/statuses/update.xml',
'POST',
urlencode({'status':'GOOD MORNING'}))





2012/09/16

python

暇なのでpythonを使ってみた。

pythonのインタープリタをインストールする。

c:\python27


というフォルダにインストールされた。

バージョンは2系列あるそうだが、日本pythonユーザ会とかいうサイトに、

どちらか迷ったら2.7にしましょうとあったのでそうする。

windowsのpathに上記のフォルダを追加する。

コマンドプロンプトで python とやるとインタプリタが起動する。

終了は ctrl+z + enter

ファイルを実行する場合は

python sample1.py


というようにする。

.py じゃないとダメかは知らない。




<サンプル1>

名前を入力すると挨拶する。

文字列の連結は + を使う。

name=raw_input('enter your name: ')
print 'hello, ' + name


<サンプル2>

ファイルの中身を表示する。

for とか if の後ろにはコロンがいる。

for line in open('readme.txt','r'):
print line


<サンプル3>

指定したキーワードを含むyoutubeの動画タイトルを表示する。

(gdata-python-clientのダウンロードとインストールが必要。すぐ終わる。)

# -*- coding: utf-8 -*-
import sys
import gdata.youtube
import gdata.youtube.service
argvs = sys.argv
argc = len(argvs)
if (argc != 2):
quit()
client = gdata.youtube.service.YouTubeService()
query = gdata.youtube.service.YouTubeVideoQuery()
query.vq = 'argvs[1]'
query.max_results = 25
query.start_index = 1
query.racy = 'exclude'
query.orderby = 'relevance'
feed = client.YouTubeQuery(query)
for entry in feed.entry:
print entry.title.text


perlの代替になるかと思っているのだが、perlほど自由奔放な感じはなく、

キッチリしている感じ。




2012/08/16

「名前を付けて保存」について

「名前を付けて保存」ということを、仕事でも家でも、パソコンを使っているとする。画像にしてもテキストにしても、コンピュータに保存するには名前を付けないと、それがなんなのかわからなくなってしまうから名前を付けるのは当然のことだと、いつの間にか思うようになった。だが、この「ファイルに名前を付ける」という行為は、たいしたことがないようでいて結構めんどくさくて、トラブルの種になりさえする。それは、「ファイルの中身と名前には何の正当な関連性は保証されない」からだ。これも当たり前のことだが、女の子の写真に「おじいさん.jpg」という名前をつけて保存することができる。もっというと、「bible.doc」という名前をつけることさえできる。「拡張子」というものも、利用者が任意に変更できる。テキストファイルに.jpgとつけたり、動画ファイルに .doc とつけることができる。それらのファイルをダブルクリックすると、「テキストではありません」というエラーが表示されたり、意味のわからない文字列が表示されたりするだろう。Windowsの場合。

iPhoneを使うようになってしばらくして、iPhoneでは「名前を付ける」という行為がほとんどないことに気づいた。ほとんどといったのは、アイコンを重ねたときに生成されるフォルダ名を変更できることが思い浮かんだからだ。だがそれ以外はiPhoneでファイルやフォルダに名前をつけた記憶がない。WEBで(safariで)、いいなと思う画像があったら、なんかのアイコンをタップして「Save image」とやると、画像は保存される。どのフォルダに、なんという名前でなどを指定する必要はない。画像を保存する場所は決まっているからだ。画像が保存されているフォルダをひらくと、サムネイルが表示される。名前はない。もちろん、拡張子なんかない。この仕組みになれると、Windowsで仕事をするのがめんどくさくなってくる。多くの会社はWindows XPとIEを使っている。Vista以降、ビジネスではMSの最新を追うことをしなくなった。一番大きな理由は「セキュリティ」なのだろうか。PCを使うことが非常におっくうになった。つまらなくなった。多少のバグやフリーズなどがあっても、新しいことがより速くかんたんにできるようになるのはおもしろかった。

しかし今は、コンピュータもネットワークも携帯端末も、重荷でしかなくなりつつある。コンピュータの導入後、かえって紙が増えたということが言われたが、それがようやくなくなって、ペーパーレス化がようやく実現できたと思ったら、また思わぬコンピューティングをはばむものの登場だ。人はそれを「コンプライアンス」と呼ぶ。




2012/03/04

netPod構想とストリーミングサーバ

私が以前どこかで提案した netPod 構想。 それは、ストリーミングサーバと呼ばれているものに近いことがわかった。そしてさくらのVPSを使用しての利用例が紹介されていた。iPhone用のクライアントアプリもあるそうである。ただし、まだ克服すべきことがいくつかある。まず、容量。さくらのVPSは20GB。足りない。iPhoneでも64GBあるのに。理想は500GB。さいきんオンラインのストレージサービスが広まってきたとは言え、まだまだ数百GBは大容量である。それから、再生方法。どうもストリーミングサーバというのは、再生リストを選択してその都度聴くもののようだ。しかし、私が望んでいるのはそれではない。

一番この netPodの必要性を感じるのは、iPodを聴きながら帰ってきて、ノリノリの状態でいるときだ。しばらくはイヤホンをしたままいろいろやるのだが、このとき、PCやらなんやらで、今再生している曲を聴きたい。それは、同じ曲を選んで聴くのでもないし、iPodをドックのようなものに置いてスピーカーで聞くのでもない。 再生は、どこかのサーバでやるのだ。iphoneやPCはレシーバーとして使う。 大事なことは、ipodで聴いていた音楽が、PCでも「同時に」聴けることだ。 要するに、「放送」したいのである。

2012/02/22

privileged server

windows7にcygwinをインストールし、syslog-ng, xinetd(tftpd)をインストールしたら、privileged serverとかいうアカウントができて何かするときにそのパスワードを求められるようになってしまい、cygwinのterminalが起動しなくなってしまった。 わけがわからなくなったのでcygwinをアンインストールしようとして苦労した。

まずアンインストーラーはない。 登録したサービスを削除したいのだがターミナルが起動しない。 コマンドプロンプトからc:\cygwin\binへ移動したらcygrunsrvが打てたのでそれでサービスを消す。 そしてフォルダを削除しようとしたのだが、これがまたできない。 インストールしたユーザで消そうとすれば管理者権限が必要と言われ、 administratorで消そうとすればユーザのアクセス許可が必要といわれる。 フォルダのプロパティから、administratorで、everyoneフルコントロールにしてもだめだ。 消せるフォルダと消せないフォルダがある。

しかたないので消せないフォルダがあったらそこへ移動し、icaclsやtakeownコマンドを使って所有者や属性を変えて消していった・・・・ administratorは何でもできるんじゃないのか・・・

レジストリや環境変数でcygwinがらみのものを消す。 環境変数にはパスなどがなかったが(これがまずかったのか)、確認していて PROCESSOR_ARCHITECTUREという変数に AMD64という値があるのに気づいた。 CPUはIntelの Core i3である。 なんでAMDなんだよと驚いたが、 たしか64bit CPUはAMDがintelに先んじてintelはAMDの使用を拡張する形で64bit化をおこなったのだと昔聞いたことを思い出した。

windows7のadministratorアカウントは無効にされていて、 有効にするにはGUIではなくコマンドが必要のようだ。 さっき調べて打ったのだがなんだったか忘れた。tftpサーバとsyslogサーバは、

http://tftpd32.jounin.net/

がおすすめ。 cygwinはめんどい。

net user administrator /active:no


無効にする。 cmd.exe を「管理者として実行」して。 ・・・・と、「管理者で実行」をするとダイアログが出たときに「はい」が押せなくなってしまった。管理者権限を必要とすることが一切できなくなった。 OSのディスクを使ってadministratorを無効にする前の状態に戻す。 そしてadministratorでログインして、いつも使っていたアカウントを「管理者アカウント」にしてから、

net user administrator /atcive:no


を実行する。 普段は通常アカウントで管理者権限は必要なときだけ使う、という今までの状態にはどうやってもどすのかわからない。とりあえずこれで使おう。

なんか釈然としないけど・・・。

2012/02/20

TSHOOT合格、CCNPになる

このスレが立ってから7年、CCNAを取ってからだと8年半、ついにCCNPになった・・・。
こんなにかかるなんて・・・・。
TSHOOTは勉強していても楽しい試験だった・・・。

過去の受験歴を見てみたら、9回受けて5勝4敗、今回でやっと勝ち越しになった。
現在3連勝中である。
受かってしまうとたいしたことはない。持っていないと何かができない資格でもない。
手当てがつくわけでもない。Ciscoの資格に関しては受験料から教材から機器まで全部自腹だ。
それにしてもよくCCNAの更新をこんなに長い間切らさなかったものだと感心する。

CCNPはSWITCH(642-813)がヤマだった。BCMSNは取っていたのだが、今回勉強しなおして、忘れていたというより根本的に理解できていなかったことを痛感した。L2の動作をナメていたようなところがある。
TSHOOTは簡単だったのだが、とてもおもしろかった。これからの仕事にもきっと役に立つだろうと思う。

トラッキングシステムがなかなか更新されない。SWITCHをpassした時は確か当日の夜中に見たときは更新されていたのに。
1時間に一回くらい見に行く。翌日になっても更新されない。
調べると「1週間たっても更新されなかったら連絡して」というようなことが書いてあったので、気長に待つことにする。
と、今朝(2時ごろ)メールが来ていた。

私はciscoの資格試験を受験するときは、試験前の合意書とかチュートリアルとかをなるべく読むようにしている。それは気持ちを落ち着けて冷静になるためである。

先日受けた試験で、それまでは書いていなかったのか、単に気づかなかったのかわからないが、初めて知ったことがあった。それは、試験の問題の中に、採点されない問題がある、ということである。

正確な内容は忘れたが、試験の改善のための参考にするための問題というようなことが書いてあった。


いつのまにか、Windows7を起動すると「Privileged server」というアカウントが表示されるようになった。普段使用しているアカウントとこのアカウントが表示され、いちいちクリックしなければならない。

cygwinでxinetdを入れたときかなんかに、アカウントを作ってパスワードを設定したのでその時にできたのだと思う。
まあ、アカウントができただけならいいか、と思っていたら、さっきadobeリーダーだかflashだかのアップデートをしたときに、このPrivileged serverのパスワード入力を求められた。ええええ?なんで?

これは困る。


次の目標はテクニカルエンジニア(ネットワーク)にする。
ciscoは置いとく。
「オンライン」という名前だったときに2、3回受けたことがある。
これを取ると、資格手当てがいくらだったかな、けっこうもらえるのだ。

2012/02/14

さらにTSHOOT準備

Mon Feb 13 11:07:58 2012

クライアントからサーバに到達できないときに、経由するルータへpingを打っていったときに、
どこかのルータがunreachableを返す時は、そのルータが目的NWへの経路を持っていないことを意味する。

unreachableが返らずにtimeoutする時は、目的ルータがクライアントのNWへの経路を持っていないことを意味する。

(冗長経路がない場合)
timeoutする時は、NWは生きていてそこへパケットが転送されたが返ってこない場合である。
unreachableの場合はNWそのものがない。


Tue Feb 14 08:08:02 2012

スタブ、NSSAというものが、いまひとつよくわからない。
基本は袋小路のネットワークにはデフォルトルートのみを配って余計な経路情報を持たないようにする、ということなのはわかるのだが、 NSSAとの違い、トータリースタブ、トータリーNSSAの細かい違いが実感できない。

ネットの情報ではLSAタイプのいくつを転送する・しない、ということばかり書かれているが、 もっとこれらのタイプが存在する理由、経緯、目的などを理解したい。


Tue Feb 14 08:18:20 2012

configを見るときに便利なやり方。

Ueno#sho run | section int
interface Loopback1
 no ip address
interface FastEthernet0/0
 ip address 192.168.2.2 255.255.255.0
 duplex auto
 speed auto
interface FastEthernet0/1
 ip address 192.168.20.1 255.255.255.224
 duplex auto
 speed auto
Ueno#
Ueno#
Ueno#sho run | section router
router eigrp 10
 redistribute ospf 10 metric 100000 0 128 128 1500
 network 192.168.20.0 0.0.0.31
 no auto-summary
router ospf 10
 router-id 4.4.4.4
 log-adjacency-changes
 area 20 nssa
 redistribute eigrp 10 subnets
 network 192.168.2.0 0.0.0.255 area 20
Ueno#


ただし、試験では使えない、多分。

2012/02/13

引き続きTSHOOT準備

Mon Feb 13 05:59:56 2012

2台買ったcatalystのIOSを、新しい方のバージョンにあわせる。
tftpサーバがいるんだよね、確か。
これもcygwinでやろう。

setupでtftp-serverを入れる。
いつものように、その後どうするかわからない。
googleで検索。あまり情報がない。
inetdで動かす・・・inetdって入っているかな・・・ない・・・インストールしよう・・・xinetdか。

$ /usr/bin/xinetd-config
*** Info: Note that the inetd service and the xinetd service must not
*** Info: both be active at the same time.  The easiest way to ensure
*** Info: this is to only install one or the other as a service.
*** Query: Do you want to install the xinetd super-server as a service? (yes/no)
yesを入れる。パスワードを登録する。
終わったら、

cygrunsrv -S xinetd

$ cygrunsrv -L
syslog-ng
xinetd
今動いているのはこの二つだけ。

インストールできたけど送受信がうまくいかない。
書き込みとかファイル作成権限とかユーザとかの問題か?
わからない。
さくらのVPSサーバにもいれてみるがこちらもダメ。
後で調べる。

とりあえず
http://tftpd32.jounin.net/tftpd32_download.html
を使った。

copy flash tftp
で、IOSをバックアップする。
プロンプトにしたがってファイル名やtftpサーバアドレスを指定する。

3550のiosはディレクトリが作られていてその中に入っていた。
cd DirectoryNameで移動すれば、show flashでその中が見える。

バックアップを取ったら古いIOSで動いている方に、新しいのを移す。
空き容量は十分にあったので、古いのは残しておく。
copy tftp flash
プロンプトに答える。

IOSをコピーしたら、boot system でiosのイメージを指定する。


Mon Feb 13 07:53:41 2012

cygwinのsyslog-ngが起動できなくなった。

起動しようとすると、/var/log/syslog-ng.log に以下のメッセージが記録される。

Persistent configuration file is in invalid format, ignoring;
検索したら、同じ事で悩んでいる人がいた。

/var/lib/syslog-ng/syslog-ng.persist を削除して解決。
このファイルはなんなのかは不明。
正常終了させないと残ってしまうとかだと思う。

Mon Feb 13 07:55:35 2012

TSHOOTの準備が万全になった感じがするので、明日の予定を今日に変更しようかと思ったが、
さすがに当日の予約はできないようだ。

Mon Feb 13 08:32:07 2012

tftpdのトラブルシュートを再開。
サーバでアクセスすると動作する。
tcpdump してみるとクライアントからのudp 69が届いているから、windowsのファイアウォールなどで
遮断もされていない。
iptablesでudp 69は開けた。iptablesを止めてもだめなのでこのせいではない。

hosts.allowも設定したが変わらない・・・

どっかにログを吐けよ・・・!!

tftp自体は正常に動いている。
tcpdumpをするとちゃんとgetしたファイルを送信している。
しかし、クライアントには届いていない・・・

tcpdumpで見えるということは、iptablesとかhosts.allowとかじゃないよな・・・
わからん・・・サーバを出てからどこかで止められているように思えてならない・・・

2012/02/12

TSHOOT準備

Sat Feb 11 04:23:15 2012

いよいよCCNPになる時がやってきた。
ping-tでTSHOOTの問題を見てみたがけっこう簡単で体験記とかを読んでも皆楽勝みたいなことを書いている。
また、TSHOOTは解いていておもしろい試験だ。
ただし、前回BSCIを取ってから1年程たっていて、BGPとかEIGRPとか忘れていることが多いので復習を要する。

Sun Feb 12 08:57:47 2012

TSHOOTに備えて、Ciscoが公開しているデモや市販の問題集のトポロジをGNS3で再現してみたのだが、
すばらしいソフトである。
ルータを仮想化して本物のIOSで動かすことはdynamipsでできていたことであるが、
GNS3で感心したのはトポロジを直感的に簡単に作り、それをグラフィカルに表示できることだ。

ネットワーク構成図を作るだけなら、Excelとか、PowerPointとか、visioとかでもできるのだが、
GNS3はたんなる図ではなく、動作確認までできてしまう。インタフェース名などは自動的に付与できる。

今後、仕事でも構成図を作るときに使おうかなと考えているくらいだ。

ただ、せっかく作った構成がなぜか消えてしまうことがある。

あと、4台くらいルータを動かすと私のPCはCPU使用率が100%になってしまう。
それでもGNS3自体は問題なく動いているが、ほかのことができなくなる。 

Sun Feb 12 17:35:26 2012

idle pcは使用率が下がらない場合もあって、値を再計算すると下がる場合もある。
だが、dynamipsを使っていたとき、何度やっても下がらないことがあった。

いまだにこのidle pcというものの意味がよくわからない。IOSかdynamipsのバグとしか思えない。
もしかしてIOSを不正利用されないようにわざと仕込まれているのか?

dynamips, GNS3は確かにすばらしい技術であると思うが、ちらほら不具合とかイラつくところがある。
それにやはり仮想化していることによって新たな不具合要因が加わる。

だから私はいつもヤフオクで中古機器を買うのである。
中古機器を買うことも、けっこう勉強になる。

同じcatalystでなぜ値段がこんなに違うのか、とか。
EMIって何?とか、3524ってL3スイッチなの?とか。

2012/02/10

642-813J SWITCH合格

passed...
途中で投げ出したくなった・・・ 

vtpのリビジョン番号

Fri Feb 10 01:32:47 2012

vtp で、「リビジョン番号が高いと、clientモードであってもserverモードの別のスイッチのドメイン情報を更新してしまう」 という問題をやって、ヘーそうなんだと覚えていたが、

実際にやってみたら clientの場合はリビジョンが高くてもserverモードのスイッチのvlan情報は更新されない!

この場合は、「clientモードでリビジョンがserverモードのリビジョンより高い場合、serverモードのスイッチのvlan情報で更新されない」というのが正しい動作である。

リビジョンが高いほうのスイッチのモードをserverに変えると、同期された。

2012/02/09

native vlanについて、その他

Thu Feb 9 19:55:01 2012

"native vlan mismatch"が表示されることがよくある。

Feb 9 19:44:14 192.168.20.101 295: 01:23:47: %CDP-4-NATIVE_VLAN_MISMATCH: Native VLAN mismatch discovered on FastEthernet0/1 (10), with Cata2950_2 FastEthernet0/21 (1).

この時、各interfaceのnative vlanを見るために show interface **** switchportを実行すると、以下のようになっている。

fa 0/1
Access Mode VLAN: 10 (Marketing)
Trunking Native Mode VLAN: 1 (default)

fa 0/21
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 1 (default)

Native Mode VLAN のvlanは両方1で一致している。
違っているのはaccess mode vlanのほうである。

fa 0/1はmode access, fa 0/21はtrunkになっていた。
fa 0/1をtrunkにするか、fa 0/1のaccess vlanを1にするとメッセージは出なくなる。
access - trunk でもinterfaceはupしている。

mismatchが出るということはなんらかの通信はしているはずだ。
一方はaccessだからタグなしで送信し、それをtrunkポートで受信するとnative vlanとみなすがそれが一致しないのか・・・

が、そもそもタグがないのだからnative vlanが何かもわからないのでは・・・?

違った。よくみると、%CDP-4-NATIVE_VLAN_MISMATCH となっている。
これはCDPにより検出されているのだ。

cdp neighborsを見ると、 fa 0/1のNative VLANは10になっていた。

これか......。


「accsessポートとトランクポート間で通信ができるか」

多くの人がNOと答えるであろう。私もNOだと思っていた。
しかし、今見ていると両方ともupしていてSTPの状態もFWDだ。
通信できている...?

が、やってみるとやはり通信できない。
でも両方UPでFWDだから、通信できているかいないかは簡単にはわからない......

access portの場合は所属vlanが異なっていても通信できる。
cdp neighbors detailを見るとnative vlanはそれぞれの所属vlanになっているが、
mismatchにはならない。

私はnative vlanを変更することはまずないので、mismatchが出るときは
trunk - access になっている可能性が高い。

...とすると、trunk - access になっていても所属vlanが同じなら通信できるということか...?


mode access (vlan1) ---- mode trunk (nativeはvlan 1)
の場合、通信できる。

accessポートはタグなしで送信し、trunkポートはnativeに限ってタグなしにするから、
vlan 1についてはお互いタグなしで通信できる。

これがmismatchだと、trunkポートはタグをつけるのでaccess側が破棄し、
accessポートはタグをつけないのでtrunk側はnative vlanとして扱う・・・
そうすると、場合によっては通信ができてしまうか?

port A: mode access (vlan 2) ---- port B: mode trunk (native vlan 1)

このような状態でport Aからport Bにブロードキャストを送信すると、
port Bはそれを受け取ってタグなしフレームなのでnative vlanのvlan 1に転送する。
もしこれがarp requestで、L3のセグメントが同じだったら、replyが返ってくることになり、通信は成立するが、わざわざこのように設定する必要はない。
port Aが複数のvlanの通信を行う必要があるならtrunkにし、vlan 1のみの通信を行うならport Aは対向装置のvlan 1のaccessポートに接続すべきである。

だからやっぱり「mismatch」が出るのは設定ミスが考えられる。
多分、デフォルト状態でケーブルをつなぐとtrunkになって、
その後vlanを設定して片方をaccessに変えたときとかに出るのかな。


access -access, trunk - trunk で使うようにする。
nativeは1になっているからそれを管理用にのみ使用する、ということでよいが

「そもそもなぜnative vlanなどというものがあるのか。」

この問いはネットを探してみてもちらほら見つかるが、
「native vlanにはタグがつかない」という説明しかしていない答えがほとんどで、
 「そもそもなぜそんなものが必要なのか」という答えを明確にしている人がいない。

IEEE802.1qを読めばわかるだろうか?

ある有名なサイトでは「タグをサポートしていないスイッチとの互換性のため」と書いてあった。
多分そうだと思う。

trunkポートで、タグをつけると決めているのにタグをつけないフレームをわざわざ送るのは、trunkポートであっても相手からタグなしフレームがくる場合を想定して、それはnative vlanに所属するものとしよう、 と決めたのではないだろうか。

そうなると相手はタグを処理できないから、trunkポートの側もタグをつけずに送ってやる。
通信はできる。

しかし、タグをつけられないのだから当然そのlanは他のvlanとは区別された
特別なvlanとして扱われると。


Thu Feb 9 21:11:54 2012

ieee.orgへ行ってみたが、standardを読むには会員になる必要がある。
前にも同じことをしてやめたことがあるがこの際だから会員になってみようと、
住所やら経歴を入力するとmemberに登録しましたみたいなメッセージが表示されたが、
$143かかる... やめた、またの機会にしよう。

でも以前、確か802.1Qだったと思うけどPDFかなんかをダウンロードした記憶があるんだよな......
ぜんぜん読まなかったけど。

port-security mac-address

Thu Feb 9 19:44:02 2012

port-securityで、maximum mac addressの数を超えるスタティックアドレス(port-security mac-address)を登録しようとするとエラーになって登録できないが、この場合はviolationにならない。

Windows7でsyslogサーバ




Thu Feb 9 19:19:25 2012

ついでなのでWindows7でsyslogサーバを使用する方法を書いておく。

1.windows用のsyslogサーバをインストールする
2.cygwinを使う
3.virtual pc等を使用してlinuxを入れてsyslogを設定する

2.が一番簡単かつ汎用性がありそうなので2.をやってみる。

cygwinでは、syslog-ng というデーモンが使える。
ただのsyslogは無いようだ。ngとはnext generationの略らしい。

cygwinのセットアップで Adminの中にある。
ちなみに左上に検索窓があるのでsyslogと入れると探せる。

それから cygrunsrvという、サーバを操作するコマンドがあるのでこれも入れておく。

cygwinを起動して

# syslog-ng-config 

を実行すると何か聞かれるので yes と答える。

その後、サービスを起動する。

cygrunsrv -S syslog-ng

この時、cygwinを「管理者として実行」していないと、以下のエラーになる。

cygrunsrv: Error starting a service: OpenService: Win32 error 5:
アクセスが拒否されました。

管理者として実行してサーバを起動する。
/var/log/messages に、syslog-ngが起動したというメッセージが記録されるはず。

この状態では、ネットワーク経由のログを受信できない。
もしWindowsのファイアウォールを有効にしていたら、無効にするか、udp 514を許可する。

そして、/etc/syslog-ng/syslog-ng.conf で、ネットワークからの受信を許可する行がコメントアウトされて無効になっているので、コメントを取る。

# uncomment this line to open port 514 to receive messages
#source(s_network);

サービスを停止し再起動する。

Thu Feb 9 19:22:35 2012

今日初めて知ったのだが、「管理者として実行」は、ショートカットのプロパティを開いて「互換性」のところで「管理者としてこのプログラムを実行する」という設定がある。

642-813J SWITCH 準備 知らなかったコマンド

知らなかったコマンド

3550_1(config-if)#switchport host
switchport mode will be set to access
spanning-tree portfast will be enabled
channel group will be disabled


3550_1#sho interfaces fastEthernet 0/8 switchport
Name: Fa0/8
Switchport: Enabled
Administrative Mode: static access
Operational Mode: down
Administrative Trunking Encapsulation: dot1q
Negotiation of Trunking: Off
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 1 (default)
Voice VLAN: none
Administrative private-vlan host-association: none
Administrative private-vlan mapping: none
Administrative private-vlan trunk native VLAN: none
Administrative private-vlan trunk encapsulation: dot1q
Administrative private-vlan trunk normal VLANs: none
Administrative private-vlan trunk private VLANs: none
Operational private-vlan: none
Trunking VLANs Enabled: ALL
Pruning VLANs Enabled: 2-1001
Capture Mode Disabled
Capture VLANs Allowed: ALL
Protected: false
Unknown unicast blocked: disabled
Unknown multicast blocked: disabled

Appliance trust: none

3550_1(config)#logging trap ?
  <0-7>        Logging severity level
  alerts         Immediate action needed           (severity=1)
  critical       Critical conditions               (severity=2)
  debugging      Debugging messages                (severity=7)
  emergencies    System is unusable                (severity=0)
  errors         Error conditions                  (severity=3)
  informational  Informational messages            (severity=6)
  notifications  Normal but significant conditions (severity=5)
  warnings       Warning conditions                (severity=4)
  <cr>

GLBP

GLBPって何?という人は多いと思う。私は実際に設定したこともないし、「ジーエルビーピー」という言葉を生きた人間が発したのを一度も聞いたことがない。
つまり、使っている人、使ったことのある人を見たことがない。
これに触れるのは、Ciscoの試験勉強をするときだけである。

GLBPというのは Gateway Load Balancing Protocolの略である。
HSRPやVRRPと同様に、FHRP(First Hop Redunduncy Protocol)、ファーストホップルータ冗長のためのプロトコルである。
HSRPとVRRPはほぼ同じ機能といえるが、GLBPが異質なのは、冗長というよりもロードバランスを主要な目的としていることである。

具体的な動作で見ると、AVGとAVFという二つの役割が存在することである。
GはGateway, FはForwarderである。

冗長しない場合、またはルーティングプロトコルやHSRP等での冗長の場合は、"Gateway"と"Forwarder"は同じ装置である。
同じであるから"Forwarder"などという呼び方もしない。

GLBPではAVGはクライアントのarp requestに対して、仮想MACアドレスを返信する。この仮想MACアドレスが、グループに所属する複数のルータ(AVF)に割り当てられており、
AVGは各AVFに割り当てられたMACアドレスを返答する。AVGの役割はarp応答だけであり、トラフィック転送はAVFがおこなうのである。
ただし、AVGというのはあくまでも機能名であって、AVGとなったルータはAVFでもあるから、通常の「ゲートウェイ」と同じように、トラフィック転送もおこなう。 

AVGにはAVFに仮想MACアドレスを割り当てる、という役割もある。
とにかく、ルータのメインの動作であるトラフィック転送機能はない。

ちなみに私が今回入手したCatalyst3550ではglbpは設定できなかった。
しかたがないのでGNS3というdynamipsをGUIで使えるツールを使って7200をシミュレートしたら一応設定できた。
だが実際にロードバランスさせたりなんだりというところまでは見ていない。

「アベイラビリティ」とはよく目にする言葉ではあるが、実際に自分で口に出して「アベイラビリティがないねぇ」などと言う事はちょっと恥ずかしい。
自分に限らず、あまり口に出す人を見ることはない。

アベイラビリティとはどういうことなのか、具体的な例をあげるとどうなるか。
携帯端末でインターネットを利用するときに「ソフトバンクはつながりにくく、ドコモはよくつながる」とよく言われる。
このつながりやすさは「アベイラビリティ」だろうか?

「よくつながるが、遅い」ということもある。iPhoneでwifiを有効にしていると、FONの無料アクセスポイントにつながることが多いが、
多くの場合電波が弱いのか利用者が多いのか、3Gの電波より使い物にならない。「つながりやすさ」はあるのだが、
これを「アベイラビリティがある・高い」と言えるだろうか?

つながりやすさは「アクセシビリティ」だろうか?
だが、「アクセシビリティ」というのはどちらかというと「必要な情報をすぐ参照できる」というような使われ方をする方が多いように思う。 

642-813J SWITCH準備 いろいろ

Tue Feb 7 09:54:52 2012
知らなかったこと

trunkモードのネゴシエーションはdtpドメイン名が異なると行われない

vtp transparent モードでは、vlan情報がrunning-configに保存される 

Tue Feb 7 10:09:01 2012
vrrpにはインタフェーストラッキングの機能がなく、ciscoが独自にオブジェクトによってトラックできるようにしている

Tue Feb 7 17:20:17 2012
aaa newmodel を入力するとvtyアクセスでユーザ名とパスワードを聞かれるようになる

Tue Feb 7 21:08:18 2012
etherchannelのシミュレーションの練習をしていたら、
vlan mask is different
とかいうメッセージが出てチャネルが確立できなくなった。

原因は、etherchannelのメンバーにしようとしたポートで、allowed vlanが設定されていたことであった。

それは気づいたのだが、いったんetherchannelを作った後でポートの設定を直しても、
portchannel IF のほうには設定が残ってしまう。

このようなケースでは、いったんport channelのIFを消して、物理ポートの設定を直してから、
ether channelを作りなおさねばならない。

それにして、portchannelとか etherchannelとかchannel groupとか、
まぎらわしいよね・・・・・・

Wed Feb 8 00:33:39 2012
L2通信、スイッチ、Catalystの使い方を、まったくといっていいほどわかっていなかったことをこの2週間程で思い知った。
だが、L2スイッチなんてハブに毛が生えたようなもんだろ?と思っている人は多いと思う。
私もその一人であった。
だが、Catalystというのはとんでもないバケモノである。
これをデフォルト設定でスイッチングハブのように扱うととんでもないことになる。

私はいまだにL2スイッチはスイッチングハブとして利用すればいいという考えだが、
そうだとしてもCatalystを使うならいろいろと注意しなければいけないことがたくさんある。

Wed Feb 8 18:35:55 2012
SNMP

version 1
GET REQUEST
GET NEXT REQUESt
GET RESPONSE
SET REQUEST
TRAP

version 2
PDUの拡張

追加
GetBulk
INFORM request
Report

version 3
セキュリティ機能の強化
PDUの暗号化


Wed Feb 8 18:51:14 2012
syslog

0: Emergency
1: Alert
2: Critical
3: Error
4: Warning
5: Notice
6: Informational
7: Debug

Thu Feb 9 01:44:29 2012
vrrpのrfcは、2338 (1998) 、3768(2004),5798(2010)
と、現在はver.3 になっている。

Thu Feb 9 01:45:38 2012
hsrpは、1998年の2281

2012/02/05

642-813J SWITCH準備 いろいろ

Sun Feb 5 02:54:05 2012
光ケーブルを買ってきたのでこれでudldの動作確認ができると思ったのだが、ペアになっているコネクタの片方を抜くとlinkdownしてしまう・・・。

Sun Feb 5 03:36:00 2012
スパニングツリーは、その仕組みを知れば知るほどうっとうしい。こんなものは使いたくない。
実際に使われているのだろうか?portfastだのルートガードだの、udldだの・・・・。
少なくとも私が今までいた職場では使われていなかった。
気づかなかっただけで、実際は設定されていたのだろうか・・・。
勉強は順調に進んでいるのだが、こんなことを学んでなんになるのかというむなしさが沸いてきた・・・。

Sun Feb 5 03:40:17 2012
今日思ったのだが、私は「ネットワークエンジニア」というものにはあこがれを感じない。
「ネットワーク」というものは、最近は特にケータイだのスマホだのでインターネットを利用する上で、
誰もがなんとなく重要なものだと感じてはいるだろうが、ネットワークエンジニアというものは所詮は配線屋にすぎないというのが私の認識である。
私がしたいことはもちろん配線ではない。より効率的な通信、より簡単な情報伝達である。
そしてそれは、単に効率的な配線をおこなうとか、ルーティングやアドレッシングによって実現することではない。
もっと総合的な、サービスとしての設計が必要だ。

Sun Feb 5 03:42:28 2012
たとえば、私が今欲しいのは、有線放送がiPhoneで聴ける仕組み。
自分の音楽のライブラリをサーバに置き、さらにそれをサーバ上で再生して、iPhoneなどのデバイスで受信することで聴くというもの。

こういったサービスには明らかにネットワーク、通信の技術を必要とするが、それはあくまでも手段にすぎない。 

Sun Feb 5 03:46:25 2012
もうひとつ考えているのが、iPhoneでWifiを有効にしておくと、あちこちでアクセスポイントが見つかる。
bluetoothも有効にしておいて電車に乗っていると、他人のデバイスが見つかる。
それらはパスワードなどが設定されていて使用はできないのだが、名前くらいはわかる。

この名前の長さはどれくらいなのだろうか?16文字くらいだろうか?
もしそうだとしても、それを随時変更して連続して通知していたら、ある程度の情報として成り立つのではないか?

twitterは140文字という、それまでの常識では少なすぎると考えられていた情報量で世界を制した。

uplinkfast, backbonefast

uplinkfast

Cata2950_2#sho spanning-tree uplinkfast

UplinkFast is enabled

02:45:18: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0020 FastEthernet0/11 moved to Forwarding (UplinkFast).


Station update rate set to 150 packets/sec.

UplinkFast statistics
-----------------------
Number of transitions via uplinkFast (all VLANs)            : 1
Number of proxy multicast addresses transmitted (all VLANs) : 4

Name                 Interface List
-------------------- ------------------------------------
VLAN0001             Fa0/24(fwd)
VLAN0010             Fa0/24(fwd)
VLAN0020             Fa0/11(fwd)
VLAN0030             Fa0/24(fwd)
backbonefast
uplinkfastは即座にFWDになり、メッセージも表示されるが、backbonefastはLIS→LRNを経る。だが、本来ならBPDU消失を検知してからこの移行を実施するので、 それを省略することによりより速い切り替えをおこなう。
Cata2950_2#sho spanning-tree backbonefast
BackboneFast is enabled

BackboneFast statistics
-----------------------
Number of transition via backboneFast (all VLANs)           : 1
Number of inferior BPDUs received (all VLANs)               : 1
Number of RLQ request PDUs received (all VLANs)             : 0
Number of RLQ response PDUs received (all VLANs)            : 1
Number of RLQ request PDUs sent (all VLANs)                 : 1
Number of RLQ response PDUs sent (all VLANs)                : 0

Cata2950_2#sho sp vl 20

VLAN0020
  Spanning tree enabled protocol ieee
  Root ID    Priority    32788
             Address     000b.fdb9.a680
             Cost        19
             Port        12 (FastEthernet0/12)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32788  (priority 32768 sys-id-ext 20)
             Address     0016.9da0.4ec0
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 15

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/10           Altn BLK 19        128.10   P2p
Fa0/12           Root FWD 19        128.12   P2p
Fa0/16           Desg BKN*19        128.16   P2p *LOOP_Inc


Cata2950_2#sho spanning-tree inconsistentports

Name                 Interface              Inconsistency
-------------------- ---------------------- ------------------
VLAN0020             FastEthernet0/16       Loop Inconsistent
loop guard
Cata3550#sho udld gigabitEthernet 0/1

Interface Gi0/1
---
Port enable administrative configuration setting: Follows device default
Port enable operational state: Enabled
Current bidirectional state: Bidirectional
Current operational state: Advertisement - Single neighbor detected
Message interval: 15
Time out interval: 5

    Entry 1
    ---
    Expiration time: 41
    Device ID: 1
    Current neighbor state: Bidirectional
    Device name: CAT0732Z28X
    Port ID: Gi0/1
    Neighbor echo 1 device: CAT0704Z0SX
    Neighbor echo 1 port: Gi0/1

    Message interval: 5
    CDP Device name: SW2

642-813J SWITCH いろいろ

HSRPでinterfaceをtrackして、実際にそのIFがダウンしてpriorityがstandbyルータより小さくなっても、standbyルータ側にpreempt設定がないと、activeルータの交替は起こらない。

これは知らなかった。priorityが逆転したら交替するのかと思っていた。

実際にやってみて確認した。
オークションで買った3550の一台に、期せずしてGBICが2個ついていたので、光ケーブルを買ってきた。 秋葉原の愛三電機で、1m 1890円だった。
show vlan で、 idをつけるとそのvlanだけの情報を表示する。 idなしの場合、trunkポートは表示されないが、idを指定するとtrunkポートも表示される。
知ってた?常識?
etherchannelで、desirable-autoに設定すると、 最初に以下のようなエラーになる。

01:20:34: %EC-5-L3DONTBNDL1: Fa0/48 suspended: PAgP not enabled on the remote port.


が、しばらくまつとネゴが成功する。
どうして?
あー、あれか、STPのせいでFWDになっていないからか。
やってみたが、silentモードであってもやはり auto - auto, on - auto ではチャネルが確立しない。 ガイドを読むと「対向がファイルサーバやネットワークアナライザであってもチャネルを形成できる」などと書いてある。 

2012/02/03

ループガード

loopガード。bpduが途絶えると検知する。
cata1#sho run interface fastEthernet 0/3
Building configuration...

Current configuration : 134 bytes
!
interface FastEthernet0/3
switchport access vlan 10
switchport mode access
spanning-tree portfast
spanning-tree guard loop
end

cata1#
02:48:31: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to down
02:48:32: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to down
02:48:35: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to up
02:48:36: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to up



cata1#sho spanning-tree

VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 10
Address 0016.9da0.4ec0
Cost 19
Port 3 (FastEthernet0/3)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p
Fa0/3 Root FWD 19 128.3 P2p




Cata2950_2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Cata2950_2(config)#no spanning-tree vlan 10
Cata2950_2(config)#end




cata1#sho spanning-tree

VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 10
Address 0016.9da0.4ec0
Cost 19
Port 3 (FastEthernet0/3)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p
Fa0/3 Desg BKN*19 128.3 P2p *LOOP_Inc

cata1#
02:49:47: %SPANTREE-2-LOOPGUARD_BLOCK: Loop guard blocking port FastEthernet0/3 on VLAN0010.
cata1#sho spanning-tree

VLAN0010
Spanning tree enabled protocol ieee
Root ID Priority 32778
Address 000f.90b3.b380
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p
Fa0/3 Desg BKN*19 128.3 P2p *LOOP_Inc

cata1#
cata1#sho spanning-tree interface fastEthernet 0/3 detail
Port 3 (FastEthernet0/3) of VLAN0010 is broken (Loop Inconsistent)
Port path cost 19, Port priority 128, Port Identifier 128.3.
Designated root has priority 32778, address 000f.90b3.b380
Designated bridge has priority 32778, address 000f.90b3.b380
Designated port id is 128.3, designated path cost 0
Timers: message age 0, forward delay 0, hold 0
Number of transitions to forwarding state: 1
Link type is point-to-point by default
Loop guard is enabled on the port
BPDU: sent 2, received 28
cata1#



cata1#show spanning-tree inconsistentports


Name Interface Inconsistency
-------------------- ---------------------- ------------------
VLAN0010 FastEthernet0/3 Loop Inconsistent

Number of inconsistent ports (segments) in the system : 1
「portfastとループガードは同時に設定できない」と、黒本に書いてあり、ciscoのサイトにもそういう記述があったけど、 設定できるぜぇ?
cata1#sho spanning-tree interface fastEthernet 0/3 detail

 Port 3 (FastEthernet0/3) of VLAN0010 is forwarding
   Port path cost 19, Port priority 128, Port Identifier 128.3.
   Designated root has priority 16394, address 000b.fdb9.a680
   Designated bridge has priority 32778, address 000f.90b3.b380
   Designated port id is 128.3, designated path cost 19
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   The port is in the portfast mode
   Link type is point-to-point by default
   Loop guard is enabled on the port
   BPDU: sent 250, received 0
cata1#

ね?

ルートガード

今度はルートガード。

cata1(config)#interface fastEthernet 0/3
cata1(config-if)#spanning-tree guard root
cata1(config-if)#end
cata1#
02:28:26: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port FastEthernet0/3.
cata1#
cata1#
02:28:27: %SYS-5-CONFIG_I: Configured from console by console
cata1#
02:28:39: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to down
02:28:40: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to down
02:28:43: %SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port FastEthernet0/3 on VLAN0010.
02:28:43: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to up
02:28:44: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to up
cata1#
cata1#sho spanning-tree

VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 32778
Address 000f.90b3.b380
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p
Fa0/3 Desg BKN*19 128.3 P2p Peer(STP) *ROOT_Inc

cata1#
cata1#sho spanning-tree inconsistentports

Name Interface Inconsistency
-------------------- ---------------------- ------------------
VLAN0010 FastEthernet0/3 Root Inconsistent

Number of inconsistent ports (segments) in the system : 1
http://www.cisco.com/cisco/web/support/JP/100/1008/1008510_74-j.html

ルートガードはinterfaceで設定する。

ルートガードは文字通り新しいルートブリッジをガードするのだが、
bpduguardも結局は同じ目的だった。

あれかな、bpduguardはルートブリッジでなくてもトポロジ変更があり得るのを防ぎ、
ルートガードはトポロジ変更は許容するがルートの変更は防ぐ、ということだろうか。

bpduguardではinterfaceはerror disableになる。
ルートガードでは upのままであるが、show spanning-tree interface detailで見ると、"broken"となっている。

BPDUガード

portfastを設定したポートにスイッチをつないでループが発生する状況を作ろうと思ったが、どうしてもできない。

ループが発生するのは2つのスイッチで両方spanning treeを無効にした場合だけである。
2つのスイッチのvlan 10に所属する二つのポートをそれぞれportfastに設定して2本のケーブルでつないだら、 全部FWDになってループが発生すると思ったのだが、ちゃんと一個がBLKになる。どうしてだろう・・・?

portfastを設定したことによってループが発生することになる例が思いつかない。

基本的なところから確認していこう。 まず、STPに対応していないL2スイッチを、ループが発生するようなトポロジで、つまり、2本のケーブルで同じセグメントを接続してみたらどうなるか。

1本目のケーブルを接続すると、LIS, LRNを経てFWDになる。 2本目を接続すると、即時BLKとなる。 この、2本目を接続するポートをportfastにしたらループが発生しそうだ。 

やってみよう。 ・・・が、ポートはやはり即時BLKとなる。

Interface Role Sts Cost Prio.Nbr Type

---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p


fa0/1,0/2をともにportfastに設定してSTPに対応していないスイッチングハブに接続したが、ひとつがBLKになり、 ループは発生しない。これでループが発生しないなら問題ないでしょ・・・・

でも、どうして両方portfastにしても片方がBLKになるんだろう? STP未対応のスイッチングハブでも、BPDUは転送するから、ひとつのポートから送信されたBPDUをもう一方で受信することでBLKになるのか。

http://www.cisco.com/cisco/web/support/JP/100/1007/1007812_65-j.html

どうやら、portfastを設定することによりループが発生することにはならないようだ。 portfastを設定することによって問題となる可能性のあるのは、そのポートにL2スイッチを接続してそれがルートになることにより、トポロジに予期しない変化が発生することのようだ。

そこで、bpduguardを設定する。これはグローバルに設定する。 bpduguardを設定した状態で、portfastを設定したポートにSTP対応スイッチを接続すると、 リンクアップするがすぐにerrdisableになる。

cata1(config)#spanning-tree portfast ?
bpdufilter Enable portfast bdpu filter on this switch
bpduguard Enable portfast bpdu guard on this switch
default Enable portfast by default on all access ports

cata1(config)#spanning-tree portfast bpduguard
cata1(config)#end
cata1#
02:19:08: %SYS-5-CONFIG_I: Configured from console by console
cata1#sho spanning-tree



VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 32778
Address 000f.90b3.b380
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p





cata1#
02:19:30: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to up
02:19:30: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port FastEthernet0/3 with BPDU Guard enabled. Disabling port.
02:19:30: %PM-4-ERR_DISABLE: bpduguard error detected on Fa0/3, putting Fa0/3 in err-disable state
02:19:32: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to down
cata1#
cata1#sho spanning-tree

VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 32778
Address 000f.90b3.b380
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 000f.90b3.b380
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg FWD 19 128.1 P2p
Fa0/2 Back BLK 19 128.2 P2p


bpduguardの意味が、やっとわかった。

2012/02/02

ブリッジプライオリティ

STPのBPDUのブリッジプライオリティのフィールドは4ビットである。つまり十進数で0~15までの16段階しかない。
デフォルトのプライオリティは32768である。BPDUには実際のpriorityを4096で割ったものが記録される。
つまりプライオリティは4096の倍数でしか設定できない。
デフォルトの場合、8になる。
プライオリティは「ブリッジID」の先頭4ビットである。

priority (4)
拡張システムID(vlan id) (12)
mac address (48)

STPの種類

初耳

switchport autostate exclude

flex link


Thu Feb 2 10:02:58 2012

STPの種類

PVST(デフォルト)... vlanごとにひとつのSTPインスタンスを持つ。つまり、vlanごとにルートブリッジの選出とポートの役割が決定される。vlanごとにrootブリッジを決め、ブロックされるポートを変えることができる。つまり、負荷分散ができる。

MST ... STPのインスタンスとvlanの対応を任意に設定できる。たとえばvlan 10,20...100と10個のvlanがあったときに、10から50はインスタンス1、60-100はインスタンス2、というように。これにより負荷分散も可能であり、いくつかのインスタンスをまとめることもできる。

2950, IOS 12.1(22)EA13 では、modeは mst, pvst, rapid-pvstのいずれかを設定できる。

cata1(config)#spanning-tree mode ?
mst Multiple spanning tree mode
pvst Per-Vlan spanning tree mode
rapid-pvst Per-Vlan rapid spanning tree mode

MSTにすると、コスト値が変わる。100Mbpsが200000 となる。

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/30 Desg FWD 200000 128.30 P2p
Fa0/47 Desg BKN*200000 128.47 P2p Bound(PVST) *ROOT_Inc
Fa0/48 Desg BKN*200000 128.48 P2p Bound(PVST) *ROOT_Inc

ちなみに上記は、対向装置がpvstの場合である。
Boun というroleは、異なるモードのstpの境界であることを示す。

Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa0/1 Desg BLK 200000 128.1 P2p
Fa0/47 Boun FWD 200000 128.47 P2p Bound(RSTP)
Fa0/48 Desg BLK 200000 128.48 P2p

モードがmstであっても、名前が違うと"Bound"になる。

RSTPとは、pvstのrapid版である。速いpvstである。
どのくらい速いか?
FWD状態のポートをダウンさせると、Roleがaltn, StsがBLKのポートが一瞬でFWDになる。
ダウンしたポートをまたアップさせると、一瞬でステータスが変わる。

なんでデフォルトをrstpにしないんだろうか?

pvst, rstp, mstについては、前回勉強したとき深くやらなかった。
実際に設定して動作を確認することもしなかった。
よく合格したな・・・。

2012/02/01

続続・642-813J SWITCHの準備

catalyst2950とcatalyst3550がある。
3550はL3スイッチなので、vlanにIPアドレスを設定できる。

今、vlan 10に 192.168.10.254/24 というアドレスを振った。
そして、そのvlan 10に所属するポートにcatalyst2950を接続し、catalyst2950に192.168.10.1/24というアドレスを持った装置を接続した。
そして192.168.10.1と192.168.10.254の間で通信をおこなった。

その後、show mac address-table を 3550で実行すると、次のようになる。
All 000b.fdb9.a683 STATIC CPU
All 000b.fdb9.a684 STATIC CPU
All 000b.fdb9.a685 STATIC CPU
All 000b.fdb9.a686 STATIC CPU
All 000b.fdb9.a687 STATIC CPU
All 000b.fdb9.a688 STATIC CPU
All 000b.fdb9.a689 STATIC CPU
All 000b.fdb9.a68a STATIC CPU
All 000b.fdb9.a68b STATIC CPU
All 000b.fdb9.a68c STATIC CPU
All 000b.fdb9.a68d STATIC CPU
All 000b.fdb9.a68e STATIC CPU
All 000b.fdb9.a68f STATIC CPU
All 000b.fdb9.a690 STATIC CPU
All 000b.fdb9.a691 STATIC CPU
All 000b.fdb9.a692 STATIC CPU
All 000b.fdb9.a693 STATIC CPU
All 000b.fdb9.a694 STATIC CPU
All 000b.fdb9.a695 STATIC CPU
All 000b.fdb9.a696 STATIC CPU
All 000b.fdb9.a697 STATIC CPU
All 000b.fdb9.a698 STATIC CPU
All 000b.fdb9.a699 STATIC CPU
All 000b.fdb9.a69a STATIC CPU
All 000b.fdb9.a69b STATIC CPU
All 000b.fdb9.a69c STATIC CPU
All 000b.fdb9.a69d STATIC CPU
All 000b.fdb9.a69e STATIC CPU
All 000b.fdb9.a69f STATIC CPU
All 000b.fdb9.a6a0 STATIC CPU
All 000b.fdb9.a6a1 STATIC CPU
All 000b.fdb9.a6a2 STATIC CPU
All 000b.fdb9.a6a3 STATIC CPU
All 000b.fdb9.a6a4 STATIC CPU
All 000b.fdb9.a6a5 STATIC CPU
All 000b.fdb9.a6a6 STATIC CPU
All 000b.fdb9.a6a7 STATIC CPU
All 000b.fdb9.a6a8 STATIC CPU
All 000b.fdb9.a6a9 STATIC CPU
All 000b.fdb9.a6aa STATIC CPU
All 000b.fdb9.a6ab STATIC CPU
All 000b.fdb9.a6ac STATIC CPU
All 000b.fdb9.a6ad STATIC CPU
All 000b.fdb9.a6ae STATIC CPU
All 000b.fdb9.a6af STATIC CPU
All 000b.fdb9.a6b0 STATIC CPU
All 000b.fdb9.a6b1 STATIC CPU
All 000b.fdb9.a6b2 STATIC CPU
All 0100.0c00.0000 STATIC CPU
All 0100.0ccc.cccc STATIC CPU
All 0100.0ccc.cccd STATIC CPU
All 0100.0ccd.cdce STATIC CPU
All 0180.c200.0000 STATIC CPU
All 0180.c200.0001 STATIC CPU
All 0180.c200.0002 STATIC CPU
All 0180.c200.0003 STATIC CPU
All 0180.c200.0004 STATIC CPU
All 0180.c200.0005 STATIC CPU
All 0180.c200.0006 STATIC CPU
All 0180.c200.0007 STATIC CPU
All 0180.c200.0008 STATIC CPU
All 0180.c200.0009 STATIC CPU
All 0180.c200.000a STATIC CPU
All 0180.c200.000b STATIC CPU
All 0180.c200.000c STATIC CPU
All 0180.c200.000d STATIC CPU
All 0180.c200.000e STATIC CPU
All 0180.c200.000f STATIC CPU
All 0180.c200.0010 STATIC CPU
100 0016.9da0.4ec1 DYNAMIC Fa0/1
100 0080.bd08.978b DYNAMIC Fa0/1
300 000d.0234.faa9 DYNAMIC Fa0/33
300 0016.9da0.4ed1 DYNAMIC Fa0/33
Total Mac Addresses for this criterion: 76
3550は48ポートで、1行目から48行目までは各ポートの持っているMACアドレスである。 それ以降のアドレスは何なのか、不明。

そして最後の4行にあるのが、実際に通信した装置のMACアドレスである。
vlanは100,200,300と作ってある。
200のアドレスはエージアウトして消えているので100,300のものが表示されている。 
さて、vlan 100について、二つのアドレスが表示されている。 このcatalystが通信した相手は1台だけで、そのmac addressは 0080.bd08.978bである。
では、もうひとつの 0016.9da0.4ec1はどこのmac addressか?

これは、catalyst3550と通信した装置の間にある、catalyst2950のポートのmac addressである。
これは衝撃的な事実である。 L3スイッチとあるデバイスが通信したときに、mac address-tableにその間のL2スイッチのポートのmac addressが記録されているとは!

私の中でL2スイッチの動作概念が覆された。
そもそも、2950の各ポートにmacアドレスがあること自体に驚いた。 管理VLANを設定したときにはL3通信をすることになるからそのときのためかなと思ったのだが、
そうではなくてL2通信しかしていないのにmac address-tableには学習されているのだ。
cdpとstpをとめたがやはり表示されている。
2950に2台のデバイスを接続してその間で通信した場合はデバイスのmac addressのみが表示される。

スイッチ間を接続すると、対向ポートのmacを学習するようだ。
l2,l3によらず。
でも、たとえスイッチ間を接続してその間でフレームを転送する必要があるとしても、 通信に必要なmacアドレスはエンド同士のみのはずだから、
やはりスイッチのポートのaddressを覚えるのはcdpなどのようなスイッチ間の通信のためではないだろうか?
ポートをキャプチャしてみると、cdp, stp, そしてloop というフレームが送信されている。 loopというのは、type 0x9000で、cdpとは違うものである。
この3つを全部とめれば、さっきの対向ポートのmac学習はしなくなった。
ちなみにloopを止めるにはinterfaceで no keepaliveを設定する。

また今更シリーズ。
catalyst2台を、それぞれvlan 10, vlan 20と二つのvlanに区切り、その2台を接続する。
やり方は2つある。
ひとつは、同じvlan同士をケーブルでつなぐ。vlanの数だけケーブルが必要になる。当然、ポートも。
もうひとつは、トランクポートを作って、スイッチ間を1本のケーブルで接続する。
こうすればvlanがいくつになってもケーブルは1本でよい。

これがトランクの使い方であるが、私はいつもvlan間直接接続方式にしていた。
つい最近、職場で3~4台のcatalystをつないだときもそうしていて、ポートが足りないと悩んでいたが、トランク接続すればよかったのだ。

ただし、一本のリンクで複数vlanをまとめるのだから当然帯域はきつくなる。
私の職場も、帯域はけっこうシビアだったのでこれでよかったのかもしれないが、
それをわかってやっていたわけではなかった。

L2スイッチについては、誤解や無知の部分がけっこうある。
STPとかが苦手なのも根本的にL2の通信についての理解不足が原因かもしれない。

2012/01/29

続・642-813J SWITCHの準備 スイッチの本質

いろいろあって中断していましたが、再開します。
黒本の前にガイドを読んで再整理です。

以前、「ルータとはデバイス同士の接続を切断する装置である」と書いたことがあるが、それはL2スイッチにも言える事である。

L2スイッチは、コリジョンドメインが各ポートごとに存在する。そのポートにデバイスが接続されていれば、そのデバイスはそれぞれ別のコリジョンドメインに所属する。

たとえば10個のポートを持つL2スイッチのすべてのポートに1台ずつPCを接続した場合、コリジョンドメインは10個に分離されることとなる。

そういう意味で「L2スイッチも接続を切断する」と言えるが、その切断のしかたはルータとは異なる。

ルータはブロードキャストドメインを切断するので、適切なルーティングをおこなわないとノード間で通信ができない、という意味での切断である。

L2スイッチの場合は、受信する必要のないフレームを受信しなくてすむ、という消極的な切断である。だから、ハブで接続していたのをスイッチに置き換えたからといって、各ノード間で通信ができなくなることはない。


ハブとL2スイッチの違いを示す具体的な例をあげると、

たとえばオフィスのある島で10人がひとつのハブ(バカハブ)に接続してメールの送受信をしていたとすると、ある人のpopアクセスのやりとりを別の人が自分のPCのNICをキャプチャすることで覗き見ることができる。
実際に私はそのような状況で、他人のパスワードを盗み見たことがある(メールは読んでない)。

ハブをL2スイッチに置き換えることの利点は、主に不要なフラッディングをなくして、ネットワークの利用効率を上げることである。
つまり、「遅くならない」ようにする。ハブのときと比べると「速くなった」と感じるかもしれない。
「L2スイッチの方が高性能だから転送が速い」ということではなく、余計なフレームの送受信が減ったために相対的に速くなったように感じるのみである。


「トランスペアレントブリッジ」って何だ?

「ルートキャッシング」、「トポロジベース」について


「ルートキャッシング」というのは、一度転送をおこなったらそれをキャッシュに残しておき次回はそれを参照する、というもののようだ。

「トポロジベース」というのは、個々のフローに応じて転送を行うのではなく、ネットワークトポロジを格納しておりそれを参照して転送をおこなうもの。そのトポロジとは、つまりルータのルーティングテーブルのようなものであろう。しかし、どうしてルーティングテーブルと呼ばないのか?ルーティングじゃないから、か。では「ルーティング」と「L3転送」の違いは?

これについて納得いく説明はできないし聞いたこともない。


スパニングツリー・・・。
トラウマになっていると言っていいくらい、苦手である。
実際に使ったこともないし。

VTPにしても、etherchannelのネゴにしても、STPにしても、あまり必要性を感じない。
どれもしっかり設計・管理すれば不要な機能である。
むしろ、ネットワークの変化に動的に対応すると予想しない動作をしてよくないのではないだろうか?
きっとそういうポリシーの人もいるだろう。


etherchannelの silent modeというのは、前回BCMSNを受験したときにはなかったトピックである。
最近追加された機能なのだろうか?

このモードはデフォルトで有効であり、この場合相手からネゴシエーションをされなくてもetherchannelが有効になるとのことである。

となると、デフォルトではもしかして、on/auto/desirableのどの組み合わせでも有効になるのではないか?

この辺は実機で確認せねばなるまい。
catalyst2950を3台オークションで買った。1万円もしない。
前回、もう3年くらい前は、たしか1台1万くらいじゃなかったかな?


ブリッジングループの発生メカニズムについては、前回の試験でもよく読んだし、自分でも納得済みのことであるが、大事な原則なので、あらためて確認しておく。


switch A, BがともにPC1, PC2からのフレームを未受信でアドレス学習をおこなっていない状態であるとする。

このときPC1はPC2のMACアドレスを知っているとする。

2台のSwitchがフレーム未受信で、PC1がPC2のMACアドレスを知っている状態というのは、
PC1がarpによりPC2のMACを学習した後、PC1とPC2の間の通信がなくSwitchA,Bのアドレス学習のみエージアウトし、しかしPC1のarpテーブルはエージアウトしていないような場合が考えられる。
あるいは、あまりないがPC1でスタティックにarpテーブルを設定した場合。

その状態でPC1からPC2あてに「フレーム」が送信されたときの話。

「フレーム」というのは、送信されるデータをLayer2で捉えたときの呼び方である。それはpingのecho requestであるかもしれない。それは普通「パケット」と言う。イーサヘッダが先にあって、その後にIPヘッダがつく。フレームとして考えるとIPヘッダは「フレームのデータの一部」ということになる。

pingしたときにパケットキャプチャすると、イーサヘッダも見える。実際にノードやスイッチが送受信しているものはイーサヘッダまで含んだ「フレーム」である。

「パケット」という時は、イーサヘッダ以降の部分、つまり、フレームの一部を指す。

イーサネットフレームの最大長は1518オクテット(VLANタグも含めると1522)、
IPパケット(ヘッダ+データ部)の最大長は65536バイトである。

「バイト」と「オクテット」であるが、これは両方8ビットなので同じことなのだが、L2では「オクテット」と呼ぶことになっている。
これはなぜかというと、昔は1バイトが8ビットではない場合があったためだそうだ。

というわけで、IPパケットはフレームの一部分なのであるが、IPパケットの方が最大長が大きいため、フレームに収まらない場合がある。そのときは分割して送信する。


ちょっと話がそれて基本的なことの確認になってしまったが久しぶりなので許して欲しい。


さて、PC1からPC2にフレームが送信される、ということであった。

どのようなフレームであるかはどうでもいいのだが、なるべく具体的なイメージがつかめるように、
pingのecho requestのIPパケット(を含むフレーム)であったとしよう。

pingはサイズ指定できるがそれをせずに64バイトの普通のpingだったとしよう。つまり、フレームも1個であった。

アドレス解決は済んでいたので、arp requestも送信されず、いきなりecho requestが飛んだ。

MACアドレスは PC1が 0001.0001.0001, PC2が0002.0002.0002だったとする。

送信されるフレームヘッダにはSRC:0001.0001.0001, DST:0002.0002.0002 と書かれている。

Switch Aが、port1でこのフレームを受信した。
ヘッダを見る。まずport1とPC1のMACアドレス 0001.0001.0001を記憶する。
次に、あて先を見る。0002.0002.0002は初見あるいはかつて学習したがエージアウトして今は宛先(どのポートから送信するか)が不明なアドレスである。

このときSwitchは受信したポート以外のすべてのポートからフレームを送信する。これをフラッディングという。
送信するフレームは受信したフレームとまったく同じものである。

SwitchBは、port2とport3でまったく同じフレームを受信する。
このときはどうなるのかな・・・同時に送られるのだがSwitchがアドレス学習をするのはひとつずつだろうから、後から受信したフレームで学習したアドレスを記憶するのだろうか(不明)。

この場合は「port3がPC1へ送信するポートである」と学習したとする。
SwitchBもPC2のMACアドレスを知らないため、フラッディングする。フラッディングされるポートはどこか?port1のみか?

これはちょっとややこしい。

SwitchBがport2でフレームを受信した瞬間に、宛先へのフラッディングをおこなう。このときはport1,3から送信される。

だがほぼ同時にport3でも同じフレームを受信している。
このときのSwitchの動作はどういう順序でおこなうのか?

port2でのフレーム受信→port1とport3からのフラッディング→port3でのフレーム受信→port2とport1からのフラッディング

だろうか?

あるいはフラッディングの前に後からのフレーム受信処理が割り込むことがあるだろうか?

port2でのフレーム受信→port3でのフレーム受信
→por2とport1からのフラッディング


それは気になるが、いずれにせよ、SwitchBはport2とport1からフラッディングすることになる。
フラッディングしているフレームはPC1からPC2宛てに送信されたものであった。

SwitchAは、macアドレスとポートの対応表を更新することになる。
PC1はport2に接続しているということになってしまうのである。



・・・「だからループが発生してしまうのでSTPが必要なんですね?」
と考えるのは、これからSTPを学ぶということになっているからであるが、

「L2スイッチのアドレス学習に問題があるんじゃないですか?」
と言う人がいてもおかしくないだろう。
ブリッジングループが発生しないようなアドレス学習方法はないだろうか?

STPはアドレス学習方法そのものは変更せずにループを防ぐ方法であるが、
アドレス学習方法そのものを改良できないだろうか?

これはCCNP試験の範囲から逸脱するどころの脱線ではないがちょっとだけ考えてみよう、せっかくだから。

まず思いつくのは、フレームを異なるポートから受信したからといって即そのポートに接続先が変わったとみなすのをやめてはどうか、という事だ。

でもそれをしないと接続ポート変更にどうやって対応するのか、ということになる。
たとえば1回受信しただけでは更新しないとか、直後(一定の時間内)なら更新しないとか・・・

フラッディングするフレームには印をつけるとか・・・。
たとえ学習済みのsrc macアドレスのフレームであってもフラッディングされたものであったら更新しない。

いちいちフラッディングされたかを確認しなければならないということを除けばうまくいきそうに思えるが・・・


ループ発生の根本的な原因はフラッディングにある。
フラッディングとは要するにフレームの複製である。本物のフレーム以外のニセモノが複数作成されてしまうのだ。これが実際に接続していないポートに接続していると誤認してしまう原因だ。

では、このフラッディングをやめてはどうか?
つまり、送信先のアドレス学習をしないのである。
これはダメか・・・。
同じスイッチの二つのポートに通信をおこなう装置が接続されていれば双方が何か送信すれば通信がおこなえるが、スイッチ同士を接続したらその間の通信がいつまでたってもできなくなる。
ルーティングのように、macアドレスを広告しなければならなくなる。


今更だが「ハブとスイッチの違い」を調べた。
ハブというのは、全部フラッディングする装置である。
スイッチは、アドレス解決のためにフラッディングをする、というよりは、
受信フレームのsrc MACとポートを記憶しておくことにより、余計なフラッディングをしないようにしたのだ。

通信というのはあたかもケーブルの中を小包のようなものが流れていくようなイメージがあり実際にそのように説明されることが多いが、あれは全部コピーなのだ。あるパソコンからパケットは、スイッチに到達するとそこでコピーして違うポートから送信される。それがルータに到達したら今度はルーティングなどの処理をおこなってまた別のインタフェースからコピーして送信される。

通信とは複製なのであった。
今更過ぎるか・・・・


「ハブ」「ブリッジ」「スイッチ(スイッチングハブ)」の違い。

ごく少数の装置を「つなげる」だけであれば、この3つは区別がつかないだろう。
もっとも、今ではハブやブリッジを入手することは困難である。
(もう製造されていないか?)

ハブとスイッチの違いは比較的わかりやすいが、ブリッジとスイッチは難しい。私は今説明できない。
昔、後輩に聞かれたことがあるがちゃんと答えられなかった記憶がある。
今もネットを探すと「同じと考えて差し支えない」みたいな人も多い。

簡単に言ってしまうと「スイッチ」とは「高性能なブリッジ」ということになる。

ブリッジという装置が登場したときは、2ポートしかなかったそうだ。
各ポートにハブをつないで使っていたのか。

やがて2つじゃ少ないというので、「マルチポートブリッジ」が登場した。
しかしこれはただブリッジをくっつけただけで、動作原理はブリッジとまったく同じだった。

それが「スイッチ(スイッチングハブ)」と呼ばれるようになったのは、どのような革新があったからなのか。


初期の2ポートのブリッジは、10Base2とか10Base5とかのバス方式で使われていた。
バス方式というのはもう見かけないが、一本のケーブルに複数のノードがぶら下がる方式だ。

バス方式では全二重通信ができない。
これは同軸ケーブルを使っていたためである。

それは置いといて、ブリッジとスイッチの一番本質的な違いは何か?
名前からして、ブリッジは架け橋、接続するものであり、スイッチは単なる接続ではなく、切り替えつまり選択する機能を持つ。となるとやはり「マルチポートである」ということだろうか?

HW処理とSW処理というのは確かに大きな違いで転送速度などにも大きく影響するだろうが、動作原理の違いという観点からすると本質的な違いではない。

転送方式の違いつまり全部読み込む前に転送を開始する、というのも革新的なことではあっただろうが、やはり機能改善にすぎず本質的な違いではないように思う。

ちょっと深入りしすぎたかな・・・
これくらいにしておくか・・・

やっぱりマルチポートであることですかね。
3つ以上になるということは、右から左へ受け流すだけではなく、受け取ったフレームを残る2つ(またはそれより多く)のポートのどこから送出するかを判断する必要がある。

わかった!!!

初期のブリッジは2ポートであった、これが重要である。
そして、ブリッジもL2スイッチと同様のフラッディングによるアドレス学習をおこなうのであるが、
そもそも2ポートしかないのだから、出口は一個しかなくて選択の余地がないから全部そこへ送ってしまえばよさそうなものである。
でも、それではハブと変わらない。
ブリッジがアドレスを学習するのは、出力ポートの選択が目的ではないのである。
目的は、不要なフラッディングをしないようにすることである。

アドレス学習の原理はブリッジとスイッチで変わりなく、その目的も不要なフラッディングの防止ということで同じである。
しかし、マルチポートになったことによって、本来は単なる不要なフラッディングの防止のためでしかなかったアドレス学習に、出力ポートの選択という新たな目的が加わったのである。

そうなると、マルチポートブリッジの機能は複数のコリジョンドメインを接続(本当は分離なのだが)するというよりも、複数のコリジョンドメイン間でフレームの出力先を判定して振り分ける機能が主要になった。それによって、「ブリッジ」という呼び名が「スイッチ」となったのである。

私はまずスイッチからその動作原理を学習し始め、そのときに「アドレス学習は出力ポート選択のため」と認識していたのだが、実はこれは副次的な目的であって、主目的はやはり「不要なフラッディングの抑制」なのだった。

やはり、通信機器というのは、その機能するレイヤーが上位に行くほど、通信が抑制される。
基本は全コピー。なんでもかんでもコピーしてばらまく。そうすればとりあえず届く。

でもそうすると余計な送受信が発生するので、それを減らすような装置が必要となり、スイッチやルータが登場した。

これで整理がついた。

こんなのは当たり前なのかもしれないが、ちゃんと説明できる人はすごく少ないと思う。
少なくとも私は納得のいく説明を聞いたことがない。

以前、「スイッチはネットワークを拡大する装置だ」なんてことを書いた記憶があるのだが、それは大きな間違いであった。
スイッチの目的はコリジョンドメインの分離であった。

2012/01/26

IEからchromeへ

アマレクTV、録画もできる。

IE派の私であったが、最近chromeに変えた。IEは8まで使っていたがいまひとつで、待望していた9はWindows7でないと使えない上に、ベータか何かを使ったときにchromeとそっくりだったので、だったらchromeを使おう、ということになった。

IEは、アドレスバーとタブが横に並んでいるため、たくさんページを開くとどんどんアドレスバーが狭くなる。 アドレスバーは検索窓も兼ねるようになったため、これは不都合である。 chromeはタブがアドレスバーの上にあるので重ならない。

そして、Windows7を使い始めたのでIE9を久しぶりに使ってみたのだが、やっぱり遅い。 というか、chromeがクソ速い。それはchromeが出た直後にも驚いたことなのだが、改めて思い知った。firefoxは、使わない。

2012/01/05

saslauthd

sshdのポート番号を変えました。ピタリと止んだ(というか、見えなくなっただけか)。
ドメインをもう一個とって、マルチドメインとした。 レンタルサーバを借りたのだが、VPSでマルチドメインにすればいいと気づいてキャンセルした。 httpd.confの一番下にコメントアウトされている<VirtualHost>セクションがあるので、 そこでDocumentRootのフォルダ名やログファイル名を設定する。 DocumentRootのフォルダを作成する。 取得したドメインのAレコードのアドレスをVPSサーバのアドレスにする。 DocumentRootにファイルを置く。 httpdをrestartする。 これだけ。

saslauthdのログがsecureに・・・なんだこれ ?

そもそもsaslauthdって何だ? 停めようかな・・・

Sat Jun 16 16:12:41 2012

停めた。