無料ブログはココログ

« 2004年9月 | トップページ | 2004年12月 »

【C#】 ショートカットファイルを作るには

ここを参考に。

  1. ソリューションエクスプローラの「参照設定」で「参照の追加」 COM タブにある Windows Script Host Object Model (wshom.ocx) を追加
  2. すると obj ディレクトリに IWshRuntimeLibrary.dll ができる ildasm というツールでこの中身のシンボルをブラウズできる
  3. 後は,次のようなコードを書けばいい
using IWshRuntimeLibrary;
private void CreateShortcut(string filename, string shortcutPath, string iconPath, string description)
{
    IWshShell_Class TheShell = new IWshShell_Class();  
    IWshShortcut_Class shortcut = 
        (IWshShortcut_Class)TheShell.CreateShortcut(shortcutPath);
    shortcut.TargetPath = filename;
    shortcut.IconLocation = iconPath;
    shortcut.Description = description;
    shortcut.Save();
}
...
    string sep = Path.DirectorySeparatorChar.ToString();
    string desktopPath = 
        Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    CreateShortcut( "foo.exe",  // 元のファイルのパス名
                    desktopPath + sep + "bar.lnk", // ショートカットのパス名
                    "icon.ico", // アイコンのパス名
                    "comment"); // コメント

【GMPLS】 11. JuniperのGMPLSまとめ

11. JuniperのGMPLSまとめ

JUNOS6.4時点でのJuniperの実装をまとめると次のようになります。

  • LMPはスタティック。動的な情報交換はできないので、remote-idは手動で設定しないといけない。
  • LMPを使うときには一つ以上のコントロールチャネルが必要。
  • コントロールチャネルはpoint-to-pointでなければならない(GREトンネル可)。
  • コントロールチャネルに通常のRSVP、OSPFを流してはならない。
  • LMPのte-linkの中には複数のリソース(物理インタフェース)を含めることができる。
  • te-link中のリソースにもアドレスを割り当てられるが、使い方が不明。
  • OSPFとRSVPはpeer-interface設定でLMP情報を吸い上げる。
  • OSPFはトラフィックエンジニアリングが必須。そうしないとOpaque LSAが流れない。
  • パケットのLSPはUnidirectional。非パケットのLSP(TDM、波長、ファイバ)は自動的にBidirectionalになる。
  • 非パケットのLSP(TDM、波長、ファイバ)でもCSPFに対応。strictでなくてもよい。
  • 作成するLSPのタイプとしてpsc-1を選ぶと、LSPが張れない。その他(tdm, lambda, fiber)にすれば作成可能。
  • non packetのLSPの使い方がイマイチ分からない。

次の項目は対応していません。

  • ダイナミックLSP
  • Graceful restart
  • アンナンバードリンク上のRSVP-TE
  • GMPLS対応のIS-IS
  • GMPLSリンクバンドリング

【GMPLS】 10. 再実験

10. 再実験

いろいろと失敗を重ねているうちにだいぶ理解が深まりまってきました。 デバッグ性を重視して無理してイーサで押し通してきましたが、やはり光で攻めた方がいいようです。 改めて実験構成を作ってみました。

コントロールチャネルにはGREトンネル(gre.0)を使用し、192.168.250.0/24を割り当てます。 データチャネルにはso-0/1/1を使用します。

データチャネルの物理インタフェースにはIPアドレスを割り当てません。 不要だからです(もちろん管理用として割り当てることはできます)。 とは言っても、RSVPでLSPを作成するときに「どこを通すのか」指定しなければいけませんから、 LMPのte-linkにアドレスを割り当てます。 ここではR1側に10.1.3.1を、R2側に10.1.3.2を割り当てます。 ネットワークセグメントではないので、飛び飛びのアドレスで構いません。

te-linkの中には複数のリソース(物理ポートやタイムスロット、波長)を含めることができます。 この場合はso-0/1/1です。 te-link中のそれらリソースにもIPアドレスを割り当てる事もできるのですが、 Juniperでは使い方が分からないので、ここでは割り当てません。

順番に設定を見ていきます。最初はR1のインタフェース設定(↓)です。 so-0/1/1にIPアドレスを割り当てていない事に注目してください。

gsi@R1# show interfaces
fe-0/0/0 {
    speed 100m;
    mtu 1500;
    link-mode half-duplex;
    unit 0 {
        family inet {
            address 192.168.1.1/24;
        }
        family mpls;
    }
}
so-0/1/1 {
    description "Data channel";
    clocking internal;
    encapsulation ppp;
    sonet-options {
        rfc-2615;
    }
}
gre {
    unit 0 {
        tunnel {
            source 192.168.1.1;
            destination 192.168.1.2;
        }
        family inet {
            address 192.168.250.1/24;
        }
        family mpls;
    }
}

次にR1のLMPの設定(↓)です。 te-r1-r2という名称でte-linkを作成しました。 R1側は10.1.3.1を、R2側は10.1.3.2を割り当てています。 te-linkの中には物理インタフェースを複数組み込むことができます。 物理インタフェースの中にもlocal-address、remote-address設定がありますが、これは不要です。 remote-idは、show link-managementコマンドで調べた値を設定します。

peerの設定は前回の実験のときと同じです。

link-management {
    te-link te-r1-r2 {
        local-address 10.1.3.1;
        remote-address 10.1.3.2;
        remote-id 45787;
        interface so-0/1/1 {
            remote-id 22276;
        }
    }
    peer r2 {
        address 192.168.254.2;
        control-channel gre.0;
        te-link te-r1-r2;
    }
}

続いてRSVPとOSPFの設定です。 peer-interface設定でLMP情報をプロトコル側に供給するようにしています。 コントロールチャネルのインタフェースgre.0でRSVP、OSPFを動かしてはいけません。

注目はOSPFでtraffic-engineering設定を加えていることです。 マニュアルには書いてありませんが、これがないと動きません。

rsvp {
    interface fxp0.0 {
        disable;
    }
    interface gre.0 {
        disable;
    }
    peer-interface r2;
}
ospf {
    traffic-engineering;
    area 0.0.0.0 {
        interface lo0.0;
        interface fxp0.0 {
            disable;
        }
        interface fe-0/0/0.0;
        peer-interface r2;
    }
}

ここまでの設定で、LMP、OSPF、RSVPが機能します。

show ospf databaseコマンドの結果から、エリアローカルのOpaq LSAが生成されていることが分かります。 show ted databaseコマンドの結果からは、 トラフィックエンジニアリング用のPoint-to-Pointの仮想リンクが確認できます。 te-linkに割り当てたアドレスがキチンとTEDに反映されています。

gsi@R1# run show ospf neighbor
  Address         Interface             State      ID              Pri  Dead
192.168.1.2      fe-0/0/0.0             Full      192.168.254.2    128   34
192.168.250.2    r2                     Full      192.168.254.2    128   39

[edit]
gsi@R1# run show ospf database

    OSPF link state database, area 0.0.0.0
 Type       ID               Adv Rtr           Seq      Age  Opt  Cksum  Len
Router  *192.168.254.1    192.168.254.1    0x8000002f   589  0x2  0x8a77  48
Router   192.168.254.2    192.168.254.2    0x8000003e   205  0x2  0x806e  48
Network *192.168.1.1      192.168.254.1    0x80000009     2  0x2  0x6a3f  32
OpaqArea*1.0.0.1          192.168.254.1    0x80000024   589  0x2  0x4811  28
OpaqArea 1.0.0.1          192.168.254.2    0x80000031   805  0x2  0x3218  28
OpaqArea*1.0.0.3          192.168.254.1    0x80000026   589  0x2  0x29f6 164
OpaqArea 1.0.0.3          192.168.254.2    0x8000002e   505  0x2  0xf423 164

[edit]
gsi@R1# run show ted database
TED database: 0 ISIS nodes 3 INET nodes
ID                            Type Age(s) LnkIn LnkOut Protocol
192.168.1.1-1                 Net    7373     0      2 OSPF(0.0.0.0)
    To: 192.168.254.1, Local: 0.0.0.0, Remote: 0.0.0.0
    To: 192.168.254.2, Local: 0.0.0.0, Remote: 0.0.0.0
ID                            Type Age(s) LnkIn LnkOut Protocol
192.168.254.1                 Rtr    5634     2      1 OSPF(0.0.0.0)
    To: 192.168.254.2, Local: 10.1.3.1, Remote: 10.1.3.2
ID                            Type Age(s) LnkIn LnkOut Protocol
192.168.254.2                 Rtr    5444     2      1 OSPF(0.0.0.0)
    To: 192.168.254.1, Local: 10.1.3.2, Remote: 10.1.3.1

[edit]
gsi@R1#

続いて、MPLSの設定です。

mpls {
    no-cspf;
    interface all;
    interface fxp0.0 {
        disable;
    }
}

ずいぶん簡単になってますが、これはLSPの設定をしていないからです。 GMPLSのLSP(TDM、波長、ファイバ)は基本的に双方向です(パケットは唯一、単方向)。 なので、R1とR2のどちらかでLSPを設定すればよいことになります。 ここではR2側からLSPを作成してみます。 R2から見ると、通したい場所はte-linkのR1側の部分、すなわち10.1.3.1です。

mpls {
    no-cspf;
    label-switched-path gmpls-1 {
        from 192.168.254.2;
        to 192.168.254.1;
        lsp-attributes {
            signal-bandwidth stm-1;
            switching-type tdm;
            gpid ppp;
        }
        primary gmpls-path-1;
    }
    path gmpls-path-1 {
        10.1.3.1;
    }
    interface all;
    interface fxp0.0 {
        disable;
    }
}

この設定により、gmpls-1と名付けたLSPがアップします。

gsi@R2# run show mpls lsp
Ingress LSP: 1 sessions
To              From            State Rt ActivePath       P     LSPname
192.168.254.1   192.168.254.2   Up     0 gmpls-path-1     *     gmpls-1 Bidir
Total 1 displayed, Up 1, Down 0

Egress LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

Transit LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

[edit]
gsi@R2# run show rsvp session detail
Ingress RSVP: 1 sessions

192.168.254.1
  From: 192.168.254.2, LSPstate: Up, ActiveRoute: 0
  LSPname: gmpls-1, LSPpath: Primary
  Bidirectional, Upstream label in: 0x5706, Upstream label out: -
  Suggested label received: -, Suggested label sent: 0x5706
  Recovery label received: -, Recovery label sent: 0x5706
  Resv style: 1 FF, Label in: -, Label out: 0x5706
  Time left:    -, Since: Wed Oct 13 14:04:14 2004
  Tspec: rate 0bps size 0bps peak 155.52Mbps m 20 M 1500
  Port number: sender 1 receiver 26873 protocol 0
  PATH rcvfrom: localclient
  Adspec: sent MTU 1500
  PATH sentto: 192.168.254.1 (r1) 139 pkts
  RESV rcvfrom: 192.168.254.1 (r1) 139 pkts
  Explct route: 10.1.3.1
  Record route:  10.1.3.1
Total 1 displayed, Up 1, Down 0

Egress RSVP: 0 sessions
Total 0 displayed, Up 0, Down 0

Transit RSVP: 0 sessions
Total 0 displayed, Up 0, Down 0

[edit]
gsi@R2#
gsi@R2# run show route forwarding-table family mpls
Routing table: mpls
MPLS:
Destination        Type RtRef Next hop           Type Index NhRef Netif
default            perm     0                    dscd    24     1
0                  user     0                    recv    23     3
1                  user     0                    recv    23     3
2                  user     0                    recv    23     3

[edit]
gsi@R2#

このLSPは双方向ですから、R1側からみても、このLSPはアップします。

gsi@R1# run show mpls lsp
Ingress LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

Egress LSP: 1 sessions
To              From            State Rt Style Labelin Labelout LSPname
192.168.254.1   192.168.254.2   Up     0 1 FF  0x5706        - gmpls-1 Bidir
Total 1 displayed, Up 1, Down 0

Transit LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

[edit]
gsi@R1#

かなり苦労しましたが、無事にGMPLSのLSPが作られました。

データチャネルの物理リソースを追加してみる

ここまでの設定ですと、GMPLSのLSPを1本張ると終わってしまいます。 せっかくですので、データチャネルを追加してみましょう。 やり方、というか考え方は2通りあります。 一つは、te-linkの中に物理リソースを追加していく方法、 もう一つはte-linkごと新しく用意する方法です。

前者の場合、同じte-linkを使用して何本もLSPを作成できます。 つまり、10.1.3.1というアドレスを通るようにLSPを作成すると、 そのte-linkに含まれる物理リソースの中から空いているものを自動選択してくれるわけです。 実際にどの物理ポートを通るかは、 そのときのタイミング次第になってしまいますが、 管理する側としては、この方が便利だと思います。

後者の場合、どの物理リソースを通すのか人間側できちんと管理したい場合に使用します。

ここでは前者の場合、すなわち既存のte-linkの中に物理リソースを追加する方法をとってみたいと思います。 追加するのはso-0/1/3です。ここでも物理インタフェースにIPアドレスは不要です。

so-0/1/3 {
    description "Data channel";
    clocking internal;
    encapsulation ppp;
    sonet-options {
        rfc-2615;
    }
}

後は、te-linkの中にso-0/1/3を追加するだけです。

link-management {
    te-link te-r1-r2 {
        local-address 10.1.3.1;
        remote-address 10.1.3.2;
        remote-id 45787;
        interface so-0/1/3 {
            remote-id 22278;
        }
        interface so-0/1/1 {
            remote-id 22276;
        }
    }
    peer r2 {
        address 192.168.254.2;
        control-channel gre.0;
        te-link te-r1-r2;
    }
}

R2側からLSPを追加してみたいと思います。ここでは2本追加して、合計3本設定してみます。

mpls {
    no-cspf;
    label-switched-path gmpls-1 {
        from 192.168.254.2;
        to 192.168.254.1;
        lsp-attributes {
            signal-bandwidth stm-1;
            switching-type tdm;
            gpid ppp;
        }
        primary gmpls-path-1;
    }
    label-switched-path gmpls-2 {
        from 192.168.254.2;
        to 192.168.254.1;
        lsp-attributes {
            signal-bandwidth stm-1;
            switching-type tdm;
            gpid ethernet;
        }
        primary gmpls-path-1;
    }
    label-switched-path gmpls-3 {
        from 192.168.254.2;
        to 192.168.254.1;
        lsp-attributes {
            signal-bandwidth stm-1;
            switching-type tdm;
            gpid ethernet;
        }
        primary gmpls-path-1;
    }
    path gmpls-path-1 {
        10.1.3.1;
    }
    interface all;
    interface fxp0.0 {
        disable;
    }
}

すると、次のように最初の2本は作成できますが、3本目は弾かれてます。 リソースが足りないからです。

gsi@R2# run show mpls lsp
Ingress LSP: 3 sessions
To              From            State Rt ActivePath       P     LSPname
192.168.254.1   192.168.254.2   Up     0 gmpls-path-1     *     gmpls-1 Bidir
192.168.254.1   192.168.254.2   Up     0 gmpls-path-1     *     gmpls-2 Bidir
192.168.254.1   192.168.254.2   Dn     0 -                      gmpls-3 Bidir
Total 3 displayed, Up 2, Down 1

Egress LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

Transit LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

[edit]
gsi@R2#

以上のように、GMPLSのLSP作成は簡単にできることがわかりました。

最終的な設定 ( R1  R2)

コントロールチャネル上でモニターしたEtherealの データ

このLSPはどうやってつかうの?

それが目下の課題です。CCCを使うにはPSCじゃないとダメなので、このLSPには使えません。 普通にIPパケットをルーティングするしかないのかな?

つづく。

【Cisco Tips】 Ciscoのフラッシュメモリ種別

PCMCIA Filesystem Compatibility Matrix and Filesystem Informationを参照。

クラスA

slot0で認識。 クラスAはdeleteした後、squeezeしないといけない。squeezeはしこたま時間かかるので要注意。 Cisco7000, 7500, GSRあたりはクラスAを使う。

クラスB

slot0で認識。partitionコマンドで分割する。deleteした後、本当に消すならeraseコマンドを使う。 Cisco1600, 3600あたりはクラスBを使う。

クラスC

disk0で認識。dos形式のATAフラッシュディスク。squeezeしなくてもいい。 最近はこれが多い。Cisco7200、Cat6500のSupあたりがこれ。

【GMPLS】 9. JuniperのLMPは変?

先日 から実験しているGMPLSですが、うまく動かないのも悔しいので、もう少しだけ試してみようと思います。

JuniperのGMPLSがうまく動作しない原因を突き詰めていくと、LMPがうまく機能していないように思えます。 マニュアルによると、LMPのピアを設定すれば、仮想的に割り当てたアドレスがOSPFなり、 RSVPなりでやりとりできるようになるはずなのですが・・・

After you have configured the LMP peers, add the peer interfaces to RSVP and OSPF. The peer interface name must match the peer name configured in LMP. Once the peer interfaces are added to the protocols, the traffic engineering link local and remote addresses can be signaled and advertised to peers like any other interface enabled for RSVP and OSPF. These addresses act as virtual interfaces for GMPLS.

