HSRPの実機演習
CCNAの復習がてらHSRPの実機演習してみました。CCNAを学習中の方や実機を買っていろいろ試したい方向けに書いています。 HSRPはルータでもL3機器でも使えますが、文字数の関係で本文中はルータの機能として説明します。
HSRPとは
HSRPとは、ルータを冗長化するための技術です。これらの機器は1台でも機能しますが、耐障害性を考えると1台だと心もとありません。通常時は1台で運用し、故障時にもう1台の予備系統へ切り替えるというのが一般的です。この切り替わりを自動で、瞬時に切り替えるためにHSRPが使われます。Ciscoが特許を取得している技術の為、Cisco機器以外で冗長化する場合は標準化されているVRRPを使います。
HSRPでは複数のルータでグループを作り、一つの仮想的なルータを作ります。さらに、仮想のルータに仮想のIPアドレス(VIP)と仮想のMACアドレス(vMAC)を持たせます。こうすることで、端末側からはデフォルトゲートウェイを1つの仮想ルータに指定できます。
HSRPのグループ(以後スタンバイグループ)にはActiveとStandbyという役割があります。 ルータ2台でHSRPの有効にすると、必ずどちらかがActive、もう一方がStandbyになります。この役割の選出方法は以下の通りです。
①プライオリティの大きいルータがActiveになる
②HSRPを有効にしたポートのIPアドレスを比較し、大きいほうのルータがActiveになる
①のプライオリティが等しい場合のみ②で決めます。 一般的には①で決まるように、Activeにしたいルータのプライオリティを高く設定します。 Activeルータへパケットが届かないような事態が発生すると、StandbyルータがActiveルータとして切り替わります。
なお、HSRPは最大4台までVIPを共有できます。ActiveとStandby以外の機器はその他のルータという位置づけになります。Activeルータがダウンした場合、同じようにStandbyルータがActiveとなり、その他のルータから新たにStandbyルータが選出されます。ただし、コストパフォーマンスの観点から、3台以上で冗長を組むということはまずありません。
HelloタイマーとHoldタイマー
ActiveルータとStandbyルータは、定期的にHelloパケットを送りあっています。Helloパケットとは、お互いが問題なく機能しているか確認する死活監視用のパケットです。デフォルトでは3秒に1回送信します。送信先のアドレスは224.0.0.2というマルチキャストアドレスを使います。HSRPを有効化したルータはこのマルチキャストグループに参加します。
Holdタイマーは、受け取ったHelloパケットをルータが保持している時間です。デフォルトでは10秒間です。Holdタイムが切れるまでHelloパケットを受け取らなかった場合、StandbyルータはActiveに切り替わります。
検証構成
今回の検証では以下を使います。
検証構成図
注意 今回の検証の中心はHSRPの為、VLANの設定方法の説明は割愛しています。設定するためのConfigを最後に置いておくので、もし設定に詰まった場合はご活用ください。グローバルコンフィグレーションモードで丸ごとコピペして設定を流し込むことも可能です。
構築①HSRP以外の部分を設定してみよう
HSRPを設定する前に、まずは構成どおり組んでみましょう。PCのアドレス設定はまだしなくて大丈夫です。 注意点としてはルータのL2ポートを使用している点です。設定が簡単なL3ポート(IPアドレスを指定できる物理的なポート)はあえて使用していません。CCNAのL3スイッチのVLAN間ルーティングをしっかり理解していればできる内容になっています。ただし、ルータでのVLANの確認コマンド(スイッチのshow vlanにあたるコマンド)はshow vlan-switchなので間違えないようにしましょう。
構成が組めたら、通常の疎通ができるか確認してみてましょう。
疎通確認①
PC1のデフォルトゲートウェイを192.168.10.1、PC2のデフォルトゲートウェイを192.168.20.1にして PC1→PC,PC2→PC1のpingが飛ぶこと
疎通確認②
PC1のデフォルトゲートウェイを192.168.10.2、PC2のデフォルトゲートウェイを192.168.20.2にして PC1→PC,PC2→PC1のpingが飛ぶこと
構築②HSRPの基本設定を入れてみよう
第二段階では設定方法に触れつついくつかクイズを出します。さっそくやっていきましょう。
HSRPの有効化の設定
HSRPはL3インターフェースで有効にします。同じスタンバイグループに所属できるのは、同じネットワークに所属するインターフェースのみです。
今回の構成においては、どのインターフェースがHSRPの設定対象になるでしょうか。
- L3(物理)ポート
- L2ポート
- SVI
少し考えてみてください。
正解は③のSVIです。①に設定も可能ですが、今回の構成では物理のL3ポートは使用していません。②のL2ポートも違います。IPアドレスを持たないL2ポートではHSRPを有効化できません。今回HSRPを有効化するのは、L2ポートを通じて内部に存在するSVIになります。
では、ActiveルータにするRT1から設定していきます。 HSRPを有効化するコマンドは、有効にするインターフェースのインターフェースコンフィグレーションモードで以下のコマンドを使います。
(config-if)#standby [グループ番号] ip [仮想IPアドレス]
VLAN10側のインターフェースに設定するコマンドは下記のとおりです。
RT1(config)#interface vlan 10
RT1(config-if)#standby 10 ip 192.168.10.254
グループ番号はわかりやすくVLANの番号と揃えてますが、何でもよいです。ただし、同じグループに属するルータと揃えなければいけません。 IPアドレスは実際のIPアドレスではなく仮想IPアドレス(VIP)である点にも注意です。これはPC1に設定するデフォルトゲートウェイのアドレスになります。
Hello/Holdタイマーの設定
次にHelloタイマーとHoldタイマーを設定します。デフォルトではそれぞれ3秒、10秒です。HoldタイマーはHelloタイマーの3倍以上に設定しなければいけません。以下のコマンドを使います。
(config-if)#standby [グループ番号] timers [Helloタイマー(秒)] [Holdタイマー(秒)]
今回はHelloタイマーを1秒、Holdタイムを3秒にセットします。コマンドは下記のとおりです。
RT1(config-if)#standby 10 timers 1 3
プライオリティの設定
次にプライオリティを設定します。コマンドは以下を使います。
(config-if)#standby [グループ番号] priority [プライオリティ値]
プライオリティ値には0~255を指定できますが、省略した場合は100となります。 RT1をActiveルータにするので、デフォルトより大きく設定します。
RT1(config-if)#standby 10 priority 105
RT1の設定はいったん以上にします。
Standbyルータの設定
ルータ2の設定に入る前に、ここでクイズです。RT1では、
- HSRPの有効化(VIP指定)
- Hello/Holdタイマー
- プライオリティ
の3つを設定しましたが、今回の構成でStandbyルータに必須の設定はどれでしょうか。 予想してみましょう。
答えはHSRPの有効化のみです。ちなみにVIPも指定しなくて問題無いです。
RT2(config)# interface vlan 10
RT2(config-if)#standby 10 ip
HSRPではスタンバイグループでVIP、Hello/Holdタイマーが揃っている必要があります。しかし、Standbyルータではこれらを設定しなくて勝手に適用されます。
なぜかというと、自分よりプライオリティの高いルータからのHelloパケットを受け取った場合、そのルータの設定に従うからです。ここで言う設定とはActiveルータのVIPやHello/Holdタイマーであり、これらはHelloパケットに情報として含まれています。もちろんプライオリティも含まれます。ですが、プライオリティ値は手動で設定しない場合100に設定される仕様です。Activeルータより低ければ問題ないので、今回は必須ではありません。
さて、ここまで設定できたらRT1とRT2の設定内容を確認してみましょう。HSRPの設定確認は、#show standby コマンドでできます。 要約情報を表示するには#show standby briefです。
HSRPの動作の確認
設定ができたらHSRPが機能しているか確認してみましょう。PC1のデフォルトゲートウェイを192.168.10.254に設定し、コマンドプロンプトで下記のようにVIPにpingを送り続けます。
ping -t 192.168.10.254
今はActiveルータであるRT1にpingが飛んでいるので、RT1のgi1のケーブルを抜いてどうなるか見てみましょう。 一瞬Holdタイマーの時間だけ通信が止まりますが、すぐに通信の再開を確認出来たら成功です。
さて、このときルータの周りの機器では何が起きているのでしょうか。今までRT1に向けてpingを送っていたのに、すぐにRT2ヘ経路を変更したようです。 なぜこのような動作になるのか、これにはGARPと仮想MACアドレスが関係しています。
GARPと仮想MACアドレス(vMAC)
Gratuitous ARPはARPの一種で、自身のMACアドレスとIPアドレスの関連付けについてブロードキャストします。これはARP Replyのフォーマットで送られ、ネットワーク内のMACアドレステーブルを更新する役割があります。 GARPと言うと、PCでIPアドレスを設定した際に使われるARP ProbeとARP Announcementがあります。これらはIPアドレスの重複確認と周囲のARPテーブル更新の役割がありますが、広義のGARPとして区別されます。詳しくは別の記事で解説したいと思います。
HSRPにおいては、Activeルータの障害により新しくActiveになったルータがGARPを送出します。 このGARPで通知されるIPアドレスとMACアドレスが仮想IPアドレス(VIP)と仮想MACアドレス(vMAC)です。このパケットを受け取ったスイッチは、MACアドレステーブルのvMACの対応付けを変更します。 ※vMACは00-00-0C-07-AC-XXが使われます。(XXはHSRPグループの番号)
わかりにくいと思われがちなとこですが、HSRPを設定したルータと周辺の機器のアドレスまわりは理解しておくと良いです。
- 各ルータのインターフェースは実IPアドレスと実MACアドレスを必ず持つ
- Activeに選出されたルータはHelloパケットの送信元MACアドレスにvMACを使う(送信元IPアドレスは実IPアドレス)
- StandbyルータはHelloパケットの送信元MACアドレスに実MACアドレスを使う(送信元IPアドレスは実IPアドレス)
- Activeルータが変わった場合、新しいActiveルータがVIPとvMACを用いたGARPをブロードキャストする
上記から以下のような動作につながる
- 通常時、ActiveルータからvMACを使用したパケットが常にスイッチにも届くので、スイッチはActiveルータが接続されているポートをMACアドレステーブルで把握できる
- Activeルータ異常時、新たなActiveルータからGARPを受け取ったスイッチはMACアドレステーブルを更新し、Activeルータが接続されているポートを把握できる
- スイッチのMACアドレステーブルは、Standbyルータ側インターフェースに実MACアドレス、Activeルータ側インターフェースに実MACとvMACが登録される
経路の切り替わりの様子はスイッチのMACアドレステーブルだったり、ルータでの#debug standby terse コマンドだったりで確認できるので見てみると面白いです。パケットキャプチャをしてみるともっと面白いです。
構築③ プリエンプトを設定しよう
さて、このままでも通信はできますが、もとの状態に戻す必要があります。もう一台のルータに何か問題が起きたら、全く通信できなくなってしまうからです。加えて、復旧したルータは再びActiveになることが望ましいです。現在動いている予備のルータが、元のActiveルータと比べて性能が低かったりしたら不便ですよね。 ただ、この状態でケーブルを戻してもActiveルータはもとのRT1には戻りません。show standbyやスイッチのshow mac-address-tableで確認しても、元に戻っていないことがわかると思います。
そこで、プリエンプトという機能を使います。 プリエンプトは、「スタンバイグループのうち、プライオリティが高いほうのルータが常にActiveとなる」という機能です。 HSRPではプリエンプトはデフォルトでオフになっています。
では、有効に設定してみましょう。 設定するのはActiveとして使いたいほうのルータです。ただし、Standby側にも設定して問題はありません。以下のコマンドを使います。
(config-if)#standby [グループ番号] preempt
今回の場合は下記のとおりです
RT1(config-if)#standby 10 preempt
これで今後は常にRT1がActiveになります。show standby briefで確認してみましょう。 先ほどまではなかったPの文字がついていると思います。これはpreemptが有効であることを意味します。
構築④オブジェクトトラッキングを設定してみよう
さて、ここまでVLAN10のみで障害と復旧の確認をしていましたが、VLAN10とVLAN20が通信する場合のことを考えてみます。 今度はPC1からPC2へpingを送ってみます。通常時は問題なく疎通できますが、先ほど同様にRT1のgi1からケーブルを抜くとどうなるでしょうか。
結果、先ほどとは異なりルータの経路切り替えが発生せず、疎通不可となってしまいます。
障害発生時、VLAN10側のインターフェースではHSRPが機能してActiveルータの切り替わりが発生します。PC1からのpingはRT2に向かて飛ぶようになります。 しかし、VLAN20側のインターフェースは違います。VLAN20側の機器はRT1のgi1に異常が起きたことには気づけません。 VLAN20側のスタンバイグループはお互いにHelloパケットを送り合えている(死活監視できている)ので、特に異常はないと認識しているのです。
このような事態を避けるためには、トラッキングという機能を使います。トラッキングとは、通信状況やインターフェースの状態を監視し、異常があったら通知する機能です。 CCNAではインターフェーストラッキングというワードが出てきますが、インターフェースのみしか監視対象に指定できないため一般的にはオブジェクトトラッキングが使われます。 オブジェクトトラッキングではルーティング情報やICMP到達性などをオブジェクト=監視対象とし、異常時に通知します。インタフェーストラッキングと同じように使う場合、「インターフェースのリンクが確立しているか」を監視対象をとします。
オブジェクトトラッキングを使ったHSRPの障害時の動きは下記のとおりです。
- HSRPで監視してない(HSRPが有効ではない、もしくは別のスタンバイグループなど)別のネットワークのインターフェースの状態を監視
- 監視対象のインターフェースがダウンすると、HSRPのプライオリティを指定した数だけ下げる。
- Standbyルータはプライオリティが相対的に大きくなり、プリエンプト機能によってActiveルータに昇格する
オブジェクトトラッキングを有効にするのはActiveルータでHSRPを有効にしているインターフェースです。また、③の条件をクリアするためにはStandbyルータもプリエンプト機能を有効する必要があります。順番にコマンドを記述します。
まずは監視対象とするオブジェクトを作成します。下記のコマンドを使います。
(config)#track [オブジェクト番号] interface [インターフェース] line-protocol
VLAN10側はVLAN20側のインターフェースを監視します。逆も同様です。
RT1(config)#track 1 interface GigabitEthernet1 line-protocol
RT1(config)#track 2 interface GigabitEthernet2 line-protocol
続いて、作成したオブジェクトをHSRPのスタンバイグループに紐づけます。コマンドは下記になります。
(config)#interface [インタフェース]
(config-if)#standby [グループ番号] track [オブジェクト番号] decrement [プライオリティの減算値]
VLAN10側のスタンバイグループではgi1を監視対象とします。RT1のプライオリティは105なので、RT2の100より低くなるように減算値を設定すれば障害発生時にStandbyになります。今回は10で指定します。
RT1(config)#interface vlan 10
RT1(config-if)#standby 10 track 2 decrement 10
VLAN20側にも設定してみましょう。 設定が完了したら、疎通確認をします。
疎通確認①
疎通確認②
まとめ
実際にやってみると疑問が尽きなかったですが、いくつかは解消できてよかったと思います。今回はHSRPv1を題材に検証しましたが、IPv6に対応したHSRPv2やVRRPについても機会を見て触れてみたいと思います。軽く触れた程度ですが、オブジェクトトラッキングはいろいろできそうなので触ってみると面白そうです。参考になる記事を目指して頑張ります。
コンフィグ置き場(流し込み・確認用)
・L2SW1
interface FastEthernet0/1
switchport access vlan 10
no shutdown
!
interface FastEthernet0/2
switchport access vlan 10
no shutdown
!
interface FastEthernet0/5
switchport access vlan 10
no shutdown
!
end
・L2SW2
interface FastEthernet0/1
switchport access vlan 20
no shutdown
!
interface FastEthernet0/2
switchport access vlan 20
no shutdown
!
interface FastEthernet0/5
switchport access vlan 20
no shutdown
!
end
・RT1
vlan 10,20
!
track 1 interface GigabitEthernet1 line-protocol
!
track 2 interface GigabitEthernet2 line-protocol
!
interface GigabitEthernet1
switchport access vlan 10
no ip address
!
interface GigabitEthernet2
switchport access vlan 20
no ip address
!
interface Vlan10
ip address 192.168.10.1 255.255.255.0
standby 10 ip 192.168.10.254
standby 10 timers 1 3
standby 10 priority 105
standby 10 preempt
standby 10 track 2 decrement 10
!
interface Vlan20
ip address 192.168.20.1 255.255.255.0
standby 20 ip 192.168.20.254
standby 20 timers 1 3
standby 20 priority 105
standby 20 preempt
standby 20 track 1 decrement 10
!
end
・RT2
vlan 10,20
!
track 1 interface GigabitEthernet1 line-protocol
!
track 2 interface GigabitEthernet2 line-protocol
!
interface GigabitEthernet1
switchport access vlan 10
no ip address
!
interface GigabitEthernet2
switchport access vlan 20
no ip address
!
interface Vlan10
ip address 192.168.10.2 255.255.255.0
standby 10 ip 192.168.10.254
standby 10 preempt
!
interface Vlan20
ip address 192.168.20.2 255.255.255.0
standby 20 ip 192.168.20.254
standby 20 preempt
!
end
CatalystスイッチにIOSを入れなおしてみた
背景
以前CatalystスイッチからIOSを吸出してPCに保管する方法について記事を書きました。
K9非対応のスイッチに、K9対応のIOSファイルを適用することでSSH機能などを使えるようにしようという試みです。今回はPCにあるIOSファイルをTFTPでスイッチに転送して適用する方法についてまとめました。
※注意
使用するコマンドについてはIOSの種類(機器の型番、バージョン)によって違う可能性があります。私の環境ではCatalyst2960のバージョン12.2(25)で実施しています。
各機器のコマンドの詳細についてはCisco公式コマンドリファレンスを参照してください。
検証構成
検証に使用するものと構成は以下になります。
・PC×1
・スイッチ×1
・LANケーブル×1
・コンソールケーブル×1
・TFTPD64(無料のファイル転送ソフト、前回記事参照)
準備
IOSを転送する前の準備をします。
・PC、スイッチ(VLAN1)にIPアドレスを設定
・PCからスイッチにpingが飛ぶことを確認
・TFTPD64を立ち上げる
TFTPD64ではTFTPサーバのタブを選択し、Curent DirectoryにIOS1ファイルがあるフォルダのパスを、Server interfacesにはPCのIPアドレスを設定します。あとはこの画面を開いているだけで大丈夫です。
作業前のスイッチの状態も見ておきます。
show versionで現在の読み込んでいるIOSファイルの情報が確認できます。
L2SW2#sh version
(省略)
System image file is "flash:c2960-lanbase-mz.122-25.SEE2.bin" (省略)
Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 26 WS-C2960-24TC-L 12.2(25)SEE2 C2960-LANBASE-M
現在はC2960-LANBASE-MというIOSイメージが適用されています。また、IOSのイメージファイル名はc2960-lanbase-mz.122-25.SEE2.binで、flash:に格納されています。
IOSファイルをスイッチに転送する
IOSファイルを転送するにはTFTPクライアント側であるスイッチでcopy tftp: flash:コマンドで実行できます。コマンド入力後TFTPサーバのIPアドレスとIOSファイルのファイル名について聞かれるので入力しましょう。宛先ファイル名は特に設定する必要がなければ空エンターでOKです。
転送が完了するとOKと出てきます。転送前のファイルサイズと差異がないか確認して一致していれば成功です。
show flash:で確認すると現在使用中のIOSファイルと今転送したIOSファイルの2つが表示されるはずです。
L2SW2#sh flash:
Directory of flash:/
2 -rwx 4670535 Mar 1 1993 00:07:41 +00:00 c2960-lanbase-mz.122-25.SEE2.bin
3 -rwx 5 Mar 1 1993 00:02:39 +00:00 private-config.text
4 -rwx 616 Mar 1 1993 00:17:07 +00:00 vlan.dat
5 -rwx 1434 Mar 1 1993 00:02:39 +00:00 config.text
6 -rwx 3096 Mar 1 1993 00:02:39 +00:00 multiple-fs
7 -rwx 8612781 Mar 1 1993 00:20:46 +00:00 c2960-lanbasek9-mz.122-53.SE2.bin
32514048 bytes total (19222528 bytes free)
起動するIOSファイルを選択する
Cisco IOSでは、BOOT環境変数に設定されているファイルパスのIOSを読み込んで起動する仕組みとなっています。環境変数の設定がない場合は一番最初に見つかったIOSファイルを読み込みます。現在のBOOT環境変数を確認するにはshow bootコマンドを入力します。
L2SW2#show boot
BOOT path-list : flash:c2960-lanbase-mz.122-25.SEE2.bin
Config file : flash:/config.text
Private Config file : flash:/private-config.text
Enable Break : no
Manual Boot : no
HELPER path-list :
Auto upgrade : yes
NVRAM/Config file
buffer size: 65536
BOOT path-listというのが現在読み込む設定となっているIOSファイルの環境変数です。listとあるとおり、これは複数選択可能です。この設定を変更しないと今回転送したIOSファイルは読み込まれません。
BOOT環境変数を設定するには、グローバルコンフィギュレーションモードでboot systemコマンドを入力します。構文は以下です。
(config)#boot system flash:<IOSファイル1>;flash:<IOSファイル2>;........
IOSファイルはセミコロン区切りで複数選択可能です。例えば、今回新しく入手したIOSファイルを優先して読み込み、IOSファイルが破損して読み込めなくなった場合などに読み込むバックアップ用のIOSとして旧IOSファイルを指定する場合は下記のようにします。
L2SW2(config)#boot system flash:c2960-lanbasek9-mz.122-53.SE2.bin;flash:c2960-lanbase-mz.122-25.SEE2.bin
show bootで確認してみましょう。
L2SW2#show boot
BOOT path-list : flash:c2960-lanbasek9-mz.122-53.SE2.bin;flash:c2960-lanbase-mz.122-25.SEE2.bin
Config file : flash:/config.text
Private Config file : flash:/private-config.text
Enable Break : no
Manual Boot : no
HELPER path-list :
Auto upgrade : yes
NVRAM/Config file
buffer size: 65536
設定が反映されていることがわかります。今回は特にバックアップ用として使う目的はないので、読み込むファイルは1つだけに設定しようと思います。
L2SW2(config)#boot system flash:c2960-lanbasek9-mz.122-53.SE2.bin
これで再起動したら新しいIOSファイルから読みむはずです。
reloadで再起動します。
再起動したらshow versionで現在読み込んでいるIOSイメージを確認してみましょう。
Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 26 WS-C2960-24TC-L 12.2(53)SE2 C2960-LANBASEK9-M
IOSイメージがK9対応の新しいファイルに代わっていますのでうまくいったみたいです。
IOSファイルの削除
古いIOSファイルは不要なので削除します。念のため先にTFTPで外部PCに保管しておくといいかもしれません。
削除するにはdelete flash:<IOSファイル名>を入力します。
L2SW2#delete flash:c2960-lanbase-mz.122-25.SEE2.bin
Delete filename [c2960-lanbase-mz.122-25.SEE2.bin]?
Delete flash:c2960-lanbase-mz.122-25.SEE2.bin? [confirm]
show flash:でなくなっていればOKです。
気になったこととまとめ
今回IOSイメージを変えたことによって使えなかったSSHが使えるようになりました。逆に、IOSによってはサポートされていないコマンドや設定があるので、startup-configからもとの設定を読み込もうとすると一部の設定が読み込めない事象なども確認できました。
検証のため何度もIOSファイルを削除したり起動設定を変えてるうちに、設定したSSH関連の設定がすべて消えてしまっていたのでこのあたりは注意が必要です(主にconfigバックアップ)。
「IOSによってコマンドが違う」というのを身をもって体験したいのであれば、複数のIOSイメージを1つのスイッチに入れて検証してみるのも面白いかもしれません。
この記事が役に立ったらうれしいです。
わかったようでわかってなかったVLANのアレコレ【CCNA/VLANの基礎】
疑問に思ったこと
VLAN設定し、ネットワークを分けるメリットとはなんでしょうか。CCNAのテキストではこのように説明されています。
・ルータを使用せずにブロードキャストドメインを小さく(分割)できる
・物理的なスイッチの配置に依存せずにネットワークを構成できる
・VLANを分けた端末どうしでは同じスイッチを介して通信できないためセキュリティ対策になる
確かにメリットがいくつかあるように思えます。では、VLANを分けると異なるVLANに属する端末どうしは通信が全くできないのでしょうか。 そんなことはなく、ルータやL3スイッチを介することで異なるVLAN同士でも通信は可能です。特に難しい設定も必要ありません。
そこで、こんな疑問を持つことがあるかもしれません。
「VLANをわざわざ分けたのに、ルータとかL3スイッチで通信できるようにしたら意味ないんじゃないか?」
私はCCNAを取得したとき、そんなことを深く考えていませんでした。 しかし、最近自宅で実機を用いた検証を始めて上記のような疑問が膨れ上がり、頭を悩ませました。
X(旧Twitter)ではこのことに関する私のつぶやきが予想に反する反響があり、たくさんの方からVLANの基礎や実情について教えていただきました。本当に感謝の極みです。 この記事を見かけた同じネットワーク初学者が、この疑問を解消してVLANにちょっとだけ詳しくなれるようにまとめてみました。
VLANとは、をもう一度考えてみる
メリットはわかったけど、そもそもVLANとはなんなのか。勉強すればするほど奥が深くて的確に説明するのは難しいです。 いろいろな説明があると思うのですが、簡潔で直感的に理解できるよう自分なりに説明するのであれば、
VLANとは、スイッチの内部に新しく仮想的なスイッチを作って、それぞれのポートに接続するネットワークをグループ分けする技術
です。もちろん機能的にはもっとたくさんのことが言えるでしょう。このままでは詳しい方からツッコミが来てもおかしくありません。 しかし、CCNAレベルの初学者にとってはまずはこれを大前提として学習を進めると、よりVLANの理解がしやすくなるのではと思います。
SW内部を仮想的に表現してみる
アクセスポートの場合
VLANをつくると内部ではどんなことが起きているのか。 よくわからなくなったらとりあえず図のように仮想的な内部の状態を描いてみることをお勧めします。
初期状態ではスイッチの内部にVLAN1というスイッチが入っています。 また、スイッチの物理ポートはすべてVLAN1に所属しています。
VLANのとても大事な考え方ですが、スイッチは同じVLANに所属するポートにしかフレームを転送しません。
VLAN1に届いたパケットはVLAN1が所属しているポートにしか転送しません。考え方によっては、初期状態でどのポート間も通信できるのはどのポートもVLAN1に所属しているからとも言えます。
スイッチでVLAN10を作成するとVLAN10という名前のスイッチが新たに追加されます。これだけではまだ中のVLAN10のスイッチは動作しません。VLAN10に所属するポートを設定しなければなりません。
Fa0/4とFa0/5にVLAN10を割り当ててみます。このとき設定するのはアクセスポートとします。
すると、VLAN1に所属していたFa4/とFa0/5がVLAN10専用のポートになります。VLAN1とはもうさようならです。このポートに届いたフレームはVLAN10にしか転送しない状態へ生まれ変わりました。この時スイッチ内部でVLAN10のスイッチが物理ポートと結線したようなイメージになります。
同じようにVLAN20を作成します。VLAN20のスイッチが新しくできたので先ほどと同じように、今度はfa0/1とfa0/2にVLAN20のアクセスポートを設定します。内部のVLAN20スイッチは物理ポートと結線し、fa0/1とfa0/2に届くフレームは同じグループ(VLAN)に所属するポート同士にしか転送しません。
トランクポートの場合
では、別のスイッチの同じVLANに所属する仲間へ通信したいとします。 VLAN10とVLAN20が作成済みの別のスイッチと、2つのアクセスポートを用意すれば通信できそうです。
しかし、これだとVLANの数だけケーブルを用意しないといけませんし、ポートも複数必要です。VLANをさらに増やしたいときにポートが足りなくなりそうです。 そんな問題を解決するために存在するのがトランクポートです。
トランクポートは複数のVLANフレームを送り出せる共用の玄関であり、トランクポート同士で結んだリンクはトランクリンクと言う共用の渡り廊下になります。 そのためケーブルもポートも1つで済み、とても管理しやすくなります。
トランクポートを流れる通信にはタグ付けという重要な機能があります。 もしも、トランクポートは複数のVLANの転送を許可する、本当にただそれだけの機能しかない場合、困ったことになります。フレームがトランクポートに流れ着いた後、どのポートに案内してあげればいいか、スイッチはわからなくなってしまうからです。
例えば、PC5からPC6へ通信したいけど相手のMACアドレスがわからない、そんなときにARPを使ってIPアドレスからMACアドレスを取得しようと試みますよね。 PC5からブロードキャストで送信されたフレームはスイッチ1のVLAN10のアクセスポートに到着します。スイッチはVLANによってブロードキャストドメインを分けているため、同じVLAN10に所属するポートにだけフレームを転送します。 トランクポートはVLAN10にも所属しているため対向のスイッチ2へフレーム転送します。 さて、ここでスイッチ2が受け取ったフレームはどうすればいいでしょうか。
思い出してほしいのですが、スイッチは同じVLANに所属するポートにしかフレームを転送しません。届いたフレームフォーマットの中にはどのVLANに所属しているかを識別するフィールドが一切ありません。もちろんMACアドレスもこの時点でわからないわけですから、スイッチ2はどこにフレームを転送すればいいかわからないわけです。 「え、じゃあとりあえず全部のポートに送ればいいんじゃない?」と思うかもしれませんが、VLANにはブロードキャストドメインを分割する、同じVLANに所属するポートにしかフレームを転送しないという大原則があります。もしスイッチ2側ですべてのポートにフラッディングできてしまったらルールがその時点で破綻してしまいますので、そんなことはできません。
こんなふうに詰まないためにあるのがタグ付けという概念です。タグ付けはトランクポートでしか使わない概念ですが、その重要性がわかったと思います。 タグ付けの方法はいくつかありますが、標準化されてるIEEE802.1Qで行うことがほとんどです。トランクポートを設定する場合はIEEE802.1Qを使うということを明示的に設定し、対向のスイッチと共に合わせる必要があります。
VLAN間ルーティングについて知る
違うVLANどうしでは通信できない・・・というのはL2スイッチで結ばれたセグメント同士の中だけの話です。ルータやL3スイッチなどのルーティングができるL3デバイスをつなげれば通信可能です。
「だから、なんでわざわざ分けたのに通信できるようにするの?」という疑問はまだ置いておいて、まずはL3デバイスの動作についても理解しましょう。
ルータとL3スイッチの違い
まず、ルータとL3スイッチの違いから解説します。 CCNAの学習をしているとき、正直言ってこの違いは分かっていませんでした。 「L2スイッチにL3の機能を持たせてルーティングも可能なのがL3スイッチです」くらいの情報しか教わってないので違いなんてわかるはずもありません(ちゃんと調べてる方はたくさんいるはずなので私の怠慢ですが)。
同じL3デバイスでもルータとL3スイッチは機能もハードウェア的な特徴も異なります。
L3スイッチは一般的にLAN内部のL2スイッチの集約、ルーティングに使われます。そのために高速な転送処理を実現するハードウェア設計になっており、価格も高価です。 ルータはLANとWANの境界に設置されることがが多く、そのために必要なNATやVPNの機能が搭載されています。ルータのCPU処理でしか実現できないこともあります。どちらが上位とかはなく、適材適所なのです。
VLAN間ルーティング、ルータでやる?L3スイッチでやる?
CCNAのテキストでは何の説明もなく上記2通りの方法でVLAN間ルーティングの実現方法を記載しています。 「どっちでもできるから紹介しているだけでしょ?」と言ってしまえばそうだと思いますが、実際は実務においてVLAN間ルーティングにL3スイッチを使うことがほとんどのようです。その理由を説明します。
L3スイッチはネットワークのどの場所に置くかで役割が異なります。CCNAでも出てくるCiscoが掲げる3階層モデルなどがその例です。
例えばユーザPCを接続しているL2スイッチなどと近い層では、多くのL2スイッチを束ねるL3デバイスが必要になります。ここでL3デバイスとしてルータとL3スイッチを思い浮かべるかもしれませんが、ここでルータを使うことはほとんどありません。理由は先ほどの表からもわかる通り、「L2スイッチを多く束ねられる多数のL3インターフェース」「LAN内でのデータの高速データ転送機能」の点でL3スイッチのほうが優れているからです。
L3スイッチでのVLAN間ルーティングでは下記のように実現しています。
L2スイッチとL3スイッチの間は複数のVLANが通るのでトランクリンクです。 L3スイッチ内部に作成したVLANの数だけスイッチが存在し、そこに内部の仮想的なルータが接続されているイメージです。VLANを作成して物理ポートにVLANを適用してアクセスポートかトランクポートに設定するまではL2スイッチと同様の流れです。内部のルータでルーティングを行うので、ルータのポートにPCのデフォルトゲートウェイとなるようなIPアドレスが必要そうです。
SVIを指定してIPアドレスを設定するコマンドの例です。
(config)#interface vlan 10
(config-if)#ip address 192.168.0.254 255.255.255.0
(config-if)#no shutdown
コマンドがinterface vlan 10なのでvlanにipアドレスを付与すると表現したくなるかもしれませんが、それは間違いです。あくまでVLAN 10に所属する仮想的なL3インターフェース(SVI)にipアドレスを指定しているのです。このあたりコマンドがややこしくて覚えるのに苦労しました。
VLANごとにSVIを作成してIPアドレスを付与したならば、あとは通常のルータのルーティングと変わりません。
疑問の答え合わせ
さて、VLANの基本的な動きを見たところで冒頭の疑問に戻ります。
「VLANをわざわざ分けたのに、ルータとかL3スイッチで通信できるようにしたら意味ないんじゃないか?」
この疑問を解くミソはなぜVLANを使うのか、というところです。
ネットワークを設計する上でまず最初に考慮することは何を実現したいか、でしょう。 何事も目的があって設計が始まり、構築され、パケットが流れるわけです。 「VLANをわざわざ分けたのに通信できたら意味ないのでは」という疑問自体がそれと全く逆の思考になってしまっています。 そもそも、VLANを分けたあとに異なるVLAN同士で通信できるようにしなければいけない決まりもありません。
ネットワークの全体を見渡す
L2スイッチでVLANを分けた後、そこでネットワークが完結することはありません。VLANという概念はそのさらに上でも役立っています。CCNA範囲だとQoSやプライベートVLANもそれナシで実現できない、VLANを使用することを前提とした機能です。
L3スイッチなどの上位にはファイアウォールなどの上位の機器も置くことを考慮しなければなりません。L3スイッチではACLを使って宛先IPアドレスなどで通信の許可・拒否をすることができますが、ファイアウォールではもっと柔軟に、細かく設定を施すことができます。 その際に使うのがVLANです。事前にVLANで細かくセグメントを分割して、VLANごとにポリシーを設定をすることで管理者は視覚的に管理しやすく、ネットワーク上のパケットを識別しやすくなるメリットがあります。VLANが管理上の識別子としても役に立っています。
このようにVLANを使用することはネットワークを分割する以外にも多数の用途、メリットがあるため、VLANで分けたからといて通信ができてしまうことはなんら不思議なことではないのです。繰り返しになりますが、目的から考えることが大事で、結果だけ見ていてはなぜそのようになったのかわからないままです。
このあたりはCCNAでは教えてくれませんでしたが、最も基本的な考え方になると思います。 CCNAの勉強中の方やネットワークの仕事をしたい方は、ぜひこの辺りを実機を使って学習してみることをお勧めします。私も基本を理解するために継続的にブログにて検証結果などをアウトプットできるように頑張りたいと思います。
TFTPを使ってCiscoスイッチのIOSをWindowsにバックアップしてみた
目次
IOSを取得する背景
IOSのバックアップは障害発生時に使用する可能性があるので取っておく、という方も多いと思います。今回私が取得した背景は少し違います。中古で2つ買ったCatalyst2960のIOSイメージが異なっていて、片方はK9(暗号化機能)に対応しているけどもう一方はしてなかったというところが発端です。どちらもSSH接続してみたいので設定にIOSが暗号化に対応してることは必須なわけです。
暗号化対応のIOSを片方から吸い出してもう片方に入れれば両方ともSSHの設定ができるのでは?と思い立ったわけです。
今回はIOSのバックアップだけに焦点を当てて記事を書きますが、上記の作業もやってみて今後記事にしたいと思っています。
使用する構成
今回はPCとスイッチを繋げただけの簡素な構成で作業してみます。アドレスは下記のとおりです。
tftpサーバにTftpd64を使ってみる
windows PCを簡易ファイル転送プロトコル(tftp)のサーバにするために専用のソフトウェアを使います。フリーで使えるTFTPサーバ用ソフトウェアはいろいろありますが、今回はTftpd64を使ってみたいと思います。
①tftpd64で検索します
②下記ページの「Download page」をクリックします
③ダウンロードページで「Tftpd64-4.64-setup.exe」をクリックしてダウンロードします
④exeファイルを実行してインストールします
⑤デスクトップにアイコンが作成されるので開きます。TFTPサーバ以外にも用途がありますが、今回は初期画面の「Tftp Server」を使います。
※ファイアウォールでブロックされる場合はアプリの使用を許可しましょう。
「Current Directory」にファイルの転送先のパスを指定します。今回はデスクトップに指定しています。その下の「Server Interfaces」はスイッチと接続するPCのIPアドレスを指定します。
⑥PC側でもIPアドレスを設定します。ネットワークアダプタの設定画面へはWindowsキー+Rキーを押して「ncpa.cpl」と打つとショートカットできます。構成図のとおり、イーサネットに192.168.1.254/24を設定します。今回は同一ネットワークなのでデフォルトゲートウェイは空欄でOKです。
IOSをバックアップする①
最初にK9に対応してなかった方のL2SWのIOSを取得してみます。
Tera Termで実機にコンソールログインしてshow versionコマンドを打ちます。
L2SW2#show version
Cisco IOS Software, C2960 Software (C2960-LANBASE-M), Version 12.2(25)SEE2, RELEASE SOFTWARE (fc1)(中略)
System image file is "flash:/c2960-lanbase-mz.122-25.SEE2.bin"
(中略)
Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 26 WS-C2960-24TC-L 12.2(25)SEE2 C2960-LANBASE-M
Configuration register is 0xF
イメージの名前がC2960-LANBASE-MであることやIOSのバージョンが分かります。
次にshow flash:でフラッシュメモリの中を見てみます。
L2SW2#show flash:
Directory of flash:/
2 -rwx 4670535 Mar 1 1993 00:07:41 +00:00 c2960-lanbase-mz.122-25.SEE2.bin
3 -rwx 5 Mar 1 1993 00:02:12 +00:00 private-config.text
5 -rwx 1364 Mar 1 1993 00:02:12 +00:00 config.text32514048 bytes total (27840000 bytes free)
こちらでもIOSのbinファイル(c2960-lanbase-mz.122-25.SEE2.bin)があるのが分かります。今回取得したいのはこのファイルです。
取得する前にスイッチのIPアドレスを設定します。
スイッチは物理ポートにIPアドレスを設定できないため仮想インターフェースのVLAN1にIPアドレスを設定しています。
L2SW2#conf t
L2SW2(config)#int vlan 1
L2SW2(config-if)#ip add 192.168.1.22 255.255.255.0
L2SW2(config-if)#no shutdown
設定したらshow ip interface briefでIPアドレスを確認しましょう。
L2SW2#show ip interface brief
Interface IP-Address OK? Method Status Protocol
Vlan1 192.168.1.22 YES manual up up
FastEthernet0/1 unassigned YES unset up up
FastEthernet0/2 unassigned YES unset down down
FastEthernet0/3 unassigned YES unset down down
FastEthernet0/4 unassigned YES unset down down
FastEthernet0/5 unassigned YES unset down down(省略)
VLAN1はデフォルトですべての物理インターフェースに紐づいているので、例えばPCと接続しているFastEthernet0/1がup/upになればVLAN1もup/upになります。
スイッチ側からping 192.168.1.254と打ってPC側へ疎通できれば準備完了です。
スイッチからPCへファイルを転送するにはcopy <ファイル名> tftp:コマンドを使います。ファイル名は先ほどshowバージョンで確認した通りです。
入力するとtftpサーバのIPアドレスを聞かれるので構成のとおり192.168.1.254とします。その後転送先でのファイル名を何にするか聞かれますが、転送前と変更しなくてもよければそのままEnterを押して問題ないです。
L2SW2#copy flash:/c2960-lanbase-mz.122-25.SEE2.bin tftp:
Address or name of remote host ? 192.168.1.254
Destination filename [c2960-lanbase-mz.122-25.SEE2.bin]?
.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4670535 bytes copied in 17.330 secs (269506 bytes/sec)
無事にデスクトップへ転送されました。転送できない場合は、送信するファイル名の指定が間違っている、Windows側でTftpd64のIPアドレスの指定が間違っている、Tftpd64を開いていない、VLAN1がシャットダウンされていて疎通できていない、などの原因が考えられます。
IOSをバックアップする②
やることは同じですがK9に対応している側のL2SWでもやってみます。こちらはもう少し踏み込んで解説します。
L2SW1#show version
Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 12.2(53)SE2, RELEASE SOFTWARE (fc3)
(中略)
System image file is "flash:/c2960-lanbasek9-mz.122-53.SE2/c2960-lanbasek9-mz.122-53.SE2.bin"(中略)Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 26 WS-C2960-24TT-L 12.2(53)SE2 C2960-LANBASEK9-M
Configuration register is 0xF
先ほどのスイッチはWS-C2960-24TC-LでこちらはWS-C2960-24TT-Lなので若干型番が違います。イメージもK9とついているため暗号化に対応しています。
Cisco IOSについてもう少し知るために先ほどとは違ったアプローチでファイルを転送してみます。
pwdコマンドで現在ファイルシステム上のどこにいるのか確認できます。デフォルトはflash:です。
L2SW1#pwd
flash:
L2SW1#dir
Directory of flash:/2 -rwx 1915 Mar 1 1993 00:00:56 +00:00 private-config.text
3 drwx 192 Mar 1 1993 00:07:14 +00:00 c2960-lanbasek9-mz.122-53.SE2
6 -rwx 3096 Mar 1 1993 00:00:56 +00:00 multiple-fs
7 -rwx 1859 Mar 1 1993 00:00:56 +00:00 config.text
8 -rwx 676 Mar 1 1993 00:23:12 +00:00 vlan.dat32514048 bytes total (20222976 bytes free)
上記のようにdirコマンドを打つと現在作業中のディレクトリ(カレントディレクトリ)の中身がリスト状に表示されます。デフォルトではshow flash:と表示結果は同じになります。
c2960-lanbasek9-mz.122-53.SE2というのがIOSのファイルかと勘違いしそうですが、左のファイル形式がdがついているのでこれはIOSを格納しているディレクトリになります。このディレクトリをファイル名として転送しようとしてもディレクトリなので転送できませんとエラーが出ます。
ではディレクトリの中に移動してみます。ディレクトリを移動するにはcd <ディレクトリ名>コマンドを使います。
L2SW1#cd c2960-lanbasek9-mz.122-53.SE2
L2SW1#pwd
flash:/c2960-lanbasek9-mz.122-53.SE2/
L2SW1#dir
Directory of flash:/c2960-lanbasek9-mz.122-53.SE2/4 drwx 4800 Mar 1 1993 00:04:17 +00:00 html
1109 -rwx 8612781 Mar 1 1993 00:07:14 +00:00 c2960-lanbasek9-mz.122-53.SE2.bin
1110 -rwx 536 Mar 1 1993 00:07:14 +00:00 info32514048 bytes total (20222976 bytes free)
するとbinファイルが表示されました。こちらが取得対象のファイルになります。
転送するときのコマンドを実行してみしょう。今回はcopy flash: tftp:コマンドを使ってみます。送信元ファイル名をこのようにflash:とした場合、flash:の中のどのファイルを送るのか、Source Filenameで指定します。現在はflash:/c2960-lanbasek9-mz.122-53.SE2/にいるので、binファイル名をそのまま指定できますが、例えばデフォルトのflash:にいる場合はファイルの絶対パス(この場合flash:/c2960-lanbasek9-mz.122-53.SE2/c2960-lanbasek9-mz.122-53.SE2.bin)を指定する必要があります。
L2SW1#copy flash: tftp:
Source filename [/c2960-lanbasek9-mz.122-53.SE2/c2960-lanbasek9-mz.122-53.SE2.bin]? flash:/c2960-lanbasek9-mz.122-53.SE2/c2960-lanbasek9-mz.122-53.SE2.bin
Address or name of remote host ? 192.168.1.254
Destination filename [c2960-lanbasek9-mz.122-53.SE2.bin]?
.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
8612781 bytes copied in 37.061 secs (232395 bytes/sec)
まとめ
②に関して長々と書きましたがこんな非効率なことをする必要はなく、①で解説した通りcopy <ファイル名> tftp:コマンドにshow versionで出てくるIOSのbinファイルの絶対パスを指定してcopy flash:/c2960-lanbasek9-mz.122-53.SE2/c2960-lanbasek9-mz.122-53.SE2.bin tftp: とした方が簡単で確実です。ファイルシステムの理解に少しでも役に立てばと思い2パターンで書いてみました。ぜひどちらの方法でも試してみることをお勧めします。