とりあえず、コントロールチャネル上に何が流れてるのかを突き止めないといけません。 etherealでfe-0/0/0上をモニターしてみると、GRE上でOSPFの隣接が確立されてました。 GREはOSPFの動作対象から外してますから、 トラフィックエンジニアリング用のpeer-interface設定が効いているのに間違いありません。 実際、gre.0はOSPFが動いていません。

【etherealのデータ

gsi@R1# run show ospf interface gre.0

[edit protocols link-management]
gsi@R1#

ここまでは良さそうなのですが、 トラフィックエンジニアリング用に特別なLSAが流れてるかっていうと、そうでもないようです。 普通のLSAだけです。

si@R1# run show ospf database

    OSPF link state database, area 0.0.0.0
 Type       ID               Adv Rtr           Seq      Age  Opt  Cksum  Len
Router  *192.168.254.1    192.168.254.1    0x8000000a   961  0x2  0xde47  48
Router   192.168.254.2    192.168.254.2    0x8000000a   964  0x2  0xf22f  48
Network  192.168.1.2      192.168.254.2    0x80000003   240  0x2  0x624b  32

[edit protocols link-management]
gsi@R1# run show ospf database detail

    OSPF link state database, area 0.0.0.0
 Type       ID               Adv Rtr           Seq      Age  Opt  Cksum  Len
Router  *192.168.254.1    192.168.254.1    0x8000000a   966  0x2  0xde47  48
  bits 0x0, link count 2
  id 192.168.1.2, data 192.168.1.1, Type Transit (2)
  TOS count 0, TOS 0 metric 1
  id 192.168.254.1, data 255.255.255.255, Type Stub (3)
  TOS count 0, TOS 0 metric 0
Router   192.168.254.2    192.168.254.2    0x8000000a   969  0x2  0xf22f  48
  bits 0x0, link count 2
  id 192.168.1.2, data 192.168.1.2, Type Transit (2)
  TOS count 0, TOS 0 metric 1
  id 192.168.254.2, data 255.255.255.255, Type Stub (3)
  TOS count 0, TOS 0 metric 0
Network  192.168.1.2      192.168.254.2    0x80000003   245  0x2  0x624b  32
  mask 255.255.255.0
  attached router 192.168.254.2
  attached router 192.168.254.1

[edit protocols link-management]
gsi@R1#

ルータLSAにConnection to P-to-Pがない事を考えると、 peer-interfaceの存在はどうなってしまったのでしょう?

GRE上には、OSPF以外にこれといってパケットが流れる様子はありません。 JuniperのLMPはスタティックということで納得するとしても、RSVPは変ですね。 GRE上にRSVPメッセージが流れないと、やっぱりおかしいです。

あらゆる可能性を排除するために、まずマニュアルのススメに従って、 データチャネル用の物理インタフェース(fe-0/0/1)に割り当てるアドレスと、 論理的なTEリンクに割り当てるアドレスを変えてみました。 が、まったく影響なし。

コントロールチャネルにGREを使うのがいけないのかと思って、 さらにso-0/1/1でJuniper間を直結してみましたが、 それでもダメ。

うーーん、どうしたものか・・・

つづく(のかな?)

【Cisco Tips】 Ciscoで使うURL指定

tftp:[[//location]/directory]/filename
ftp:[[[//username [:password]@]location]/directory]/filename

slot0・・・PCMCIAのフラッシュメモリ。CiscoフォーマットなのでPCでは読めない。
disk0・・・ATAフラッシュディスク。DOSフォーマットなのでPCでも読める。
flash・・・slot0のエイリアス
bootflash・・・緊急時に立ち上げるIOSを格納するフラッシュ。ROMを持たない機種のみ。
system:running-config・・・running-configの正式な書き方。
nvram:startup-config・・・startup-configの正式な書き方。

【Cisco Tips】 RADIUSでアカウンティング情報を取るには

設定するのを忘れがち。 自動ではアカウンティングは飛んでかない。
!
aaa accounting network default start-stop group radius

【Cisco Tips】 コマンド一覧を得るには

show parser dumpコマンドを使えばよい。

【Cisco Tips】 余ってるAUXを使ってコンソールサーバにする

こんな設定を入れる。
line aux 0
 transport input telnet

待ち受けのTCPポート番号は、2000 + line番号、になるが、line番号はshow lineコマンドで調べないと分からない。 非同期シリアルを積んでなければAUXは2001になるかな。

show userで見ると、AUXにネットワーク経由で接続しているように見えるので、 知らない人が見るとびっくりするかも。

R6c7206>show user
    Line       User       Host(s)              Idle       Location
*  0 con 0                idle                 00:00:00
   1 aux 0     lantc      idle                 00:00:47 172.16.2.15

  Interface    User               Mode         Idle     Peer Address

【Cisco Tips】 デバッグするときには

あらかじめ undebug all を打っておく。 debug xxx を打ったあと、メッセージが大量に出てきて「ヤバ」っと思ったらCtrl-Pを2回押してリターン。

【Cisco Tips】 アクセスリストにコメントを入れるには

access-list 1 remark "コメント"

【DOWNLOAD】 9. 簡易SYSLOGサーバ

9. 簡易SYSLOGサーバ

Ciscoのデバッグメッセージはコンソールに出すよりもSYSLOGに飛ばした方が負荷が軽くてよいでしょう。 次のように設定すれば、指定したアドレスにSYSLOGで飛んでいきます。

!
no logging console
logging trap debugging
logging 10.17.65.128
logging facility local7
!

ソースコード付きです。

ダウンロード】 

【GMPLS】 8. LMPの概要

8. LMPの概要

LMPの概要をdraft-ietf-ccamp-lmp-10.txtから翻訳して抜粋。

2. LMP Overview

   LMPにおける二つの主な役割は、コントロールチャネルの管理と、リンクプ
   ロパティとの関連付けである。コントロールチャネルの管理は、隣接ノー
   ド間でコントロールチャネルを確立し、維持していくためのものである。
   これはConfigメッセージの交換と、高速なキープアライブをノード間でや
   りとりすることで実現する。キープアライブは、下位レベルが制御チャネ
   ルの障害を検出できないときに必要とされる。リンクプロパティの関連付
   けは、TEリンクのプロパティと同期をとり、TEリンクの設定をチェックす
   るためのものである。

   LMPでは、隣接ノード間で少なくとも一つの双方向コントロールチャネルを
   必要とする。コントロールチャネルのそれぞれの方向に関して
   CC_Id(Control Channel Id)が割り当てられ、LMP Configメッセージを使っ
   てそれら2方向のCC_Idが対応付けられる。Testメッセージを除き、全ての
   LMPパケットはUDP上にLMPのポート番号を使って流れる(Testメッセージは
   インバンドのメッセージなのでトランスポートに依存する)。コントロール
   チャネルのリンクレベルのエンコーディングはこの文書では規定しない。

   "LMP隣接(LMP adjacency)"は2つのノード間で少なくとも一つの双方向コ
   ントロールチャネルが確立されると形成される。複数のコントロールチャ
   ネルが同時にアクティブになってもよいが、コントロールチャネルのパラ
   メータはチャネルごとにネゴシエーションされなければならない(MUST)。
   LMP高速キープアライブをコントロールチャネル上で動かすなら、LMP
   Helloメッセージを交換しなければならない(MUST)。その他のLMPメッセー



J. Lang, Editor            Standards Track                   [Page 8]

Internet Draft       draft-ietf-ccamp-lmp-10.txt         October 2003

   
   ジはアクティブになっているどのチャネル上に投げてもよい(MAY)。シグナ
   リング、ルーティング、リンクプロパティ相関のために複数のコントロー
   ルチャネルを一つの論理コントロールチャネルに束ねることもある。

   LMPにおけるリンクプロパティ相関の機能は、複数のデータ用リンク(ポー
   トやリンクのコンポーネント)を一つのTEリンクに束ね、TEリンクのプロパ
   ティとして同期を取るためにある。リンクプロパティ相関の一部として、
   LinkSummaryメッセージが定義されている。LinkSummaryメッセージはロー
   カル、およびリモートのLink_Idsを含み、TEリンクを構成する全てのデー
   タリンクのリスト、そして様々なプロパティを含んでいる。LinkSummaryメッ
   セージの受信に対して、LinkSummaryAckまたはLinkSummaryNackメッセージ
   を送信し、そのリンクプロパティに同意するのか、反対するのか示さなけ
   ればならない。

   Message_Idsと再送により、LMPメッセージはリライアブルに配送される。
   Message_IdsはMESSAGE_IDオブジェクトで運ばれる。LMPメッセージは高々
   一つのMESSAGE_IDオブジェクトを持つ。コントロールチャネルに固有のメッ
   セージに関しては、Message_Idはそのメッセージが送られるコントロール
   チャネルで管理されたスコープにある。TEリンク固有のメッセージの場合、
   Message_IdはLMP隣接ごとに管理されたスコープにある。Message_Idの値は
   単純増加で、最大値に達すると元に戻る。

   この仕様では、二つのLMP手順を定義する。リンクコネクティビティ確認と、
   障害管理である。これら手順はコントロールチャネルが物理的なデータリ
   ンクと別々の場合に特に効果を発揮する。リンクコネクティビティ確認は、
   データプレーンの探索、Interface_Idの交換(Interface_IdsはGMPLSのシグ
   ナリングに使われ、ポートのラベルか、コンポーネントリンク識別子のど
   ちらかである)、そして物理的なコネクティビティの確認に用いられる。こ
   れは、Testメッセージをデータ用リンクに送信し、TestStatusメッセージ
   をコントロールチャネル経由で戻してもらうことで実現する。Testメッセー
   ジはデータ用リンクに送信しなければならない、唯一のLMPメッセージであ
   ることに注意してほしい。ChannelStatusメッセージは隣接ノード間で交換
   され、下流方向へのアラーム送信の省略、障害からのプロテクションと修
   復のために利用される。

   LMPリンクコネクティビティ確認では、Testメッセージをデータ用リンクに
   送信する。X-透過なデバイスでは、信号におけるXの要素を確かめ、変更す
   る能力を必要とする。LMPリンクコネクティビティ確認は、BeginVerifyメッ
   セージをコントロールチャネル経由で交換することで開始される。様々な
   透過要素をサポートするために、Verify Transport Mechanismを
   BeginVerifyおよびBeginVerifyAckメッセージに含めている。全てのデータ
   用リンクで透過機能を停止する必要はなく、最低限、どれか一つを終端で
   きればよい。またコントロールチャネルとTEリンクが同じ物理メディアを
   使わなければいけないわけでもない。ただし、コントロールチャネルはそ
   のTEリンクを制御しているエレメントと同じエレメントで終端しなければ



J. Lang, Editor            Standards Track                   [Page 9]

Internet Draft       draft-ietf-ccamp-lmp-10.txt         October 2003

   ならない。Test手順に関連してBeginVerifyメッセージが交換されるため、
   データ用リンクの動的な透過モードへの移行能力が求められる。

   LMP障害管理の手順はChannelStatusメッセージの交換に基づいている。こ
   れにはChannelStatus、ChannelStatusAck、ChannelStatusRequestおよび
   ChannelStatusResponseメッセージを利用する。ChannelStatusメッセージ
   は任意のタイミングで送信され、TEリンクのデータ用リンクの状況をLMPネ
   イバーに通達する。ChannelStatusAckメッセージはChannelStatusメッセー
   ジの受信に応じて返される。ChannelStatusRequestは、LMPネイバーにTEリ
   ンク内のデータチャネルの状況を報告させるために用いる。
   ChannelStatusResponseは、ChannelStatusRequestの受信に応じて返され、
   問い合わせされたデータ用リンクの状況を通知する。

つづく。

【DOWNLOAD】 8. Cisco password解読

8. Cisco password解読

Ciscoのenable passwordは暗号化のアルゴリズム(ソースコード)が出回ってしまってますので、 必ずenable secretを使わないといけません。 注意しないといけないのはVTYのパスワードもこのアルゴリズムで解読できてしまう点です。 AAAを使うようにしましょう。

ソースコード付きです。

ダウンロード】 

【DOWNLOAD】 7. TFTPサーバ

7. TFTPサーバ

Windows用世TFTPサーバは世の中にごまんとあるので、わざわざこれを使う必要はないのですが・・・
C#のソースを付けておきますので、UDP通信の参考になるかもしれません。

ソースコード付きです。

ダウンロード】 

【C#】 テキストボックスをスクロールするには

private void resultTextBox_TextChanged(object sender, System.EventArgs e) {
    RichTextBox textBox = (RichTextBox) sender;
    textBox.SelectionStart = textBox.Text.Length; 
    textBox.ScrollToCaret();
}
TextBox.HideSelectionプロパティをfalseにセットすれはScrollToCaret()する必要がない。
private void messageHandler(String str) {
    this.resultTextBox.AppendText(str + Environment.NewLine);
    this.resultTextBox.SelectionStart = this.resultTextBox.Text.Length;
    this.resultTextBox.Focus();
}

【DOWNLOAD】 6. SNMPツール

6. SNMPツール

CiscoのCPU負荷をSNMPで計測したくて作成したのがこれです。 SNMP周りのコードも自分で書きました。 C#を勉強し始めた初期の頃の作品なので、 既に現在メンテナンスしているコードとはだいぶ違ってます。 バイナリのみの公開です。

モニター機能が付いているくせに、結果をテキストでログファイルに落とせないところが致命的です。

ソースコードは公開していません。

ダウンロード

【DOWNLOAD】 5. 簡易ターミナルサーバ

5. 簡易ターミナルサーバ

Javaの練習用に CiscoライクなCLIを持ったターミナルサーバを作ったのですが、 ウィンドウズにJavaのアプリケーションって相性悪くてイマイチですよね。 それでC#の勉強を始めたときに作ったのがこれです。

シリアル通信のサンプルにtelnetのコードをくっつけただけの超簡易版です。 アイコンはないわ、GUIもボタンだけだわで、本当に簡易ですが、持ってると役に立つことがあるかもしれません。

Windows XP SP2は、TCPのポート番号(2000+COM)を例外として許可してください。

ソースコード付きです。

ダウンロード

【GMPLS】 7. 実験は成功したのか?

7. 実験は成功したのか?

ここまでの実験で、一見うまくいっているようにも見えますが、 R1-R2間のデータチャネル fe-0/0/1 をモニターしてみると、RSVPのシグナリングが見えてしまってます。

No Time        Source                Destination           Protocol Info
 1 0.000000    10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
 2 0.013158    10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
 3 9.080752    10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
 4 9.094033    10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
 6 16.814830   10.0.1.2              10.0.1.1              RSVP     RESV Message. SESSION: IPv4-LSP, Destination 192.168.254.2, Tunnel ID 64135, Ext ID c0a8fe01. FILTERSPEC: IPv4-LSP, Tunnel Source: 192.168.254.1, LSP ID: 1. 
 7 16.901259   192.168.254.1         192.168.254.2         RSVP     PATH Message. SESSION: IPv4-LSP, Destination 192.168.254.2, Tunnel ID 64135, Ext ID c0a8fe01. SENDER TEMPLATE: IPv4-LSP, Tunnel Source: 192.168.254.1, LSP ID: 1. 
 8 18.181299   10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
 9 18.194599   10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
10 19.665171   192.168.254.2         192.168.254.1         RSVP     PATH Message. SESSION: IPv4-LSP, Destination 192.168.254.1, Tunnel ID 36276, Ext ID c0a8fe02. SENDER TEMPLATE: IPv4-LSP, Tunnel Source: 192.168.254.2, LSP ID: 1. 
11 19.665725   10.0.1.1              10.0.1.2              RSVP     RESV Message. SESSION: IPv4-LSP, Destination 192.168.254.1, Tunnel ID 36276, Ext ID c0a8fe02. FILTERSPEC: IPv4-LSP, Tunnel Source: 192.168.254.2, LSP ID: 1. 
12 27.291897   10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
13 27.305318   10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
14 36.412512   10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
15 36.426033   10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
17 45.552885   10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
18 45.566979   10.0.1.2              10.0.1.1              RSVP     HELLO Message. 
19 54.583646   10.0.1.1              10.0.1.2              RSVP     HELLO Message. 
20 54.597502   10.0.1.2              10.0.1.1              RSVP     HELLO Message. 

【イーサリアルの<データ

これは明らかに期待した動きではありません。 本来fe-0/0/1はデータチャネル専用で、制御パケットは流したくないのです。 そのためにわざわざLMPを使って、アウトバンドの制御チャネル用にGREトンネルを作成しているのですから、 そっちにRSVPが流れて欲しいわけです。

RSVPのインタフェース状況を見ると、fe-0/0/1でもRSVPがアップしてしまってます。

gsi@R1# run show rsvp interface
RSVP interface: 2 active
                  Active Subscr- Static      Available   Reserved    Highwater
Interface   State resv   iption  BW          BW          BW          mark
fe-0/0/0.0  Up         0   100%  100Mbps     100Mbps     0bps        0bps
fe-0/0/1.0  Up         1   100%  100Mbps     100Mbps     0bps        0bps

しかし、fe-0/0/1をRSVPから外すと、こんどはLSPが張れなくなります。

さらに、peer-interfaceで設定したピアの情報が出てきません。これは変ですね・・・
LMP→OSPF、LMP→RSVPの連携がうまくいってないように見えます。うーん。

とりあえず、実験は失敗なのですが、GMPLSの概念の一片は理解できたので、そういう意味では成功です。 後の課題としては、LMPについて理解が足りないので、もう少し机上調査が必要です。

つづく。

【GMPLS】 6. LSPを利用してみる

6. LSPを利用してみる

この作成したLSPを利用してみましょう。てっとり早く使うにはCCCがいいと思います。

fe-0/0/3が余ってますので、このイーサをCCCでGMPLSのLSPとくっつけてみます。 そしてfe-0/0/3の先にはCiscoルータ(R4, R6)を接続します。 R4-R6間は同じイーサセグメントになるはずです。

R1のCCCは次のように設定します。これでfe-0/0/3で受け取ったイーサフレームは全てLSP gmpls-fe-0/0/1に転送されます。

interfaces {
    fe-0/0/3 {
        speed 100m;
        link-mode half-duplex;
        encapsulation ethernet-ccc;
        unit 0;
    }
}
protocols {
    connections {
        remote-interface-switch fe-0/0/3-gmpls-fe-0/0/1 {
            interface fe-0/0/3.0;
            transmit-lsp gmpls-fe-0/0/1;
            receive-lsp gmpls-fe-0/0/1;
        }
    }
}

ここまでの設定 ( R1  R2)

これでR4とR6が同じイーサセグメントで繋がってます。実際にpingを飛ばしてみましょう。

R4#ping
Protocol [ip]:
Target IP address: 192.168.2.6
Repeat count [5]: 100
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 100, 100-byte ICMP Echos to 192.168.2.6, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (100/100), round-trip min/avg/max = 1/1/4 ms
R4#

ちゃんと繋がってますね。 etherealでLPS上のデータを見てみると、ether-label-ether-ip-icmpというスタックになっているのが確認できます。

No.     Time        Source                Destination           Protocol Info
     14 16.591392   192.168.2.4           192.168.2.6           ICMP     Echo (ping) request

Frame 14 (132 bytes on wire, 132 bytes captured)
    Arrival Time: Oct  8, 2004 18:55:37.832839000
    Time delta from previous packet: 1.431380000 seconds
    Time since reference or first frame: 16.591392000 seconds
    Frame Number: 14
    Packet Length: 132 bytes
    Capture Length: 132 bytes
Ethernet II, Src: 00:90:69:92:34:01, Dst: 00:90:69:61:30:01
    Destination: 00:90:69:61:30:01 (JuniperN_61:30:01)
    Source: 00:90:69:92:34:01 (JuniperN_92:34:01)
    Type: MPLS label switched packet (0x8847)
MultiProtocol Label Switching Header
    MPLS Label: Unknown (100080)
    MPLS Experimental Bits: 0
    MPLS Bottom Of Label Stack: 1
    MPLS TTL: 255
Ethernet II, Src: 00:05:9a:64:b8:1c, Dst: 00:0b:45:41:34:1c
    Destination: 00:0b:45:41:34:1c (Cisco_41:34:1c)
    Source: 00:05:9a:64:b8:1c (Cisco_64:b8:1c)
    Type: IP (0x0800)
Internet Protocol, Src Addr: 192.168.2.4 (192.168.2.4), Dst Addr: 192.168.2.6 (192.168.2.6)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 100
    Identification: 0x289b (10395)
    Flags: 0x00
        0... = Reserved bit: Not set
        .0.. = Don't fragment: Not set
        ..0. = More fragments: Not set
    Fragment offset: 0
    Time to live: 255
    Protocol: ICMP (0x01)
    Header checksum: 0x0da3 (correct)
    Source: 192.168.2.4 (192.168.2.4)
    Destination: 192.168.2.6 (192.168.2.6)
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
    Code: 0 
    Checksum: 0x0669 (correct)
    Identifier: 0x0402
    Sequence number: 0x0614
    Data (72 bytes)

0000  00 90 69 61 30 01 00 90 69 92 34 01 88 47 18 6f   ..ia0...i.4..G.o
0010  01 ff 00 0b 45 41 34 1c 00 05 9a 64 b8 1c 08 00   ....EA4....d....
0020  45 00 00 64 28 9b 00 00 ff 01 0d a3 c0 a8 02 04   E..d(...........
0030  c0 a8 02 06 08 00 06 69 04 02 06 14 00 00 00 00   .......i........
0040  15 67 58 64 ab cd ab cd ab cd ab cd ab cd ab cd   .gXd............
0050  ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd   ................
0060  ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd   ................
0070  ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd   ................
0080  ab cd ab cd                                       ....

【イーサリアルの<データ

つづく。

【GMPLS】 5. MPLSの設定

5. MPLSの設定

最後にLSPを作成します。 データチャネル専用のイーサ(fe-0/0/1)には仮想的に10.0.1.0/24の管理アドレスを振ってますので、 そこを通るようにLSPを作成します。 そして、LSPのタイプをGMPLS用にpsc-1、タイプをethernetにします。

mpls {
    no-cspf;
    label-switched-path gmpls-fe-0/0/1 {
        from 192.168.254.1;
        to 192.168.254.2;
        lsp-attributes {
            switching-type psc-1;
            gpid ethernet;
        }
        primary gmpls-path-1;
    }
    path gmpls-path-1 {
        10.0.1.2;
    }
    interface all;
    interface fxp0.0 {
        disable;
    }
}

ここまでの設定 ( R1  R2)

これでgmpls-fe-0/0/1と名付けたLSPがアップします。

gsi@R1# run show mpls lsp
Ingress LSP: 1 sessions
To              From            State Rt ActivePath       P     LSPname
192.168.254.2   192.168.254.1   Up     0 gmpls-path-1     *     gmpls-fe-0/0/1
Total 1 displayed, Up 1, Down 0

Egress LSP: 1 sessions
To              From            State Rt Style Labelin Labelout LSPname
192.168.254.1   192.168.254.2   Up     0 1 FF       3        - gmpls-fe-0/0/1
Total 1 displayed, Up 1, Down 0

Transit LSP: 0 sessions
Total 0 displayed, Up 0, Down 0

つづく。

【GMPLS】 4. RSVPとOSPFの設定

4. RSVPとOSPFの設定

LMPの目的は、制御パケットを流せないデータチャネルの代わりに、制御を肩代わりすることです。 LMPに設定した情報をRSVPとOSPFに供給しないといけません。


RSVPの設定

RSVPの設定は簡単です。 どのインタフェースでRSVPを動かすか指定して、LMPで設定したpeerを加えるだけです。 注意しなければいけないのは、peerで指定した制御チャネルのインタフェースは、RSVPを動かしてはいけない点です。 ここではgre.0を除く全てのインタフェースでRSVPを動かせばよいことになります。

R1の設定は次のようになります。

protocols {
    rsvp {
        interface fxp0.0 {
            disable;
        }
        interface gre.0 {
            disable;
        }
        interface all;
        peer-interface R2;
    }

OSPFの設定

LMPの情報をOSPFに渡すには、peer-interfaceを設定するだけです。R1の設定は次のようになります。

protocols {
    ospf {
        area 0.0.0.0 {
            interface lo0.0;
            interface fe-0/0/0.0;
            interface fxp0.0 {
                disable;
            }
            peer-interface R2;
        }

以上でRSVPとOSPFの設定は終わりました。

ここまでの設定 ( R1  R2)

つづく。

【GMPLS】 3. LMPの設定

3. LMPの設定

GMPLSの主要コンポーネント、LMP(Link Management Protocol)を設定してみます。 この設定はやや面倒です。

te-linkの設定

R1-R2間には、データチャネル専用のイーサネット(fe-0/0/1)を設置しましたが、 これをLMPで扱えるように te-link というものを作成します。 GMPLSでは物理インタフェースそのものが常にデータチャネルになるわけではなく、 ポートやタイムスロット、波長で細分化したいはずです。 そのために論理的なリンクを用意してLMPで扱うわけですが、それがte-linkの設定です。

と言っても、イーサネットの場合は物理インタフェース(fe-0/0/1)をまるごと使いますので、 次のような設定を入れることになります。 ここではte-fe-0/0/1という名称で作成しました。

protocols {
    link-management {
        te-link te-fe-0/0/1 {
            interface fe-0/0/1;
        }

te-linkの設定はまだ不完全ですが、先に進みます。

peerの設定

R1-R2間のデータチャネル専用のイーサネット(fe-0/0/1)には、 OSPFやRSVPといった制御プロトコルを流すわけにいきません。 (フォトニックの世界なら、波長に相当するわけですから、これは当然です)。 ですから代わりとなる制御チャンネルを作成しなければいけません。 この設定がpeerという設定です。

peerの設定には、相手先ルータのアドレス、どこのインタフェースを代わりに使うか、 そしてどのte-linkを分担するのか、を設定します。

R1から見た場合、相手先ルータR2のアドレスは192.168.254.2とします。 192.168.250.2でも大丈夫ですが、ルータIDの方がかっこいいでしょう。 制御チャンネルは先ほど作成したGREトンネルを使います。

protocols {
    link-management {
        te-link te-fe-0/0/1 {
            interface fe-0/0/1;
        }
        peer R2 {
            address 192.168.254.2;
            control-channel gre.0;
            te-link te-fe-0/0/1;
        }
    }
}

再びte-linkの設定

peerを設定したらte-linkの設定に戻ります。 peerの設定をしないと、te-linkに必要な情報が得られないため、こんな面倒なことになってます。 それでは show link-management コマンドで必要な情報を入手しましょう。 R1で実行すると次のようになります。

gsi@R1# run show link-management
Peer name: R2, System identifier: 11783
 State: Up, Control address: 192.168.254.2
   Control-channel                   State
   gre.0                             Active
  TE links:
   te-fe-0/0/1

 TE link name: te-fe-0/0/1, State: Up
  Local identifier: 55334, Remote identifier: 0, Encoding: Ethernet, Minimum bandwidth: 100Mbps,
  Maximum bandwidth: 100Mbps, Total bandwidth: 100Mbps, Available bandwidth: 100Mbps
    Name          Local ID  Remote ID      Bandwidth Used  LSP-name
    fe-0/0/1         54190          0        100Mbps   No

必要なのは、te-linkのidと、interfaceのidです。上記によると、

  • 自分のte-link idは55334
  • 相手のte-link idは0(不明)
  • 自分のinterface idは54190
  • 相手のinterface idは0(不明)

となっています。相手の情報を知らないのは仕方ないです。何も設定してませんから。重要なのは自分のidです。 自分のidを相手側(ここではR2)に設定します。R2の設定は次のようになります。

link-management {
    te-link te-fe-0/0/1 {
        remote-id 55334;
        interface fe-0/0/1 {
            remote-id 54190;
        }
    }
    peer R1 {
        address 192.168.254.1;
        control-channel gre.0;
        te-link te-fe-0/0/1;
    }
}

R1を設定するには、R2でshow link-managementを叩き、te-link idとinterface idを調べる必要があります。 実機で叩かないといけないのはいかにも不便ですが、juniperはそうなっています。 プロトコルの仕様上こうなっているのか、juniperの都合でこうなっているのかは不明です。 これは後で調べることにして、先に進みます。

te-linkにアドレスを振る

te-linkには管理用のIPアドレスを振る必要があります。 物理インタフェースにアドレス振ったんだから、そこから拾ってきて欲しいものですが・・・
fe-0/0/1には10.0.1.0/24のアドレスを割り当てましたから、次のように設定します。

link-management {
    te-link te-fe-0/0/1 {
        local-address 10.0.1.1;
        remote-address 10.0.1.2;
        remote-id 55334;
        interface fe-0/0/1 {
            local-address 10.0.1.1;
            remote-address 10.0.1.2;
            remote-id 54190;
        }
    }
    peer R2 {
        address 192.168.254.2;
        control-channel gre.0;
        te-link te-fe-0/0/1;
    }
}

LMPの設定はこれで完成です。

ここまでの設定 ( R1  R2)

つづく。

【GMPLS】 2. 実験構成

2. 実験構成

まずは基本構成を作成してみます。 Juniper M10を2台使って、アウトバンドでルーティングする構成を作ってみます。 これをGMPLSの構成に育ててみたいと思います。

Juniperのマニュアル

設定 ( R1  R2)

この構成の設定は簡単なので解説はいらないと思います。


GREトンネルの設定

最初にやるのは、GREトンネルの設定です。 GMPLSではLMP用のアウトバンド制御チャンネルが必要になるのですが、 それはポイントツーポイントでないといけないそうです(Juniperのマニュアルの片隅に書いてあります)。 プロトコルの仕様上なのか、Juniperの作りでそうなっているのかは分かりません。 それは後で調べるとして、ポイントツーポイントのリンクとしてここではGREトンネルを用意したいと思います。

設定 ( R1  R2)

R1には次のような設定を追加します(R2も同様)。

interfaces {
    gre {
        unit 0 {
            tunnel {
                source 192.168.1.1;
                destination 192.168.1.2;
            }
            family inet {
                address 192.168.250.1/24;
            }
            family mpls;
        }
    }

これ自体は普通のGREの設定なのですが、注意しないといけないのは、 作成したGREトンネルをOSPFルーティングの対象にしない点です。 ルーティング対象にすると、この後困ることになります。 MPLSのシグナリングを通すことになりますので、family mplsも入れておきます。


データチャンネル用のイーサネットの追加

データチャンネル専用のイーサネットとして、fe-0/0/1でR1-R2間を接続します。 データチャンネル専用なのですが、管理用のIPアドレス 10.0.1.0/24 を割り当てます。 このアドレスはRSVPでLSPを作成するときに「ここを通す」という指定に使います。 (イーサの場合、相手先ルータのMACアドレスを知るためにも使います。 そういう意味で、制御用の通信がまったく流れない、というわけではありません。 もちろんスタティックにARPテーブルを作っておけば、fe-0/0/1上には制御用通信はまったく流れません)。

設定 ( R1  R2)

R1のfe-0/0/1は次のようになります。 データチャネル専用ですから、OSPFのルーティング対象に入れてはいけません。

fe-0/0/1 {
    description "Data channel to R2";
    speed 100m;
    mtu 1500;
    link-mode half-duplex;
    unit 0 {
        family inet {
            address 10.0.1.1/24;
        }
        family mpls;
    }
}

基本構成はここまで。

つづく。

【GMPLS】 1. GMPLSとは

1. GMPLSとは

GMPLSは主にフォトニックな世界を対象にしているため、敷居の高い技術です。 ですが、将来家庭までファイバが延びてくるようになると、 100Mとかケチくさいことを言わず、1波まるごと使ってISPと繋がる日が来るかもしれません。 そうなると家に置かれたONUがGMPLSをしゃべったりするわけで、案外身近な技術になるのかもしれません。

フォトニックを対象にして実験するのは大変難しいのですが、イーサネットなら簡単です。 幸いJuniperのGMPLSはイーサネットも対象にしていますので、簡単に実験してみましょう。 GMPLSのコンポーネントを理解するには、こういう簡単な実験の方がむしろ都合がいいのです。

シムヘッダを使ったいわゆる普通のMPLSはインバンドのシグナリングで動作します。 LSPの作成にはLDPやRSVPを使うわけですが、 それらプロトコルの動いているインタフェースにしかLSPは作れません。 これは、OSPFを動かしていないインタフェースにIPパケットはルーティングされないのと同じです。

ルータで構成されたMPLS網ならインバンドのシグナリングでよいのですが、 LSPの考え方を拡張して、ラベル=波長、ラベル=時分割多重のスロット、 などという使い方を実現するためには、一工夫必要になります。 ルータは受信したパケットのうち、転送すべきものと、自分で処理するべきものを区別可能です。 なのでインバンドのシグナリングが可能なわけですが、λスイッチやADM、TDM装置はそうはいきません。 受信したものはすべてどこかに転送されなければならないからです。 したがってGMPLSでLSPを作成するためには、アウトバンド(すなわち別網)でシグナリングをやりとりする必要があるわけです。

ここで問題になるのは、LDPやRSVPはIPをベースに動作する点です。 LSPを作成するのに「どこと、どこと、どこを通したい」という指定をするのにIPアドレスが必要になるのです。 したがって、波長やタイムスロットに対してIPアドレス(サブネット)を割り当てて、 外部の装置からIPネットワークの一部として見せかけてあげる必要があります。 この仕事をするのがLMP(Link Management Protocol)です。 LMPを使えば、物理リソースはサブネットを持ったポイントツーポイントのリンクとして見えるようになります。 サブネットを持ったポイントツーポイントリンクなら、OSPFやRSVPでも簡単に扱えます。

結局、GMPLSで必要なのは、①アウトバンド(別網)を使ったシグナリング、 ②物理リソースをレイヤ3で扱えるようにするLMP、この二つです。

つづく。

【DOWNLOAD】 4. コマンド実行cshスクリプト

4. コマンド実行cshスクリプト

Ciscoに接続してコマンドを送り込むだけの簡単なスクリプト。 難しいことはできないので、ちゃんとしたのはexpectなり、perlなりで作ってください。

#!/bin/tcsh -f

#set IP_ADDRESS='cs516 2005'
set IP_ADDRESS='172.16.2.6'

set USER='lantc'
set PASS='lantc'
set ENABLE='lantc'

set DIR='/tmp'
if(! -e $DIR)then
 mkdir $DIR
endif

set TAG=`date +'%m%d%H%M'`
#set OUTPUT1=$DIR/getshow_info.$TAG
set OUTPUT1=/dev/null

(echo "";\
echo "$USER";\
echo "$PASS";\
echo "";\
echo "enable";\
echo "$ENABLE";\
echo "terminal length 0";\
echo "show running-config";\
echo "quit";\
sleep 1) | telnet $IP_ADDRESS |& tee $OUTPUT1

【Cisco Tips】 よく使うコンフィグのテンプレート

よく使うコンフィグのテンプレート
!
! セキュリティを高めるための設定ガイドラインを参照
!http://www.cisco.com/warp/public/707/21.html

!ホスト名は任意で。
hostname myHostname
!
!ルータへのログインにユーザ名を付けられるので、aaaを使った方がベター
aaa new-model
aaa authentication login default local enable
!
!ルータのログインに使うアカウント
username root password 7 020A05551F05
username cisco password 7 05080F1C2243
!
! 必ずsecretを使うこと。
enable secret xxx
no enable password
!
service password-encryption
service timestamps log datetime msec
service timestamps debug datetime msec
service tcp-keepalives-in 
no service finger
no service tcp-small-servers
no service udp-small-servers
!
ip subnet-zero
ip classless
ip cef
!
no ip bootp server
no ip source-route

! DNS設定
ip domain-name myDomain.Name
ip name-server x.x.x.x
! DNSを使わないなら次の設定を入れる
! no ip domain-lookup

!
! パケットフィルタを設定したときに、ログが残る(入らないバージョンあり)
ip accounting access-violations
!
!CPU高負荷時でもコマンドの応答レスポンスを良くする(引数は自動で付与)
scheduler allocate

!
! ログはSYSLOGに転送しつつ、ローカルにも保存。コンソールにはログメッセージを出さない。
logging buffered
logging x.x.x.x
no logging console

!
! 特定のホストをSYN Floodから守る。機種依存あり。
! http://www.cisco.com/warp/public/cc/pd/iosw/iore/prodlit/576_pp.htm
! http://www.cisco.com/en/US/products/sw/iosswrel/ps1831/products_configuration_guide_chapter09186a00800d9818.html
access-list 101 permit tcp any x.x.x.x m.m.m.m
ip tcp intercept list 101

!インタフェース設定
interface XXX
 !外部向きにインタフェースにはこれらを設定して、DoS攻撃から防御
 ip verify unicast reverse-path
 no ip directed-broadcast 

 !外部向きインタフェースはCDPを止める
 no cdp enable
!

! NTP関連設定
ntp server x.x.x.x
clock timezone JST 9
! NTP使わないなら次の設定に置き換え
!ntp disable

! SNMPアクセスは必ずアクセスリストで制限すること
snmp-server community myCommunity ro 11
snmp-server ifindex persist
snmp-server location "my location here"
snmp-server contact "my address here"
access-list 11 permit x.x.x.x

!
! デフォルトルートを使っていないなら、これを必ず入れること。
ip route 0.0.0.0 0.0.0.0 null 0 255

!
line con 0
 ! これは微妙。show techを取るときにタイムアウトしないようにするためのもの。
 exec-timeout 0
!
line vty 0 4
 ! telnetとsshだけにする。sshは入らないバージョンもあり
 transport input telnet ssh
 access-class 12 in
 exec-time 5 0
 login
 password myPassword
! アクセスリストでtelnetできるホストを制限する
access-list 12 permit x.x.x.x
!

!
!-------以下、便利なアクセスリスト--------
!180 ・・・もともとIP Precedenceが0のパケット
!181 ・・・もともとIP Precedenceが1のパケット
!182 ・・・もともとIP Precedenceが2のパケット
!183 ・・・もともとIP Precedenceが3のパケット
!184 ・・・もともとIP Precedenceが4のパケット
!185 ・・・もともとIP Precedenceが5のパケット
!186 ・・・もともとIP Precedenceが6のパケット
!187 ・・・もともとIP Precedenceが7のパケット
!
!190 ・・・任意のIPパケット
!191 ・・・VoIP関連
!192 ・・・汎用UDP
!193 ・・・汎用TCP
!194 ・・・ICMP全て
!
no access-list 180
no access-list 181
no access-list 182
no access-list 183
no access-list 184
no access-list 185
no access-list 186
no access-list 187
no access-list 190
no access-list 191
no access-list 192
no access-list 193
no access-list 194
!
access-list 180 permit ip any any precedence routine
access-list 181 permit ip any any precedence priority
access-list 182 permit ip any any precedence priority
access-list 182 permit ip any any precedence immediate
access-list 183 permit ip any any precedence flash
access-list 184 permit ip any any precedence flash-override
access-list 185 permit ip any any precedence critical
access-list 186 permit ip any any precedence internet
access-list 187 permit ip any any precedence network
!
access-list 190 permit ip any any
!
!---------------------------
!191・・・VoIP関連のアクセスリスト
!
!H.245による能力交換はTCPを使用した通信ですが、ポート番号は不
!定のため、指定できません。従って以下のフィルタは万能ではあり
!ません。
!Ciscoの場合、VoIPパケットに任意のIP Precedenceを指定できるの
!で、その機能を利用します。一般には、VoIPパケットはIP
!Precedence 5に設定します。
!
!ゲートキーパ通信(H.323/H.225.0)
access-list 191 permit udp any range 1718 1719 any
access-list 191 permit udp any any range 1718 1719
!
!呼制御通信(H.323/Q.931)
access-list 191 permit tcp any eq 1720 any
access-list 191 permit tcp any any eq 1720
!
!RTP通信パケット
access-list 191 permit udp any range 16384 16483 any range 16384 16483
access-list 191 permit udp any any range 16384 16483
!
!
!---------------------------
!192・・・汎用UDPフィルタ
!
!DNS検索
access-list 192 permit udp any eq domain any
access-list 192 permit udp any any eq domain
!
!ISAKMP別名IKE
access-list 192 permit udp any eq isakmp any
access-list 192 permit udp any any eq isakmp
!
!Windows 系の名前解決NetBIOS Name Service
access-list 192 permit udp any eq netbios-ns any
access-list 192 permit udp any any eq netbios-ns
!
!NetBIOS Session Service
access-list 192 permit udp any eq netbios-ss any
access-list 192 permit udp any any eq netbios-ss
!
!SNMPとSNMPトラップ
access-list 192 permit udp any eq snmp any
access-list 192 permit udp any any eq snmp
access-list 191 permit udp any eq snmptrap any
access-list 191 permit udp any any eq snmptrap
!
!SYSLOG
access-list 192 permit udp any eq syslog any
access-list 192 permit udp any any eq syslog
!
!RADIUS
access-list 192 permit udp any eq 1812 any
access-list 192 permit udp any any eq 1812
!

!---------------------------
!193・・・汎用TCPフィルタ
!
!BGP
access-list 193 permit tcp any eq bgp any
access-list 193 permit tcp any any eq bgp
!
!DNS検索
access-list 193 permit tcp any eq domain any
access-list 193 permit tcp any any eq domain
!
!SYSLOG
access-list 193 permit tcp any eq syslog any
access-list 193 permit tcp any any eq syslog
!
!telnet
access-list 193 permit tcp any eq telnet any
access-list 193 permit tcp any any eq telnet
!
!---------------------------
!194・・・ICMP指定
access-list 194 permit icmp any any

【Cisco Tips】 Q. コンソールにメッセージが出るのを抑止するには?

次のコマンドで止まります。 no logging console

【Cisco Tips】 Q. 非同期シリアルを使ってルータのコンソールを集中管理するには?

Q. 非同期シリアルを使ってルータのコンソールを集中管理するには?

telnetと非同期シリアルを変換して、ルータのコンソールを遠隔から操作できると便利です。 次の設定は私がコミュニケーションサーバCS516(2511よりももっと前の製品)で使っている設定です。

version 9.1
!
hostname ConsoleServer
!
ip routing
 no ip domain-lookup
 ip name-server 10.1.2.10
!
interface Ethernet 0
 ip address 10.1.2.110 255.255.255.0
!
default-value exec-character-bits 8
line 1 16
 modem callout
 translate-input all
 stopbits 1
!

このような設定をしておき、Ethernet 0にふったIPアドレスに、ポート番号(2000+ライン番号)へtelnetすると、 その機器のコンソールが開くことになります。 TCP ポート番号とCiscoルータの非同期ポートとの関係を以下に記します。

┌──────┬──────┐
│非同期ポート│TCPのポート │
│番号        │番号        │
├──────┼──────┤
│1           │2001        │
├──────┼──────┤
│2           │2002        │
├──────┼──────┤
│3           │2003        │
├──────┼──────┤
│4           │2004        │
├──────┼──────┤
│5           │2005        │
├──────┼──────┤
│6           │2006        │
├──────┼──────┤
│7           │2007        │
├──────┼──────┤
│8           │2008        │<=Cisco2509ならここまで
├──────┼──────┤
│9           │2009        │
├──────┼──────┤
│10          │2010        │
├──────┼──────┤
│11          │2011        │
├──────┼──────┤
│12          │2012        │
├──────┼──────┤
│13          │2013        │
├──────┼──────┤
│14          │2014        │
├──────┼──────┤
│15          │2015        │
├──────┼──────┤
│16          │2016        │
└──────┴──────┘

【Cisco Tips】 Q. RIPとOSPFを同時に動かすと

Q. RIPとOSPFを同時に動かすと

デフォルトではOSPFのディスタンスが110でRIPのディスタンスが120です。 同じ経路情報をRIPとOSPFで受けると、OSPFが優先されます。 その情報はもはやRIPではなくOSPFとして処理されるため、RIPパケットにその経路情報が乗ることはありません。

たとえば、次のようなネットワーク構成で、全インタフェースでRIPとOSPFを並走させたとします。 このとき172.16.3.0/24がどのように伝搬するか見てみましょう。

          ┌──┐ 172.16.2.0/24  ┌──┐
          │RtrA├────────┤RtrB│
        e0└┬─┘s0            s0└─┬┘e0
      ───┴─                    ─┴───
      172.16.1.0/24                 172.16.3.0/24

RtrBにとって172.16.3.0はRIPでもOSPFでもなく、directly connectedです。 なのでRtrBはserial0に172.16.3.0の情報をRIPで送信します。 RtrAでは172.16.3.0/24をRIPで学習しつつ、OSPFでも学習します。 ディスタンスの差で172.16.3.0/24はOSPFで学習したことになります。 したがって、RtrAがethernet0に送信するRIPパケットに172.16.3.0が乗せられることはありません。

【Cisco Tips】 Q. パスワードリカバリー手順は?

@@@ Q. パスワードリカバリ手順は?

IOSルータの場合

ほとんどのCisco機器は以下の方法でいけます。 config-registerを0x2142で立ち上げます。(通常は0x2102で運用します)。 するとNVRAMの設定を読まずに立ち上がりますので次の手順でパスワードを消してください。

Router>enable
Router#>config memory
Router#>config terminal
Router(config)#>no enable secret
Router(config)#>config-register 0x2102
Router(config)#>^Z
Router#>write
Router#>reload

ここで大切なのは、config-registerを0x2142にするための手順です。 電源を入れて60秒以内にBREAKシグナルをコンソールから送ります。 RXBOOTに落すことができます。 典型的なプロンプトは次のようなものです。

rommon 1 >

ここで使えるコマンドを知りたい場合は?を入れて下さい。 oとかrというコマンドが使える場合とconfregというコマンドが使える場合に分かれます。 旧いやつはo/rで指定します。

rommon 1 >o/r 0x2142
rommon 1 >i

現行の新しい機種の場合はconfregで指定します。これは対話式メニューなので、 [システム設定を無視する?]と聞かれたら[Y]としましょう。

rommon 1 >confreg

Configuration Summary
enabled are:
load rom after netboot fails
console baud: 9600
boot: image specified by the boot system commands
      or default to: cisco2-C3600

do you wish to change the configuration? y/n  [n]:  y  ←最初はy
enable  "diagnostic mode"? y/n  [n]:
enable  "use net in IP bcast address"? y/n  [n]:
disable "load rom after netboot fails"? y/n  [n]:
enable  "use all zero broadcast"? y/n  [n]:
enable  "break/abort has effect"? y/n  [n]:
enable  "ignore system config info"? y/n  [n]:  y  ←ここだけy
change console baud rate? y/n  [n]:
change the boot characteristics? y/n  [n]:


    Configuration Summary
enabled are:
load rom after netboot fails
ignore system config info
console baud: 9600
boot: image specified by the boot system commands
      or default to: cisco2-C3600

do you wish to change the configuration? y/n  [n]:  n  ←2度目はn


You must reset or power cycle for new config to take effect
rommon 2 >
rommon 2 > i

以上の作業は単にconfig-registerを0x2142にしたのと同じです。あとは前述のパスワードリカバリの手順にしたがってください。


Catalyst5000系の場合

  1. 電源を切る
  2. 電源を入れる
  3. [Enter password]が表示されたら30秒以内にリターンキーを入力
  4. enable
  5. [Enter password]が表示されたら30秒以内でリターンキーを入力

Catalyst1900/2800の場合

MACアドレスをTACへ連絡するしかありません。


Catalyst1900ENの場合

[MODE]ボタンを押しながら電源を入れると保守画面になります。 factory defaultに戻せばOKです。

Catalyst 2900 XLの場合

IOSで動作しますが、ルータとは違います。 [MODE]ボタンを押しながら電源を入れると保守画面になります。 switch:というプロンプトが現われたら、

flash_init 
load_helper 
rename flash:config.text flash:config.old 
boot 

これで空っぽの設定で起動します。続いて次のコマンドで戻します。

rename flash:config.old flash:config.text 
config memery

Catalyst6000 MSFCの場合

reset xx (module 15 or 16)コマンドにより MSFCをresetし、 "switch-console"コマンドの入力後 break 入力により、MSFC rom monitor に入ります。 後はIOSと同じです。

【参考ページ】

全部ここにのってます。
http://www.cisco.com/warp/public/474/index.shtml

【Cisco Tips】 Channelized T1用ケーブル

Channelized T1インタフェース用のケーブルはCiscoからは買えないので、 自作するか、どこかから買ってくる必要があります (エイム電子で売ってます)。

結線は次の通りです。

DB15(Male)             RJ-45 or 4ネジ止め
1  (Tx)   -----------------  3 (TA)
3  (Rx)   -----------------  4 (RA)
11 (Rx)   -----------------  5 (RB)
9  (Tx)   -----------------  6 (TB)

【DOWNLOAD】 3. OSPFコストシミュレータ

3. OSPFコストシミュレータ

ここで紹介したOSPFのコストシミュレータです。 イマイチ使いづらい上に、イコールコストマルチパスは表示できません。

使い方

  • 何もない所をクリックするとルータを追加します。
  • シフトキーを押しながら、ルータからルータへドラッグすると線を追加します。
  • コントロールキーを押しながら、赤い丸のルータをドラッグすると、頂点ルータを変えることができます。
  • コスト値は線上の三角をドラッグすることで変えられます。値は1~100までです。
  • コスト値を0にすると線は消えます。
  • コントロールキーを押しながら、ルータをウィンドの外にドラッグすると、そのルータを削除します。
  • イコールコストマルチパスには対応してません

ソースコードは公開していません。

ダウンロード

【DOWNLOAD】 2. OSPFトポロジ表示フラッシュ

2. OSPFトポロジ表示フラッシュ

ここで紹介したフラッシュです。 フラッシュの勉強用に作成したのですが、その後C#に夢中になってしまったので、結局フラッシュはマスターできませんでした。

下のテキストボックスにCiscoのshow ip ospf database routerの表示と、 show ip ospf database networkの表示をコピー&ペーストしてください (表示例)。 トポロジを絵にします。

【ダウンロード】 ソース

【Cisco Tips】 Q. ?文字を入力するには

Ctrl-Vでエスケープする。

【OSPF】 10. エリア分割時の注意

10. エリア分割時の注意

OSPFはエリアを分割することで大規模ネットワークにも対応しています。 が、正直エリア分割はギリギリまでやらない方がいいと考えています。 単に組織の境界に合わせてエリア分割する、とかいうのは止めた方がいいと思います。 最近のルータは、1エリア100台程度なら余裕でいけると思います。

バックボーンが脆弱にならないように配慮する

OSPFバックボーンは必ず1つだけ存在しなければなりません。 そして、万が一障害が発生しても、バックボーンエリアが分断されるような事態になってはいけません。 そんな事が起こったら、それは設計ミスです。

たとえば、次のようなネットワークでエリア分割をするとしたら、どういう分割方法がよいでしょうか?

どちらでも動くのですが、対障害性という観点では上のエリア分割が優れています。 下のエリア分割で、頂点のルータ間のリンクがダウンすると、エリアが分断してしまいます。 たった一カ所の障害でバックボーンエリアが分断してしまうのはよろしくありません。

エリアの境界が2カ所ある場合どっちを優先するか配慮する

エリア内に境界ルータが2台いる場合、それぞれが出すサマリーLSAのコストがいくつになるのか、考えなければいけません。

上の図には2台の境界ルータがいます。それらはサマリーLSA①とサマリーLSA②を別々に作成します。 これらは自動で生成される場合と、手動で設定する場合があります。 自動で生成する場合には、エリア境界ルータからみたコストが使われます。 手動で生成する場合、サマライズする経路のうち、最も大きいコストのものを使用します。 ただし、設定次第では固定値を割り当てることもできます(area rangeコマンドを使います)。 ①と②は、固定メトリックを割り当てない限り、異なったメトリック値で生成されると考えた方がよいでしょう。

サマリーLSA①と②は、バックボーンエリアに流れていきます。 バックボーンエリアのルータはサマリーLSAを2個受信しますので、コストの小さい方を優先して使います。 ただし、生成した境界ルータまでのコストも加えて評価しますので、 トポロジを考慮しないとどっちを使うか分かりません。

サマリーLSA①と②は、バックボーンエリアの別の境界ルータに到達します。 それがそのまま転送されるわけではなく、新たに作り直されて転送されます。 それがサマリーLSA③と④です。

以上の事から、他エリアへの通信を制御するのは非常に難しいコスト制御が必要だ、ということを認識するべきです。 細かい制御はほぼ不可能に近く、大雑把にこっち側を優先的に使う、というような制御になります。

エリア境界で経路をサマライズする場合、ループバックアドレスは除外するように配慮する

MPLSを使う場合が特にそうなのですが、ルータのループバックアドレスが見えていないと困る時があります。 エリア境界でループバックアドレスを含めてサマライズされると困ってしまいます。 アドレスを設計する時点で、ループバック用のアドレスブロックを別途確保しておくとよいでしょう。

SPF Delayの遅延に注意

OSPFルータはLSAに変化を検出しても即座に経路を計算するわけではなく、 一定期間待った後で計算します。 障害によるトポロジ変化は一つのLSAだけでなく、2個、3個のLSAに影響がでるのが普通です。 最初のLSAを受信した時点で計算すると、意味のない計算になってしまう可能性が高いため、 そのような待機時間を設けているわけです。 LSAのフラッドは十分に高速なことを考えると、一定期間後に、ほぼ同時に全ルータが計算を開始する事になります。

ただしこれは一つのエリアに限った話しです。エリア境界ルータは、エリア内経路を計算するとサマリーLSAも変更します。 サマリーLSAを広告した後、さらにSPF Delay待たないと別のエリアには伝搬しないことになります。

エリアを分割すると、このようにSPF Delayが積み重なっていきますので、経路の伝搬もそれに応じて遅くなっていきます。

【OSPF】 9. OSPFとHSRP

9. OSPFとHSRP

OSPFとHSRPは基本的に独立したものですが、まったく無関係というわけではありません。 行きのトラフィックはHSRPで救えても、 戻ってくるトラフィックはOSPFでルーティングされてくるわけですから、 どのくらいの時間で通信が復旧するかの見積もりにはOSPFの知識が欠かせません。

HSRPを組んだセグメントがブロードキャスト型になっていると、 指名ルータにリンク障害が発生するとRouter Dead Intervalだけ通信が途絶えてしまいます。 ネットワークのタイプをp2mpに変更する、といった工夫が必要です。

またコスト設計にも注意が必要です。スタンバイルータが直接WANへ投げるようなコスト設計が必要です。 たとえば、次のようなコスト設計は失敗です。

上記のコスト設計では、R6から対向側LAN(192.168.1.0/24)に到達するのに、現用回線を通るとコスト50(30+10+10)、 バックアップ回線を通ると60(30+30)となり、常に現用回線を通るようになってます。 これでは、せっかくHSRPを使ってアクティブ・スタンバイ切り替えを高速にしても、 ルーティングが落ち着くまで迂回してくれません。

次のように設計すれば、HSRPの動作と、ルーティング動作が連携してよい結果が得られます。

つづく。

【OSPF】 8. OSPFの豆知識

8. OSPFの豆知識

CiscoのHello interval

CiscoのHello intervalはネットワークタイプに応じて自動でデフォルト値が変わります。 broadcastは10秒、point-to-pointは10秒、point-to-multipointは30秒です。 さらにRouter DeadはHello Intervalが変わると自動的に変わります。 Router DeadはHello Intervalの4倍です。

MTUとOSPFの関係

MTU長が一致していないとネイバーのステートがEXCHANGEから先に進めなくなります。 トンネルインタフェースや、L3SW系でMTUが1500よりも長くなっているときには注意が必要です。 Ciscoは設定でMTU不一致を無視することもできます(IOSに依存します)。 インタフェース設定で、ip ospf mtu-ignoreコマンドを入れておけばOKです。

OSPFでLSAを消去するには

RIPの場合メトリック無限大(16)のRIPを送信して経路を取り消します(poison)。 OSPFの場合にはLS AgeフィールドにMaxAgeの値をセットして再フラッドします。

ルータID

ルータIDは32ビットの正数値ですが、IPv4アドレスと同じ形式で設定することが多いです。 Ciscoはループバックアドレスを設定していると、そのアドレスがルータIDに選ばれます。 IPアドレスを一つも設定していない状態でOSPFを設定しようとすると、 弾かれますので注意しましょう。

ルータID自体は単なる識別子ですので、0.0.0.1とかそういう値を設定すればよいのですが、 ループバックアドレスを持つならそれをルータIDにした方がよいでしょう。

ルータIDが変化した場合、そのルータが生成したすべてのLSAはMaxAgeに設定してドメイン内で消去し、 OSPFのプロセスを再スタートさせる必要があります。 この処理を行わないと実際にMaxAge経過するまでの間、ルーティングがおかしいままになります。

なお、隣接ルータ間でルータIDが同じだった場合、 DDのシーケンスで処理は停止します。これはMaster/Slaveの関係が構築できないためです。 (Router IDの大小でMaster/Slaveが決定するので、同じRouter IDだと勝負が決まらないためです)。

SPF Delay調整

LSAに変化を検出してSPF計算をするまでの待ち時間は、全OSPFルータで揃ってないといけません。 揃っていない場合、ピンポン現象が発生することがあります。 Juniperは50msecがデフォルト、Ciscoは5秒です。

Ciscoはtimers spfコマンドで設定しますが、これはtimers throttle spfコマンドに置き換えられました。 変更するのなら次のようにするといいと思います。

!
router ospf 1
  router-id 0.0.0.1
  timers throttle spf 50 1000 10000

【OSPF】 7. p2mpが指名ルータを救う

7. p2mpが指名ルータを救う

前回までのあらすじ
ネットワークを二重化構成にしていても、障害の発生した場所が指名ルータになっていると、 通信が途絶える時間は長くなってしまう。 これは古い指名ルータの作成したネットワークLSAが無効になってしまうためである。 新しい指名ルータが選ばれるには、Router Dead Interval待たなければならない。

指名ルータとは

ブロードキャスト型のネットワークの場合、同じセグメントに多数のルータが同居することになります。 その場合、ルータ同士が直接隣接関係を作ると、自分以外の(N-1)台のルータを意識しなければなりません。 リンクステート型では、相手がどのLSAを持っているのか常に把握している必要がありますので、隣接数が多いとこれは大変です。 OSPFではこれを工夫して、誰か一人をそのLANの代表者とし、そこを中心に隣接関係を構築します。

実際にはバックアップ指名ルータもいますので、2台のルータと隣接関係を構築します。 LAN上に4台以上のルータがいると、ネイバー状態を表示したときに2WAY以上に進まないルータが出てきますが、まったく問題ありません(たとえば上の図でいうとRa-Rb間は2way止まりです。

指名ルータをなくすには

指名ルータを使うことで、全体的な処理負荷を下げることができるわけですが、 ノードの数がそう多くないなら、あまり効果は望めないと言えます。

OSPFではブロードキャスト型以外に、point-to-multipoint(以下p2mp)というタイプが使えます。 基本的にATMとかフレームリレーのような、point-to-pointの集まったネットワークに使用するのですが、 実はイーサネットの上でも使えます。 試してみましょう。

次の図で、R1-R2-R7のLAN(ピンクの網掛け部分)をp2mpに変更してみます。

R7(Cisco)の設定は次(↓)のようにします。 タイプをp2mpに変えるとHelloインターバルが自動的に30秒になってしまいます。 これだとJuniperと一致しなくなってしまいますので、手動で10秒に戻します。 ip mtuもjuniperと一致させるために設定しています。 (一致させないとOSPFのDDのシーケンスではじかれてしまいます)。

!
interface Ethernet1
 ip address 192.168.1.7 255.255.255.0
 ip mtu 1486
 ip ospf network point-to-multipoint
 ip ospf hello-interval 10
 ip ospf priority 0

Juniperはこう(↓)します。 Juniperの場合、p2mpを設定すると、既知のネイバーにしかHelloを送信しません。 R7(Cisco)はマルチキャストでHelloを出してくれるので、 R7-R1やR7-R2は自動でネイバーを確立しますが、 R1-R2間のネイバーには手動設定が必要です。

ospf {
    area 0.0.0.0 {
        interface fe-0/0/0.0 {
            interface-type p2mp;
            metric 10;
            neighbor 192.168.1.2;
            neighbor 192.168.1.7;
        }
        interface lo0.0;
        interface fxp0.0 {
            disable;
        }
        interface so-0/1/0.0 {
            metric 10;
        }
    }
}

設定したら、LSAの一覧を調べてみましょう。 どのルータで実行しても同じですが、R4でshow ip ospf databaseコマンドを入力してみます(↓)。 ネットワークLSAが一つ無くなっていることがわかります。 192.168.1.0/24のセグメントには指名ルータがいないので、192.168.1.0/24のネットワークLSAは無くなりました。

R4#show ip ospf database

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   976         0x80000194 0x00458F 6
192.168.254.2   192.168.254.2   987         0x800001DF 0x00E730 6
192.168.254.4   192.168.254.4   192         0x80000029 0x00D478 3
192.168.254.5   192.168.254.5   181         0x80000024 0x00755F 2
192.168.254.6   192.168.254.6   1883        0x80000031 0x007F86 4
192.168.254.7   192.168.254.7   1371        0x8000002D 0x0091BD 4

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.2.6     192.168.254.6   1883        0x80000027 0x006681
R4#

次にR1(Juniper)が生成したルータLSAを見てみます(↓)。 青字になっているところが変化したところです。 自分のインタフェースアドレス192.168.1.1/32のホストルートを広告しているのが分かります。

R4#show ip ospf database router adv-router 192.168.254.1

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 1065
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.1
  Advertising Router: 192.168.254.1
  LS Seq Number: 80000194
  Checksum: 0x458F
  Length: 96
  Number of Links: 6

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.1.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.7
     (Link Data) Router Interface address: 192.168.1.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.2
     (Link Data) Router Interface address: 192.168.1.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.4
     (Link Data) Router Interface address: 0.0.0.70
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.4
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

R7(Cisco)が生成したルータLSAを見てみましょう(↓)。 Juniperと同じく、自足のインタフェースアドレス192.168.1.7/32のホストルートを広告しています。

R4#show ip ospf database router adv-router 192.168.254.7

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 1590
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 192.168.254.7
  Advertising Router: 192.168.254.7
  LS Seq Number: 8000002D
  Checksum: 0x91BD
  Length: 72
  Number of Links: 4

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.1
     (Link Data) Router Interface address: 192.168.1.7
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.2
     (Link Data) Router Interface address: 192.168.1.7
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.1.7
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.7
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

192.168.1.0/24のネットワークLSAが無くなり、 なおかつルータLSAでは自足のインタフェースアドレスしか広告してませんから、 他のルータから見ると・・・
次のように、192.168.1.0/24のセグメントはホストルートしか見えないことになります。

R4#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     172.16.0.0/24 is subnetted, 1 subnets
C       172.16.2.0 is directly connected, FastEthernet0/0
O    192.168.26.0/24 [110/21] via 192.168.2.6, 00:05:01, FastEthernet1/0
     192.168.254.0/32 is subnetted, 6 subnets
O       192.168.254.6 [110/2] via 192.168.2.6, 00:05:01, FastEthernet1/0
O       192.168.254.7 [110/21] via 192.168.254.1, 00:05:01, POS2/0
C       192.168.254.4 is directly connected, Loopback0
O       192.168.254.5 [110/2] via 192.168.2.5, 00:05:01, FastEthernet1/0
O       192.168.254.2 [110/21] via 192.168.2.6, 00:05:01, FastEthernet1/0
O       192.168.254.1 [110/10] via 192.168.254.1, 00:05:01, POS2/0
     192.168.1.0/32 is subnetted, 3 subnets
O       192.168.1.1 [110/10] via 192.168.254.1, 00:05:01, POS2/0
O       192.168.1.2 [110/21] via 192.168.2.6, 00:05:01, FastEthernet1/0
O       192.168.1.7 [110/20] via 192.168.254.1, 00:05:01, POS2/0
C    192.168.2.0/24 is directly connected, FastEthernet1/0
R4#

このことはつまり、そのセグメントにホスト(PC)を接続しても、外からは通信できないことを意味します。 あくまでルータ間のリンクしか使えない技であることに注意しましょう。

切り替え速度は速くなるのか?

R5→R7にpingを打ちながら、R1(Juniper)のfe-0/0/0を抜いてみましょう。

R5#ping
Protocol [ip]:
Target IP address: 192.168.254.7
Repeat count [5]: 1000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 1000000, 100-byte ICMP Echos to 192.168.254.7, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (473/476), round-trip min/avg/max = 1/3/8 ms
R5#

6秒ほどの通信断時間の後、経路が切り替わりました。 CiscoのSPF Delayが5秒ですから、悪くない数字です。

このように、ルータ間のネットワークタイプをp2mpにすることで指名ルータを排除し、 経路の切り替え速度を上げることができます。

つづく。

【BFD】 7. BFDは指名ルータ問題を救うか?

7. BFDは指名ルータ問題を救うか?

ブロードキャスト型のLANでOSPFを使うと、指名ルータが自動的に選ばれます。 指名ルータのミッションの一つに、ネットワークLSAを作成する、というものがあります。

指名ルータのインタフェースが障害を起こすと、そのセグメントには一時的に指名ルータがいない状態に陥ります。 そうするとネットワークLSAが古いままとなり、たとえ迂回路があっても、 新しい指名ルータが決まってネットワークLSAが作り直されるまで通信は途絶えてしまいます。

BFDプロトコルを使えば、隣接ルータの死活情報を常に把握します。 はたして、BFDによる障害検知は、このような指名ルータ問題を解決するのでしょうか?

次のネットワークで、R1-R2-R7は同じブロードキャストネットワークにいます。 R5-R7間の通信は常に図の左側、R1-R4側を通るようにコスト設計しています。

このとき、R1がfe-0/0/0上で指名ルータをしていると、そのケーブルを抜いたときにはおよそ40秒の通信断時間が発生しました。 これはブロードキャスト型の宿命なのですが、 BFDを使って指名ルータのダウンを高速に検知してもダメなのでしょうか? 実験してみましょう。

設定 ( R1  R2  R4  R6  R6  R6)

まず、R1が指名ルータになっていることを確認します。 LSAの一覧を見ると、R1(Router ID=192.168.254.1)がネットワークLSAを作っていますので、 R1はfe-0/0/0上で指名ルータになっています。

R7c2514#show ip ospf database

            OSPF Router with ID (192.168.254.7) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   175         0x80000168 0x4A34   4
192.168.254.2   192.168.254.2   175         0x800001B5 0xC80C   4
192.168.254.4   192.168.254.4   273         0x80000009 0x670    3
192.168.254.5   192.168.254.5   1225        0x80000004 0xB53F   2
192.168.254.6   192.168.254.6   880         0x80000011 0x62E9   4
192.168.254.7   192.168.254.7   484         0x80000006 0xCB1C   2

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.2     192.168.254.2   175         0x80000004 0xAB8D
192.168.2.6     192.168.254.6   1122        0x80000008 0xA462
R7c2514#

次に、R1-R2間でBFDが走っていることを確認します。

gsi@R1# run show bfd session
                                                          Transmit
Address              State     Interface     Detect Time  Interval  Multiplier
192.168.1.2          Up        fe-0/0/0.0          0.600     0.200      3
192.168.1.7          Failing   fe-0/0/0.0          0.000     1.000      3

2 sessions, 2 clients
Cumulative transmit rate 6.0 pps, cumulative receive rate 5.0 pps

それでは、R5→R7にpingを打ち続けながらR1のfe-0/0/0を抜いてみましょう。

R5#ping
Protocol [ip]:
Target IP address: 192.168.254.7
Repeat count [5]: 1000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 1000000, 100-byte ICMP Echos to 192.168.254.7, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
途中省略
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.UUUUUUUUUUUU.................
.........!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 95 percent (812/851), round-trip min/avg/max = 1/3/8 ms
R5#

残念! およそ40秒の通信断時間になっています。 やはりBFDを使って指名ルータがいなくなったことを検知しても、 Helloを使わないと新しい指名ルータは選出できないということですね。

おしまい。

【OSPF】 6. OSPFの経路切り替えは速くない

6. OSPFの経路切り替えは速くない

OSPFの経路切り替えは一般に高速なのですが、 ブロードキャスト型を使っているときにはそうとは限りません。 実験してみましょう。

次のネットワークでは全体をエリア0としてOSPFでルーティングしています。 R5-R7間の通信は常に左側、R1-R4間を通るようにコストを調整しています。 R1のイーサを抜いたときに、どのくらいでその障害を迂回するのか調べたいと思います。

設定 ( R1  R2  R4  R6  R6  R6)

R1-R2セグメントはイーサネットですので、どちらかが指名ルータを実行します(R7はプライオリティを0にしています)。 R1が指名ルータをやっているときと、R2が指名ルータをやっているときで、 停止時間に差があるかどうかを調べます。

実験1:R2が指名ルータの時

show ip ospf databaseコマンドでLSAの一覧を調べてみます。 次の表示では、R2(Router ID=192.168.254.2)がネットワークLSAを作っています。 このことから、R2が指名ルータを実行していることが分かります。

R7c2514#show ip ospf database

            OSPF Router with ID (192.168.254.7) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   9           0x80000164 0x5230   4
192.168.254.2   192.168.254.2   9           0x800001B3 0xCC0A   4
192.168.254.4   192.168.254.4   2019        0x80000008 0x86F    3
192.168.254.5   192.168.254.5   956         0x80000004 0xB53F   2
192.168.254.6   192.168.254.6   611         0x80000011 0x62E9   4
192.168.254.7   192.168.254.7   215         0x80000006 0xCB1C   2

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.2     192.168.254.2   9           0x80000002 0xAF8B
192.168.2.6     192.168.254.6   852         0x80000008 0xA462
R7c2514#

R5→R7にpingを打ち続けながら、R1のfe-0/0/0を抜いてみます。

R5#ping
Protocol [ip]:
Target IP address: 192.168.254.7
Repeat count [5]: 10000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 10000000, 100-byte ICMP Echos to 192.168.254.7, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
途中省略
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (551/554), round-trip min/avg/max = 1/3/8 ms
R5#

およそ6秒で通信が復活しました。 CiscoのSPF Delayが5秒であることを考えると、納得のいく速さです。


実験2:R1が指名ルータの時

もう一度show ip ospf databaseでLSAの一覧を調べてみます。 R1(Router ID=192.168.254.1)がネットワークLSAを作っていることから、 R1が指名ルータを実行していることがわかります。

R7c2514#show ip ospf database

            OSPF Router with ID (192.168.254.7) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   353         0x80000160 0x5037   4
192.168.254.2   192.168.254.2   350         0x800001B0 0xC812   4
192.168.254.4   192.168.254.4   1659        0x80000008 0x86F    3
192.168.254.5   192.168.254.5   597         0x80000004 0xB53F   2
192.168.254.6   192.168.254.6   251         0x80000011 0x62E9   4
192.168.254.7   192.168.254.7   408         0x80000005 0xB732   2

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.1     192.168.254.1   353         0x80000002 0xC379
192.168.2.6     192.168.254.6   493         0x80000008 0xA462
R7c2514#

この状態で、R5→R7にpingを打ちながら、R1のfe-0/0/0を抜いてみます。

R5#ping
Protocol [ip]:
Target IP address: 192.168.254.7
Repeat count [5]: 1000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 1000000, 100-byte ICMP Echos to 192.168.254.7, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
途中省略
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!.UUUUUUUUUUUU.....................!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!
Success rate is 95 percent (672/706), round-trip min/avg/max = 1/3/4 ms
R5#

およそ40秒停止しました。


違いが出るのはなぜ?

R1はリンクダウンと同時にルータLSAを作り直します。 ところが、ネットワークLSAは指名ルータが作りますので、 リンクダウンしたインタフェースが指名ルータかどうかで動作が変わってきます。

もしリンクダウンしたインタフェースが指名ルータだとすると、 そのセグメントには指名ルータが一人もいなくなることになります。 新しい指名ルータを選ぶには、Helloによる選挙が必要です。 Helloの選挙はRouter Dead Intervalが経過しないと始まりませんので、 その期間中は古いネットワークLSAが残りっぱなしになります。

実際、通信できない期間中にLSAの一覧を表示すると、 ネットワークLSAが古いまま残っていることが分かります。 (この表示はリンクダウンさせてから30秒程経過した後で採取しました)。

R7c2514#show ip ospf database

            OSPF Router with ID (192.168.254.7) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   28          0x80000161 0xA1D4   3
192.168.254.2   192.168.254.2   481         0x800001B0 0xC812   4
192.168.254.4   192.168.254.4   1790        0x80000008 0x86F    3
192.168.254.5   192.168.254.5   728         0x80000004 0xB53F   2
192.168.254.6   192.168.254.6   382         0x80000011 0x62E9   4
192.168.254.7   192.168.254.7   539         0x80000005 0xB732   2

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.1     192.168.254.1   3624        0x80000002 0xC379
192.168.2.6     192.168.254.6   624         0x80000008 0xA462
R7c2514#

Router Dead Intervalが経過して新しい指名ルータが選ばれると、 ネットワークLSAも新しくなり、通信が復旧します。

リンクダウンしたインタフェースが指名ルータでなければ、 既存の指名ルータがネットワークLSAを即座に作り直しますので、 通信の復旧は高速なのです。

というわけで、イーサネットのようなブロードキャスト型のネットワークを使っていると、 必ずしも切り替え速度は高速でないことを頭に入れておくべきです。

Juniperのコンフィグを見ると分かると思いますが、実はR1とR2にBFDの設定を入れています。 BFDを使うと上記のような指名ルータ問題を解決できるのでしょうか? その答えはこちら

つづく。

【Cisco Tips】 JuniperとCiscoをPOSで接続するには

JuniperとCiscoをPOSで接続するには

JuniperのPOSのデフォルト値は次のようになっているので、 RFC2615に合わせればよい。

http://www.juniper.net/techpubs/software/junos/junos56/swconfig56-interfaces/html/interfaces-sonet-config9.html#1014413

RFC 1619
Default
RFC 2615
SONET C2 Header Byte
0XCF
0XCF
0X16
Frame Checksum (bit)
16
16
32
Payload Scrambling
n/a
Enabled
Enabled

Juniperはこう(↓)

so-0/1/0 {
    clocking internal;
    encapsulation ppp;
    sonet-options {
        rfc-2615;
    }
    unit 0 {
        family inet {
            address 192.168.26.2/24;
        }
    }
}

Ciscoはこう(↓)

!
interface POS2/0
 ip address 192.168.26.6 255.255.255.0
 encapsulation ppp
 no keepalive
 crc 32
 pos scramble-atm
 pos flag c2 22
 no cdp enable

おまけ。実験で使った接続。

Juniper(MM) Rx (-10dB)----シングルモードファイバ----Tx Cisco (SM)
Juniper(MM) Tx ----------マルチモードファイバ------Rx Cisco (SM)

【OSPF】 5. ネットワークタイプとルータLSA

5. ネットワークタイプとルータLSA

OSPFではネットワークのタイプを明確に分けています。 タイプによって、LSAの配布動作が変わるだけでなく、ルータLSAの作り方も変わります。 各種タイマーのデフォルト値も変わります。

以下に、簡単にまとめておきます。

ブロードキャスト型

ブロードキャストが可能なメディアで指定します。EthernetやFDDI、TokenRing等が該当します。

普通に使われるデフォルト値

  • Hello Interval = 10秒
  • Router Dead Interval = 40秒

隣接が確立されていない時のルータLSA

  • Connection to stub
    • Link ID = ネットワーク番号
    • Link Data = マスク

NBMA

滅多に使われません。今はpoint-to-multipointを使います。

ネイバーを一つ一つ手で指定します。 指定したネイバーとHelloを交換し、代表ルータを決定します。 代表ルータはネットワークLSAを生成します。 したがって、NBMAのネットワークタイプになっている網全体で一つのネットワークアドレスになるようにアドレス設計します。

hub & spokeの形態の場合、指名ルータの位置を固定しないといけません。 すべてのネイバーに直接通信できるhubルータが代表ルータになるように調整します。 これは生成されたネットワークLSAが網内すべてのルータに行き渡るようにするためです。

普通に使われるデフォルト値

  • Hello Interval = 30秒
  • Router Dead Interval = 120秒

LSAの中身はブロードキャストと同じです。

point-to-point

ネイバー毎に独立したインタフェースを生成する時に使います。 hub & spokeの形態の場合、hubルータはインタフェースを大量に消費してしまうのが難点です。 Ciscoルータはソフト、ハード込みで計300インタフェースしか生成できませんので、注意が必要です。

インタフェース毎に独立したアドレッシングが可能で、unnumberedもサポートされています。 (unnumberedができるのはpoint-to-pointのネットワークタイプのみです)。

普通に使われるデフォルト値

  • Hello Interval = 10秒
  • Router Dead Interval = 40秒

numberedの場合のルータLSA

  • Connection to point-to-point
    • Link ID = 相手ルータのルータID
    • Link Data = 相手ルータのインタフェースIPアドレス
  • Connection to stub
    • Link ID = ネットワーク番号
    • Link Data = マスク

ただし、unnumberedの場合、相手ルータのIPアドレスがいまいち分からない場合もあるので、 その場合、conn. to stubは省略しても構いません。 Ciscoは省略しますが、Juniperは省略しません。 省略する場合は下のような形式になります。

unnumberedの場合のルータLSA

  • Connection to point-to-point
    • Link ID = 相手ルータのルータID
    • Link Data = MIB IIのifIndex

point-to-multipoint

一つのインタフェースでマルチアクセスできる場合、個々のネイバーをpoint-to-pointの束として扱います。 基本的に網内におけるすべてのネイバーはpoint-to-multipointを設定しないといけません。 hub & spokeの形態になっている時、hubルータだけがp2mpとして設定しがちですが、それは間違いです。 マルチアクセスのインタフェースでunnumberedは設定不可能ですので、網内で一つのネットワークアドレスを持つように設定します。 ただし、ルータのルーティングテーブルにこのネットワークアドレスはインストールされません。 インタフェースに振ったアドレスのホストルートがインストールされます(それで充分なはずです)。

普通に使われるデフォルト値

  • Hello Interval = 30秒
  • Router Dead Interval = 120秒

point-to-multipointのルータLSA(必ずnumbered)

  • Connection to point-to-point
    • Link ID = 相手ルータのルータID
    • Link Data = 相手ルータのインタフェースIPアドレス
  • Connection to stub
    • Link ID = 自分のインタフェースIPアドレス
    • Link Data = 255.255.255.255

つづく。

【OSPF】 4. ルータLSAの中身

4. ルータLSAの中身

ルータLSAはその時のルータの状況によって変化していきます。 同じイーサネットに繋がっているときでも、そのイーサ上に他にルータがいるときと、いないときで中身は変化します。

たとえば次の図の左側は、2台のルータはお互いに存在を認識していない状況です。 立ち上げ直後とか、スパニングツリーのブロッキング状態などでこういう状況になります。 そうなると、ルータは「自分以外にルータのいないセグメント」というように判断しますので、 Connection to a stub networkというようにルータLSAを作ります。 Helloを使って隣接ルータを認識すると、右の図のようになります。 こうなると、Connection to a transit networkという内容でルータLSAを作ります。 ネットワークに異変が起こると、その状況に応じて次々にその中身を変えていくわけです。

イーサネット(というか、ブロードキャスト型)の場合、 自分以外のルータがいるかどうかでLSAの作り方が変わるのですが、 もう一つ注意したいのは専用線の場合です。 Point-to-pointネットワークではIPアドレスを割り当てないunnumberedという接続方法がよく用いられますが、 アドレスを割り当てた場合と、unnumberedの場合でルータLSAの中身は変わります。

RFC2328のセクション12.4.1.1によると、 Connection to a point-to-pointというのが必須です。 加えて、Connection to a stubというのも入れるべきだと言っています。

分かりづらいので、ここでは実験して具体的に見てみましょう。

設定 ( R1  R2  R4  R6)

R1, R2はJuniperです。R4, R6はCiscoです。R5とR7はおまけのCiscoで、ホストの代わりに置いてます。 R1-R4間をPOSで繋ぎ、Unnumberedとします。R2-R6間もPOSで繋ぎ、ここには192.168.26.0/24のサブネットを割り当てます。

このネットワークでLSAが全部で何個生成されるか見てみましょう。

R4#show ip ospf database

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   350         0x80000156 0x00642D 4
192.168.254.2   192.168.254.2   835         0x800001A8 0x00D80A 4
192.168.254.4   192.168.254.4   1305        0x80000005 0x000E6C 3
192.168.254.6   192.168.254.6   1923        0x8000000D 0x006AE5 4

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.1     192.168.254.1   370         0x80000003 0x007639
192.168.2.6     192.168.254.6   412         0x80000004 0x0085F6
R4#

全部でルータLSAが4個、ネットワークLSAが2個あります。 OSPFルータは4台で、それぞれが1個ずつルータLSAを作成しています。 ネットワークLSAは、2台以上のルータがいるブロードキャスト型ネットワークに登場します。 指名ルータがネットワークLSAを作成します。

Juniperのunnumbered point-to-pointの例

R1(Juniper)はUnnumberedリンクを持っています。

R4#show ip ospf database router adv-router 192.168.254.1

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 620
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.1
  Advertising Router: 192.168.254.1
  LS Seq Number: 80000156
  Checksum: 0x642D
  Length: 72
  Number of Links: 4

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.1.1
     (Link Data) Router Interface address: 192.168.1.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.4
     (Link Data) Router Interface address: 0.0.0.70
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.4
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

青い字になっている部分がPOSの部分に相当します。 Juniperの場合、Connection to point-to-pointに加えて、Connection to a stubを入れてます。 RFCで推奨される通りの動作ですが・・・
その中身に注目してください。 Connection to a stubで広告している192.168.254.4/32はR4のループバックアドレスです。 これは意味的におかしいですね。 R4が広告すべきホストルートをR1が広告してしまってます。 これはUnnumberedリンクの弊害で、仕方ないことです。

Juniperのnumbered point-to-pointの例

R2のPOSは192.168.26.0/24というサブネットを持ったPoint-to-pointです。

R4#show ip ospf database router adv-router 192.168.254.2

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 1758
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.2
  Advertising Router: 192.168.254.2
  LS Seq Number: 800001A8
  Checksum: 0xD80A
  Length: 72
  Number of Links: 4

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.1.1
     (Link Data) Router Interface address: 192.168.1.2
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.2
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.6
     (Link Data) Router Interface address: 192.168.26.2
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.26.0
     (Link Data) Network Mask: 255.255.255.0
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

同じく、青い字になっている部分がPOSの部分に相当します。 Connection to point-to-pointの中身(Link ID、Link Data)がunnumberedの時と微妙に違うのが分かります。 Connection to a stubは、割り当てられたサブネット192.168.26.0/24なので、これは納得です。

Ciscoのunnumbered point-to-pointの例

次にCiscoのunnumberedの例を見てみましょう。

R4#show ip ospf database router adv-router 192.168.254.4

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 429
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 192.168.254.4
  Advertising Router: 192.168.254.4
  LS Seq Number: 80000006
  Checksum: 0xC6D
  Length: 60
  Number of Links: 3

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.4
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.1
     (Link Data) Router Interface address: 0.0.0.5
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.2.6
     (Link Data) Router Interface address: 192.168.2.4
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

Ciscoの場合、Connection to point-to-pointのみになってます。 RFCではConnection to stubはSHOULDなので、これでもよいのです。 むしろ、好ましいと言えます。

Ciscoのnumbered point-to-pointの例

Ciscoのnumberedの場合も見ておきましょう。

R4#show ip ospf database router adv-router 192.168.254.6

            OSPF Router with ID (192.168.254.4) (Process ID 100)

                Router Link States (Area 0)

  LS age: 1185
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 192.168.254.6
  Advertising Router: 192.168.254.6
  LS Seq Number: 8000000E
  Checksum: 0x68E6
  Length: 72
  Number of Links: 4

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.6
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 192.168.254.2
     (Link Data) Router Interface address: 192.168.26.6
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.26.0
     (Link Data) Network Mask: 255.255.255.0
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.2.6
     (Link Data) Router Interface address: 192.168.2.6
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

これはJuniperのnumberedと同じですね。

つづく。

【IS-IS】 RFC1195 Use of OSI IS-IS for Routing in TCP/IP and Dual Environments

RFC1195 Use of OSI IS-IS for Routing in TCP/IP and Dual Environments を日本語にしてみました。 Annex Cはかなり難解です。誤訳があるかもしれません。

RFC1195  原文、  日本語(ShiftJIS, DOS)

【DOWNLOAD】 1. IOS Config Manager

1. IOS Config Manager

IOS Config Mangerはクリックするだけでコンフィグをダウンロードすることのできる便利なツールです。 コンフィグのダウンロード方法は、次の2通りあります。

  1. SNMP+TFTPサーバ
  2. telnet + show running-config

SNMPを使う場合、必ずRW(ReadWrite)のコミュニティを許可していないといけません。 SNMPの場合、コンフィグを受け渡す手段としてTFTPを使いますので、 このツールがTFTPサーバを実行します。

telnetを使う場合、enable secretを設定しておく必要があります。 また、telnetを自動運転して任意のコマンドを投入することもできます。

スクリーンショット
スクリーンショット

ソースコードは公開していません。

ダウンロード】(419KB)

【OSPF】 3. マップからルーティングテーブルへ

3. マップからルーティングテーブルへ

前回までのあらすじ

OSPFを実行するルータは、必ず一つルータLSAを作ります。 イーサで繋がっている部分は指名ルータというものを選びます。指名ルータはネットワークLSAを作ります。 それらLSAを全部集めると地図を作ることができます。

ルータは最終的にルーティングテーブルを作らないといけないのですが、そこで用いるのがダイクストラ演算です。 複雑なネットワークでは、同じ宛先にたどり着くのにいくつもの経路が存在することになります。 このとき全てのルータが同じアルゴリズムで経路を選択しないと、 ループ(ピンポン現象)やブラックホール現象が発生してしまいます。 経路を選択する基準は『宛先に到達するための最短パス』です。

OSPFではインタフェースごとにコストという値を設定します。 ルータによってデフォルト値が決まっていたり、回線速度によって調整されてたりしますが、 本来は設計者が手動で設定しなければいけないパラメータです。 そして、ルータは宛先にたどり着くのに必要なトータルコストが最短になるものを選び出すわけです。

コストは「ルータからネットワーク」に到達するときに加算されます。 ですから↓のようなコスト設計では、R1→R2のコストは10、R1→R3のコストは20となるわけです。 当然、行きと帰りで異なるコスト値になることもあります。

コスト設計というのは、意図したとおりにトラフィックを通そうとすると時に非常に難しい事になります。 たとえば↓のような二重化構成のネットワークで、 Rg→RhのトラフィックはRg→Rc→Rh、Rg→Rd→Rh、Rg→Rc→Rd→Rh、という通り方がありますが、 これをコストで制御するわけです。

これがどのくらい難しいかを実感してもらうために、簡単なアプリケーションを作ってみました。 Dijkstra.exe をローカルに保存してから実行してみてください。 実行したら、編集→サンプル→サンプル(2階層ツリートポロジ)、と辿ってください。 こんな画面↓が現れると思います。

使い方

  • 何もない所をクリックするとルータを追加します。
  • シフトキーを押しながら、ルータからルータへドラッグすると線を追加します。
  • コントロールキーを押しながら、赤い丸のルータをドラッグすると、頂点ルータを変えることができます。
  • コスト値は線上の三角をドラッグすることで変えられます。値は1~100までです。
  • コスト値を0にすると線は消えます。
  • コントロールキーを押しながら、ルータをウィンドの外にドラッグすると、そのルータを削除します。
  • イコールコストマルチパスには対応してません

どうですか? 案外コスト設計は難しいでしょう?

最短コストのツリーが完成したら、ここからルーティングテーブルを作るのは容易な作業です。 全ての宛先について、そこに到達するのにどのネクストホップを使えばいいかを調べるだけです。

つづく。

【OSPF】 2. 地図を作るには

2. 地図を作るには

いちおう前回の解説をしておきます。 ルータ3台からなるOSPFネットワークを作りました。 人間はネットワークを設計するときに↓のような図を書くわけですが、 実はOSPFルータも内部で同じような事をやってるのです。

Ciscoルータでshow ip ospf database router、 show ip ospf database networkコマンドの表示結果をフラッシュに食わせると↓のような絵が描けたと思います。 緑色の丸がルータ、四角がネットワークを表しています。

このようにリンクステートデータベースというのは、 ネットワークの図を書くための情報がもれなく記述されていて、 ルータは機械的にその絵を作ることができるのです。 もっとも、ルータは絵を描きたいわけではなく、ルーティングテーブルを計算するのが目的です。

ルータLSAとは

ルータLSAはどのルータも必ず一つ作成し、インタフェースがどういうネットワークに繋がっているのかを記してます。 大雑把に言うと、どのアドレスにコストいくつで繋がっているか、という情報で構成されてます。


  LS age: 335
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.1
  Advertising Router: 192.168.254.1
  LS Seq Number: 80000107
  Checksum: 0x47ED
  Length: 60
  Number of Links: 3

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.1.2
     (Link Data) Router Interface address: 192.168.1.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.0.6
     (Link Data) Router Interface address: 192.168.0.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0

青い文字の部分はLSAの共通ヘッダです。 そのLSAの種類は何なのか(ルータLSAなのかネットワークLSAなのか)、 誰が作ったのか、 作られて何秒経過したか、 等の情報が入ってます。

ルータLSAの中身は、どういうリンクに繋がっているのか、という情報がインタフェースの数だけ含まれてます。 Link connected to: a Transit Networkというのは、「他にもルータが存在するネットワークに繋がっている」という意味です。 Link connected to: a Stub Networkというのは、「自分以外にルータはいないネットワークに繋がっている」という意味です。

上記のルータLSAはR1が作ったものなのですが、R1-R6間はTransit、R1-R2間もTransit、あと一つループバックインタフェースというのを持っているのですが、これはStubです。 Transitに繋がっている場合、指名ルータのアドレスが重要な情報になります。 というのも、 OSPFでは指名ルータがネットワークLSAを作成するため、ルータLSAとネットワークLSAをくっつけるのにこの情報が必要になるのです。 Stubに繋がっている場合、それがどういうアドレス/マスクなのかを記します。

次にネットワークLSAを見てみましょう。R6が作成したネットワークLSAを次に示します (R6がネットワークLSAを作っているということは、R1-R6間のセグメントはR6が指名ルータになっていることを意味します)。


  Routing Bit Set on this LSA
  LS age: 1045
  Options: (No TOS-capability, DC)
  LS Type: Network Links
  Link State ID: 192.168.0.6 (address of Designated Router)
  Advertising Router: 192.168.254.6
  LS Seq Number: 80000034
  Checksum: 0x1140
  Length: 32
  Network Mask: /24
        Attached Router: 192.168.254.6
        Attached Router: 192.168.254.1

青い字は共通ヘッダです。 中身は何かというと、そのセグメントのサブネットマスクと、そのセグメントに存在するルータのリストです。

ルータLSAとネットワークLSAを繋ぐには

イーサネットでルータ間を接続していると、ネットワークLSAっていうのが出てきます。 地図を作るにはルータLSAとネットワークLSAを繋いでいくわけですが、これは次の手順で行います。

  1. ルータLSAを取り出します。
  2. Connection To: a Transit Networkになっているインタフェースを見つけたら、それはイーサに繋がっていて、他にもルータがいるセグメントだと考えます。
  3. そういうセグメントには指名ルータが必ず存在しますので、誰が指名ルータなのかを調べます。ルータLSAにちゃんと書いてあります。
  4. その指名ルータが作成したネットワークLSAを探します。Attached Routerにそのルータが入っているものを選びます。
  5. これでルータLSAとネットワークLSAが繋がりました。
  6. そのネットワークのアドレスは、ルータLSAに書かれたインタフェースアドレスと、ネットワークLSAに書かれたマスクを組み合わせることで判断します。

このようにしてルータLSA→ネットワークLSAを繋いでいくと、最終的に一つの地図ができるわけです。

つづく。

【OSPF】 1. リンクステートとトポロジマップ

1. リンクステートとトポロジマップ

OSPFではネットワークのマップを作成し、それをもとにしてルーティングテーブルを計算します。 マップができてしまえば、ルーティングテーブルを計算するのはダイクストラ演算で機械的にできてしまいます。 それでは、OSPFはどうやってマップを作るのか、調べてみようと思います。

マップを作る素材はLSA(Link State Advertisement)です。 LSAにはいくつか種類がありますが、マップを作るのに必要なのは二つだけです。 一つはルータLSA(Type 1 LSA)、もう一つはネットワークLSA(Type 2 LSA)です。

ルータLSAは、全てのルータが一つ、必ず作ります。(エリア境界ルータの場合は、エリアごとにルータLSAを作成します)。 ネットワークLSAは必要に応じて作られます。 イーサネットのようなブロードキャスト型のメディアを使ったときに、指名ルータというのがネットワークLSAを作成します。 専用線のようなPoint-to-Point型にはネットワークLSAは不要です。

具体的に見てみましょう。 ここでは3台のルータを接続してOSPFでルーティングしてみます。

設定は適当で( R1R2R6 )。

Ciscoのルータでshow ip ospf databaseというコマンドを使うと、 今どんなLSAを持っているかが分かります。

R6c7206#show ip ospf database

            OSPF Router with ID (192.168.254.6) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
192.168.254.1   192.168.254.1   2720        0x80000114 0x002DFA 3
192.168.254.2   192.168.254.2   2719        0x8000015C 0x00EDD7 2
192.168.254.6   192.168.254.6   147         0x8000004A 0x009895 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.0.6     192.168.254.6   147         0x80000049 0x00E655
192.168.1.2     192.168.254.2   2719        0x8000001C 0x003064
R6c7206#

Router Link StatesはここでいうルータLSAの事です。ルータLSAは全部で3つです。 全てのルータが一つずつ作るので3つですね。 誰がどれを作ったかはADV Router(Advertising Router)の欄を見れば分かります。

Net Link StatesはここでいうネットワークLSAの事です。 R6-R1間、R1-R2間がイーサネットなので合計2個です。 R6-R1間はR6が、R1-R2間はR2がネットワークLSAを作ってます(そのセグメント上の指名ルータが作ります)。

これでどうやって地図を作るの?

正直、この表示だけでは想像も付きませんね。LSAの中身も見ないとダメです。 Ciscoではshow ip ospf database routerコマンドでルータLSAの中身を、 show ip ospf database networkでネットワークLSAの中身を表示します。

中身はおいおい解説するとして、以下の表示例をページの最後にあるテキストボックスにコピー&ペーストして、SUBMITボタンを押してみてください。

-----ここからコピー開始------
R6c7206#show ip ospf database router

            OSPF Router with ID (192.168.254.6) (Process ID 100)

                Router Link States (Area 0)

  LS age: 335
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.1
  Advertising Router: 192.168.254.1
  LS Seq Number: 80000107
  Checksum: 0x47ED
  Length: 60
  Number of Links: 3

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.1.2
     (Link Data) Router Interface address: 192.168.1.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.0.6
     (Link Data) Router Interface address: 192.168.0.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 1

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.1
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0


  LS age: 334
  Options: (No TOS-capability, No DC)
  LS Type: Router Links
  Link State ID: 192.168.254.2
  Advertising Router: 192.168.254.2
  LS Seq Number: 8000014F
  Checksum: 0x8CA
  Length: 48
  Number of Links: 2

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.1.2
     (Link Data) Router Interface address: 192.168.1.2
      Number of TOS metrics: 0
       TOS 0 Metrics: 10

    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 192.168.254.2
     (Link Data) Network Mask: 255.255.255.255
      Number of TOS metrics: 0
       TOS 0 Metrics: 0


  LS age: 1034
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 192.168.254.6
  Advertising Router: 192.168.254.6
  LS Seq Number: 80000035
  Checksum: 0xC280
  Length: 36
  Number of Links: 1

    Link connected to: a Transit Network
     (Link ID) Designated Router address: 192.168.0.6
     (Link Data) Router Interface address: 192.168.0.6
      Number of TOS metrics: 0
       TOS 0 Metrics: 1


R6c7206#show ip ospf network
                       ^
% Invalid input detected at '^' marker.

R6c7206#show ip ospf da
R6c7206#show ip ospf database netwo
R6c7206#show ip ospf database network

            OSPF Router with ID (192.168.254.6) (Process ID 100)

                Net Link States (Area 0)

  Routing Bit Set on this LSA
  LS age: 1045
  Options: (No TOS-capability, DC)
  LS Type: Network Links
  Link State ID: 192.168.0.6 (address of Designated Router)
  Advertising Router: 192.168.254.6
  LS Seq Number: 80000034
  Checksum: 0x1140
  Length: 32
  Network Mask: /24
        Attached Router: 192.168.254.6
        Attached Router: 192.168.254.1

  Routing Bit Set on this LSA
  LS age: 346
  Options: (No TOS-capability, No DC)
  LS Type: Network Links
  Link State ID: 192.168.1.2 (address of Designated Router)
  Advertising Router: 192.168.254.2
  LS Seq Number: 8000000F
  Checksum: 0x4A57
  Length: 32
  Network Mask: /24
        Attached Router: 192.168.254.2
        Attached Router: 192.168.254.1

R6c7206#
---ここまでの内容を下記テキストボックスにコピー&ペースト---

何かでましたか?

他にもこんな表示例を置いておきますので、 (このページを一度リロードした後)お試しください。 フラッシュのソースはここ

つづく。

【OSPF】 4. 同時にリスタートできる?

4. 同時にリスタートできる?

RFC3623では、ヘルパーモードに入る条件として 「グレースフル・リスタートを実行中でないこと」としています(セクション3.1の条件5)。 F社のルータは複数同時にリスタートできる、と言ってたのですが、どうも気になってしまいます。 F社のルータは何かしら特殊な処理を入れてるのかもしれませんが・・・

とりあえずJuniperはどうなの?ってことで、試してみました。結論から言うと、グレースフル・リスタートは失敗します。

前回の構成で、R6→R2に向かってpingを打ちつつ、R1とR2をほぼ同時にリスタートさせてみます。 すると、やっぱりパケットロスする期間が長くなってしまいます。

R6c7206#ping
Protocol [ip]:
Target IP address: 192.168.254.2
Repeat count [5]: 10000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 10000000, 100-byte ICMP Echos to 192.168.254.2, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*Sep 30 22:46:22: OSPF: scheduling rtr lsa for area 0
*Sep 30 22:46:22: OSPF: scheduling NET lsa on FastEthernet0/1
*Sep 30 22:46:22: OSPF: scheduling rtr lsa for area 0
*Sep 30 22:46:22: OSPF: scheduling rtr lsa for area 0
*Sep 30 22:46:22: OSPF: scheduling rtr lsa for area 0
*Sep 30 22:46:22: OSPF: scheduling rtr lsa for area 0!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*Sep 30 22:46:27.332: %OSPF-5-ADJCHG: Process 100, Nbr 192.168.254.1 on FastEthernet0/1 from LOADING to FULL, Loading Done
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!......!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ☆☆☆通信停止
*Sep 30 22:46:27: OSPF: scheduling rtr lsa for area 0
*Sep 30 22:46:27: OSPF: scheduling NET lsa on FastEthernet0/1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (29987/29997), round-trip min/avg/max = 1/1/44 ms
R6c7206#

つづく

【OSPF】 3. grace-LSAパケット

3. grace-LSAパケット

それでは、実際に何が起こっているのか実験で突き止めてみましょう。

グレースフル・リスタートを実行するルータは、 再起動前にgrace-LSAをフラッドして周りのルータに協力を求めます。 R1(Juniper)が送信したこのLSAをCiscoで表示してみましょう。 grace-LSAはリンクローカルのオペークLSA(Type 7 Opaque-LSA)なので、 コマンドはshow ip ospf database opaque-linkです。 グレースフル・リスタートの期間中しか表示されませんので、 タイミング良くコマンドを投入しないといけません。

R6c7206#show ip ospf database opaque-link

            OSPF Router with ID (192.168.254.6) (Process ID 100)

                Type-9 Opaque Link Local Link States (Area 0)

  LS age: 8
  Options: (No TOS-capability, No DC)
  LS Type: Opaque Link-Local Link
  Link State ID: 3.0.0.0
  Opaque Type: 3
  Opaque ID: 0
  Advertising Router: 192.168.254.1
  LS Seq Number: 80000001
  Checksum: 0x711B
  Length: 44
  Associate Interface: FastEthernet0/1
  Unable to display opaque data

RFC3623によると、grace-LSAのフォーマットは次の通りです。 grace-LSAはOpaque Type=3, Opaque ID=0で固定です。

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |            LS age             |     Options   |       9       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       3       |                    0                          |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Advertising Router                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     LS sequence number                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         LS checksum           |             length            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +-                            TLVs                             -+
      |                             ...                               |

Ciscoの表示もだいたいこのフォーマット通りですね。 Opaque LSAなので、Link State IDは存在しません。 Link State IDが3.0.0.0となっていますが、Opaque Type=3, Opaque ID=0の事です。

次にR1-R2間にEtherealを仕込んでパケットをキャプチャしてみましょう。

Etherealのデータ

No.     Time        Source                Destination           Protocol Info
     10 3.529154    192.168.1.1           224.0.0.5             OSPF     LS Update

Frame 10 (106 bytes on wire, 106 bytes captured)
    Arrival Time: Oct  1, 2004 19:28:32.826318000
    Time delta from previous packet: 0.002328000 seconds
    Time since reference or first frame: 3.529154000 seconds
    Frame Number: 10
    Packet Length: 106 bytes
    Capture Length: 106 bytes
Ethernet II, Src: 00:90:69:92:34:00, Dst: 01:00:5e:00:00:05
    Destination: 01:00:5e:00:00:05 (01:00:5e:00:00:05)
    Source: 00:90:69:92:34:00 (JuniperN_92:34:00)
    Type: IP (0x0800)
Internet Protocol, Src Addr: 192.168.1.1 (192.168.1.1), Dst Addr: 224.0.0.5 (224.0.0.5)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0xc0 (DSCP 0x30: Class Selector 6; ECN: 0x00)
        1100 00.. = Differentiated Services Codepoint: Class Selector 6 (0x30)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 92
    Identification: 0x247f (9343)
    Flags: 0x00
        0... = Reserved bit: Not set
        .0.. = Don't fragment: Not set
        ..0. = More fragments: Not set
    Fragment offset: 0
    Time to live: 1
    Protocol: OSPF IGP (0x59)
    Header checksum: 0xf25b (correct)
    Source: 192.168.1.1 (192.168.1.1)
    Destination: 224.0.0.5 (224.0.0.5)
Open Shortest Path First
    OSPF Header
        OSPF Version: 2
        Message Type: LS Update (4)
        Packet Length: 72
        Source OSPF Router: 192.168.254.1 (192.168.254.1)
        Area ID: 0.0.0.0 (Backbone)
        Packet Checksum: 0xac99 (correct)
        Auth Type: Null
        Auth Data (none)
    LS Update Packet
        Number of LSAs: 1
        LS Type: Opaque LSA, Link-local scope
            LS Age: 1 seconds
            Options: 0x2 (E)
            Link-State Advertisement Type: Opaque LSA, Link-local scope (9)
            Link State ID Opaque Type: grace-LSA (3)
            Link State ID Opaque ID: 0
            Advertising Router: 192.168.254.1 (192.168.254.1)
            LS Sequence Number: 0x80000001
            LS Checksum: 8a01
            Length: 44
            Unknown LSA Type 3

0000  01 00 5e 00 00 05 00 90 69 92 34 00 08 00 45 c0   ..^.....i.4...E.
0010  00 5c 24 7f 00 00 01 59 f2 5b c0 a8 01 01 e0 00   .\$....Y.[......
0020  00 05 02 04 00 48 c0 a8 fe 01 00 00 00 00 ac 99   .....H..........
0030  00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01   ................
0040  02 09 03 00 00 00 c0 a8 fe 01 80 00 00 01 8a 01   ................
0050  00 2c 00 01 00 04 00 00 00 d2 00 02 00 01 02 00   .,..............
0060  00 00 00 03 00 04 c0 a8 01 01                     ..........

LS Updateパケットでフラッドしてます。 RFC3623のフォーマット通りなのですが、EtherealではOpaque LSAの中身までは解析できていません。 仕方ないので、手動で追ってみます。 データ部は次の部分です。

00 01 00 04 00 00 00 d2    00 02 00 01 02 00 00 00    00 03 00 04 c0 a8 01 01
----- ----- -----------    ----- ----- -----------    ----- ----- -----------
Type  Len   Value          Type  Len   Value(+pad)    Type  Len   Value
GracePeriod=0xd2=210秒     Reason=02=soft reload      IP interface address=192.168.1.1

仕様の通り、必要なTLVは全て揃ってます。グレース期間が210秒になっているのは、Juniperのデフォルトでしょうか。イーサネットなので、IP interface addressが必須になっています。

次にパケットの流れを追ってみましょう。

   Time        Source        Destination   Protocol Info
 3 0.429764    192.168.1.2   224.0.0.5     OSPF     Hello Packet
10 3.529154    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA
21 4.540671    192.168.1.2   224.0.0.5     OSPF     LS Acknowledge  ☆ LS ack遅すぎ
35 5.715653    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
36 5.716834    192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
50 6.725669    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
51 6.726758    192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
52 7.725888    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
53 7.726746    192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
54 8.725889    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
55 8.726998    192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
57 9.725977    192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
58 9.727042    192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
61 10.310466   192.168.1.2   224.0.0.5     OSPF     Hello Packet
62 10.726050   192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSA再送
63 10.726912   192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ DRの再送
64 11.736033   192.168.1.1   224.0.0.5     OSPF     Hello Packet    ☆ 再起動後のHello
73 19.211217   192.168.1.2   224.0.0.5     OSPF     Hello Packet    ☆ 再起動後のHello
74 19.213039   192.168.1.1   192.168.1.2   OSPF     DB Descr.
75 19.213207   192.168.1.1   224.0.0.5     OSPF     Hello Packet
76 19.214947   192.168.1.2   192.168.1.1   OSPF     DB Descr.
77 19.256350   192.168.1.1   192.168.1.2   OSPF     DB Descr.
78 19.257948   192.168.1.2   192.168.1.1   OSPF     DB Descr.
79 19.258150   192.168.1.2   192.168.1.1   OSPF     LS Request
80 19.306368   192.168.1.1   192.168.1.2   OSPF     DB Descr.
81 19.306559   192.168.1.1   192.168.1.2   OSPF     LS Request
82 19.306810   192.168.1.1   192.168.1.2   OSPF     LS Update       ☆ Router-LSA, Network-LSAの送信
83 19.308054   192.168.1.2   192.168.1.1   OSPF     LS Update       ☆ grace-LSAの送信
84 19.377657   192.168.1.1   224.0.0.5     OSPF     Hello Packet
85 20.321602   192.168.1.2   224.0.0.5     OSPF     LS Acknowledge
86 21.386654   192.168.1.1   224.0.0.5     OSPF     LS Update       ☆ grace-LSAを再生成
87 22.401730   192.168.1.2   224.0.0.5     OSPF     LS Acknowledge

グレースフル・リスタート中、grace-LSAが行ったり来たりしてます。 何しろリスタート中なので、これは仕方ないのかもしれません。 flagをerrorにセットして、Juniperでデバッグしてみると、次のようにエラーをクレームします。 納得です。

[edit protocols ospf traceoptions]
gsi@R1# Oct  1 16:18:17 trace_on: Tracing to "/var/log/ospf-debug" started
Oct  1 16:18:18 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:18 OSPF rcvd LSAck 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:18   Version 2, length 44, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:18   checksum 0x0, authtype 0
Oct  1 16:18:19 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:19 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:19   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:19   checksum 0x0, authtype 0
Oct  1 16:18:19   adv count 1
Oct  1 16:18:19 OSPF packet ignored: can't find neighbor for 192.168.0.6 (router-id 192.168.254.6)
Oct  1 16:18:19 OSPF rcvd LSUpdate 192.168.0.6 -> 192.168.0.1 (fe-0/0/3.0, IFL 0x45)
Oct  1 16:18:19   Version 2, length 72, ID 192.168.254.6, area 0.0.0.0
Oct  1 16:18:19   checksum 0x0, authtype 0
Oct  1 16:18:19   adv count 1
Oct  1 16:18:19 OSPF packet ignored: can't find neighbor for 192.168.0.6 (router-id 192.168.254.6)
Oct  1 16:18:19 OSPF rcvd LSAck 192.168.0.6 -> 224.0.0.5 (fe-0/0/3.0, IFL 0x45)
Oct  1 16:18:19   Version 2, length 44, ID 192.168.254.6, area 0.0.0.0
Oct  1 16:18:19   checksum 0x0, authtype 0
Oct  1 16:18:20 OSPF packet ignored: can't find neighbor for 192.168.0.6 (router-id 192.168.254.6)
Oct  1 16:18:20 OSPF rcvd LSUpdate 192.168.0.6 -> 192.168.0.1 (fe-0/0/3.0, IFL 0x45)
Oct  1 16:18:20   Version 2, length 72, ID 192.168.254.6, area 0.0.0.0
Oct  1 16:18:20   checksum 0x0, authtype 0
Oct  1 16:18:20   adv count 1
Oct  1 16:18:21 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:21 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:21   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:21   checksum 0x0, authtype 0
Oct  1 16:18:21   adv count 1
Oct  1 16:18:21 OSPF packet ignored: can't find neighbor for 192.168.0.6 (router-id 192.168.254.6)
Oct  1 16:18:21 OSPF rcvd LSUpdate 192.168.0.6 -> 192.168.0.1 (fe-0/0/3.0, IFL 0x45)
Oct  1 16:18:21   Version 2, length 72, ID 192.168.254.6, area 0.0.0.0
Oct  1 16:18:21   checksum 0x0, authtype 0
Oct  1 16:18:21   adv count 1
Oct  1 16:18:22 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:22 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:22   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:22   checksum 0x0, authtype 0
Oct  1 16:18:22   adv count 1
Oct  1 16:18:22 OSPF packet ignored: can't find neighbor for 192.168.0.6 (router-id 192.168.254.6)
Oct  1 16:18:22 OSPF rcvd LSUpdate 192.168.0.6 -> 192.168.0.1 (fe-0/0/3.0, IFL 0x45)
Oct  1 16:18:22   Version 2, length 72, ID 192.168.254.6, area 0.0.0.0
Oct  1 16:18:22   checksum 0x0, authtype 0
Oct  1 16:18:22   adv count 1
Oct  1 16:18:23 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:23 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:23   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:23   checksum 0x0, authtype 0
Oct  1 16:18:23   adv count 1
Oct  1 16:18:24 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:24 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:24   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:24   checksum 0x0, authtype 0
Oct  1 16:18:24   adv count 1
Oct  1 16:18:25 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:25 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:25   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:25   checksum 0x0, authtype 0
Oct  1 16:18:25   adv count 1
Oct  1 16:18:26 OSPF packet ignored: can't find neighbor for 192.168.1.2 (router-id 192.168.254.2)
Oct  1 16:18:26 OSPF rcvd LSUpdate 192.168.1.2 -> 224.0.0.5 (fe-0/0/0.0, IFL 0x43)
Oct  1 16:18:26   Version 2, length 72, ID 192.168.254.2, area 0.0.0.0
Oct  1 16:18:26   checksum 0x0, authtype 0
Oct  1 16:18:26   adv count 1
Oct  1 16:18:27 RPD_OSPF_NBRUP: OSPF neighbor 192.168.1.2 (fe-0/0/0.0) state changed from Init to 2Way due to Two way communication established
Oct  1 16:18:27 RPD_OSPF_NBRUP: OSPF neighbor 192.168.1.2 (fe-0/0/0.0) state changed from Loading to Full due to OSPF loading done
Oct  1 16:18:32 RPD_OSPF_NBRUP: OSPF neighbor 192.168.0.6 (fe-0/0/3.0) state changed from Init to ExStart due to Two way communication established
Oct  1 16:18:33 RPD_OSPF_NBRUP: OSPF neighbor 192.168.0.6 (fe-0/0/3.0) state changed from Loading to Full due to OSPF loading done

実はこの実験、ちょっと失敗してます。 本当ならR1は再起動しているので、リンクステートデータベースは空っぽになっているはずです。 にもかかわらず、DB Descrで既にLSAをたくさん所持してしまってます。

これはR6-R1の隣接が先に同期化してしまい、LSAをR6から学習してしまっているためです。 しかも、grace-LSAをパージするパケットが抜けてます。キャプチャの停止が早すぎたようです・・・

気に入らないので、またキャプチャしなおすかもしれません。

【OSPF】 2. 有効性の実証実験

2. 有効性の実証実験

最初に比較実験を行ってみたいと思います。 手元にはルーティングエンジンを二重化した機器がないので、OSPFプロセスを単独で再起動してみます。 このとき、グレースフル・リスタートのあるなしで、結果がどう違うのかを観察してみたいと思います。

次の図で、R1とR2はJuniper M10(JUNOS6.4)です。R6はCisco7204でIOS12.3(8)T3です。 R6からR2に向かってpingをうち続けます。 R1でrestart routingコマンドを投入してルーティングプロセスを再起動します。

普通にリスタートした場合

結果は次の通りです。

R6c7206#ping
Protocol [ip]:
Target IP address: 192.168.254.2
Repeat count [5]: 10000000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 10000000, 100-byte ICMP Echos to 192.168.254.2, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
途中省略
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!UUUUUUUUUUUU.............!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (4735/4760), round-trip min/avg/max = 1/1/40 ms
R6c7206#

UはICMP Unreachableですが、恐らく自分で生成しています。 結果的に30秒ほど通信できない時間が発生しています。 R6-R1間、およびR1-R2間のネイバー状態が初期化されてしまうため、 OSPFはネイバーの確立から開始することになります。 これに時間がかかるのでしょう。

グレースフル・リスタートを使った場合

では次に、Graceful Restartを有効にしてみます。 Ciscoは12.2(15)T以降ならヘルパーモードを実行でき、設定は特に必要ありません。 Juniperは次の設定が必要です。

routing-options {
    graceful-restart {
        restart-duration 300;
    }
    router-id 192.168.254.1;
}

先ほどと同じく、R1でrestart routingコマンドを叩くと・・・
R6→R2のpingがまったく落ちません。

R6c7206#ping
Protocol [ip]:
Target IP address: 192.168.254.2
Repeat count [5]: 100000
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 100000, 100-byte ICMP Echos to 192.168.254.2, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
途中省略
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (10481/10481), round-trip min/avg/max = 1/1/40 ms
R6c7206#

効果絶大ですね。

つづく。

【OSPF】 1. Graceful OSPF Restartとは

1. Graceful OSPF Restartとは

グレースフル・リスタートと呼ばれる一連のプロトコル拡張の一つです。 グレースフル・リスタートを使うと、パケットロスなしでソフトウェアの再起動ができるようになります。 もちろん動かすには条件があります。

  • 制御プレーンが再起動してもパケット中継を続けられるルータであること
  • 周りのルータが協力してくれること

最初の条件は、Cisco社でいうとGSRやCRS-1、JuniperではM10i以上の機種でないとクリアできません。 2番目の条件はソフトウェアを新しくすればクリアできるでしょう。 CiscoではNSF(Non-Stop Forwarding)と呼んでますので、NSFを実装したIOSに入れ替える必要があります。

グレースフル・リスタートはプロトコルごとに規定され、OSPF, LDP, BGP辺りは既にRFCが発行されてます。 ここではOSPFのグレースフル・リスタートを試してみたいと思います。

OSPFのグレースフル・リスタートはRFC3623で規定されてます。 軽く日本語にしてみましたので、前提知識として読むとよいでしょう。

RFC3623の日本語版

グレースフル・リスタートするルータの動作手順

  1. grace-LSAを広告する。相手がLS ACKするまで再送してもいいが、再起動が遅くなるので、どっちでもよい。
  2. 再起動する前に、消えない場所にグレース期間中であることをメモっておく。その他の情報は忘れてよい。
  3. 周りのルータがヘルパーになってくれるか分からないが、とにかく再起動してみる。
  4. かつてのネイバー達と完全に同期が取れたら成功。かつてのネイバー達というのは、ルータLSAとネットワークLSAを見れば分かる。
  5. LSAの内容に一貫性がない、あるいはグレース期間が満了してしまうと、グレースフル・リスタートは失敗。
  6. グレースフル・リスタートを抜けると、grace-LSAをフラッシュ。LSAを再生成。経路を再計算してインストール。

ヘルパーモードの動作手順

  1. grace-LSAを受信する。
  2. そのルータと同期してるかチェック。再送リストにLSAが残ってないかチェック。
  3. グレース期間が短すぎて既に満了してないかチェック。
  4. 自分自身がグレースフル・リスタート中でないかチェック。
  5. 問題なければ、そのルータが生きているかのように振る舞う。

ヘルパーモードは次の条件で中止されます。

  • grace-LSAがフラッシュされた(グレースフル・リスタート成功)
  • grace-LSAで指定されたグレース期間が満了した。
  • リンクステートデータベースの内容が変化し、トポロジが変わったことが明らかになった。

つづく

« 2004年9月 | トップページ | 2004年12月 »