STUDY · NETWORK GUIDE

2-8 L2 セキュリティ機能

L2 の代表的なセキュリティ機能 Port-Security / DHCP Snooping / DAI / Storm Control の役割と、Port-Security の sticky / 静的 MAC 学習、violation shutdown による err-disabled 遷移と手動・自動復旧を iosvl2 で実機確認する。第 2 章 L2 編の完走。

1. L2 セキュリティの位置づけ

第 2 章ではここまで、2-2 で CAM (Content Addressable Memory) テーブルによるスイッチング、2-3 で VLAN (Virtual LAN) による論理分割、2-4 で Trunk による複数 VLAN の収容、2-6 で STP (Spanning Tree Protocol) によるループ回避、2-7 で EtherChannel による帯域集約と、LAN 内部を支える機能群を順に扱ってきました。いずれも「正しい設定が両端に入り、接続される端末も善意のものである」という運用上の前提に立つ仕組みです。

現実の LAN では、設定誤りで意図しない機器が紛れ込むこと、社員の私物機器が無断接続されること、悪意ある端末が ARP (Address Resolution Protocol) やブロードキャストを偽装してフレームを覗き見ようとすること、といった事象が起こり得ます。L3 のファイアウォールや IDS (Intrusion Detection System) が見られるのはセグメント間の通信だけで、同一 VLAN 内で完結する攻撃は L2 で防がない限り通り抜けてしまいます。本節で扱う Port-Security / DHCP Snooping / Dynamic ARP Inspection / Storm Control は、この「LAN の内側で起きる事故・攻撃」を L2 のスイッチ自身が抑え込むための機能群です。

L2 セキュリティ検証トポロジ

検証トポロジは SW1 (iosvl2) に PC1 / PC2 が接続された素朴な構成です。PC1 → Gi0/1、PC2 → Gi0/2 がアクセス VLAN 10、Gi0/0 が管理用の外部接続となります。この構成で Port-Security と Storm Control を SW1 に設定し、挙動を確認していきます。


2. Port-Security

Port-Security は、アクセスポートで学習する MAC アドレスの個数と種類 を制限する機能です。1 つのポートに繋がる端末は通常 1 台、IP 電話を経由する構成でも 2 台が上限となります。それを超える MAC が現れたら「想定外の機器が接続された」と判断して即座に対処する、というのが基本発想です。

Port-Security の設定要素は主に 4 つに分かれます。

  • switchport port-security で機能を有効化。
  • switchport port-security maximum N で、そのポートで学習を許す MAC 数の上限を指定(既定 1)。
  • switchport port-security violation { shutdown | restrict | protect } で違反時の動作を選択。
  • switchport port-security mac-address sticky で、学習した MAC を running-config に動的に書き込む 設定。sticky を指定しないと再起動後に MAC が消えるため、運用では sticky か手動の静的指定を組み合わせるのが一般的です。

本ラボの day0 から Gi0/1 の Port-Security 部分を抜き出すと以下のとおりです(Gi0/2 も同一)。

snippet
interface GigabitEthernet0/1
 description PC1
 switchport mode access
 switchport access vlan 10
 switchport port-security
 switchport port-security maximum 1
 switchport port-security violation shutdown
 switchport port-security mac-address sticky

maximum を 1 にしているため、最初に学習した 1 つの MAC だけがそのポートで通信を許可されます。違反時は shutdown を選んでいるため、別の MAC が接続された瞬間にポートが errdisable に落ちる、という最も厳格な動作となります。


3. DHCP Snooping

DHCP Snooping (Dynamic Host Configuration Protocol Snooping) は、スイッチが流れている DHCP メッセージの中身を覗き見て、偽の DHCP サーバから来た Offer / ACK を遮断する 機能です。ポートを trust(信頼)untrust(非信頼) の 2 種類に分け、正規の DHCP サーバが繋がっている方向のポートだけを trust にしておきます。trust 以外のポートから DHCP Offer / DHCP ACK が流れてきたら破棄する、というのが核心です。

悪意ある端末がアクセスポートに繋がって「自分が DHCP サーバだ」と振る舞うと、近隣の端末は本物より早く反応したそちらから IP・デフォルトゲートウェイ・DNS の情報を受け取ってしまいます。デフォルトゲートウェイを攻撃者の IP に書き換えれば、その後の通信はすべて攻撃者を経由することになり、中間者攻撃 (Man-in-the-Middle) の足場が完成します。DHCP Snooping はこの最初のステップを止めるための機能です。

DHCP Snooping の設定は概ね以下のような形となります。

snippet
ip dhcp snooping
ip dhcp snooping vlan 10
!
interface GigabitEthernet0/24
 description Uplink to DHCP server
 ip dhcp snooping trust

VLAN 単位で機能を有効化し、正規 DHCP サーバへの上流ポートだけに ip dhcp snooping trust を投入します。アクセスポート側は untrust のままで構わず、明示的な設定は不要です。

DHCP Snooping は untrust ポートを流れる一連の DHCP メッセージを観測します。割り当てられた IP アドレスとリース時間が確定するのはサーバが返す DHCPACK のタイミングで、これを受けて (IP, MAC, ポート, VLAN, リース時間) の対応関係が DHCP Snooping binding table に記録されます(Discover や Request の段階ではまだ割当 IP・リース時間は確定しません)。このテーブル自体が次の DAI (Dynamic ARP Inspection) の入力となる、という縦の繋がりがあります。

3.1 iosvl2 での実機確認

DHCP Snooping の動作を CML 上の iosvl2 で確認します。検証構成は、§6 以降の Port-Security ラボとは別に用意した次の最小構成です。R1 (csr1000v) を VLAN 10 セグメント (192.168.10.0/24) の DHCP サーバとし、SW1 (iosvl2) の Gi0/1 を R1 への上流ポート (trust)、Gi0/2 を端末 PC1 へのアクセスポート (untrust) としています。SW1 では ip dhcp snooping を VLAN 10 で有効化し、Gi0/1 にだけ ip dhcp snooping trust を投入してあります。

まず機能全体の有効状態を show ip dhcp snooping で確認します。

snippet
SW1#show ip dhcp snooping
Switch DHCP snooping is enabled
Switch DHCP gleaning is disabled
DHCP snooping is configured on following VLANs:
10
DHCP snooping is operational on following VLANs:
10
DHCP snooping is configured on the following L3 Interfaces:

Insertion of option 82 is disabled
   circuit-id default format: vlan-mod-port
   remote-id: 5254.00a3.b644 (MAC)
Option 82 on untrusted port is not allowed
Verification of hwaddr field is enabled
Verification of giaddr field is enabled
DHCP snooping trust/rate is configured on the following Interfaces:

Interface                  Trusted    Allow option    Rate limit (pps)
-----------------------    -------    ------------    ----------------   
GigabitEthernet0/1         yes        yes             unlimited
  Custom circuit-ids:

Switch DHCP snooping is enabled で機能そのものが有効、DHCP snooping is operational on following VLANs: 10 で VLAN 10 上で実際に動作中であることが分かります。configuredoperational が両方 VLAN 10 を挙げているのが「設定されているだけでなく稼働している」状態です。末尾の trust 一覧には Gi0/1 だけが Trusted: yes で現れており、ここが正規 DHCP サーバへの上流ポートであることを示します。一覧に出てこない Gi0/2 (PC1 側) は既定の untrust のままで、明示設定は不要です。

次に binding table を show ip dhcp snooping binding で確認します。

snippet
SW1#show ip dhcp snooping binding
MacAddress          IpAddress        Lease(sec)  Type           VLAN  Interface
------------------  ---------------  ----------  -------------  ----  --------------------
52:54:00:00:00:AA   192.168.10.50    86130       dhcp-snooping   10    GigabitEthernet0/2
Total number of bindings: 1

(MAC 52:54:00:00:00:AA, IP 192.168.10.50) が VLAN 10・Gi0/2 のエントリとして登録されています。Type 列が dhcp-snooping となっており、これが DHCP メッセージの観測(または同等の静的投入)によって作られた binding であることを示します。この 1 行が次の DAI の検証元データとなります。

なお、この binding は検証の都合で 静的に投入 したものです。binding を「実際の DHCP のやり取りで自然に育てる」には端末側が DHCP Discover を送出する必要がありますが、検証端末 PC1 (Alpine Linux) は非特権実行のため raw socket を開けず (Operation not permitted)、DHCP クライアントを起動できません。そこで binding table の見え方を示すために、ip dhcp snooping binding 5254.0000.00aa vlan 10 192.168.10.50 interface GigabitEthernet0/2 expiry 86400 を手動投入しています。本番環境では正規の DHCP のやり取りから同じ形式のエントリが自動生成されます。このコマンドは設定モードではなく特権 EXEC モードで実行する点に注意が必要です。

統計情報も合わせて確認します。

snippet
SW1#show ip dhcp snooping statistics
 Packets Forwarded                                     = 75
 Packets Dropped                                       = 0
 Packets Dropped From untrusted ports                  = 0

trust 境界を越えて転送された DHCP パケットが 75、破棄が 0 です。untrust ポートから不正な Offer / ACK が流れてくれば Packets Dropped From untrusted ports が増えますが、本ラボには偽 DHCP サーバを置いていないため 0 のままとなっています。


4. Dynamic ARP Inspection (DAI)

Dynamic ARP Inspection (DAI) は、流れる ARP パケットの中身を DHCP Snooping binding table と突き合わせて検証する機能です。binding table には「この IP は、この MAC、このポート、この VLAN にいる」という対応関係が記録されています。ARP 応答パケットがその対応関係と矛盾していたら破棄する、というのが DAI の動作原理です。

ARP プロトコル自体には、応答の正当性を確かめる仕組みが組み込まれていません。攻撃者が「私が 192.168.10.1 です」と偽の ARP Reply を流せば、それを受け取った端末は素直にキャッシュを書き換え、以後のフレームを攻撃者宛に送り始めます。これが ARP スプーフィング (ARP Spoofing) で、L2 で起きる最も典型的な中間者攻撃の準備動作となります。

DAI の設定は VLAN 単位で有効化します。

snippet
ip arp inspection vlan 10

これだけで、untrust ポート(既定)から流れる ARP パケットは binding table 突合の対象となります。上流の信頼できるポート(ルータや L3 SVI、サーバ)は ip arp inspection trust を別途投入して検査対象から外す、という建て付けは DHCP Snooping と同じです。

DAI には DHCP Snooping → DAI という順序が必須です。動的環境では DAI 単体では検査の元データが無いため、DHCP Snooping を先に動かして binding table を育てる、という構造となります。固定 IP 環境では ip arp inspection vlan ... と組合せて、手動の ARP ACL で許可エントリを書く運用になります。

4.1 iosvl2 での実機確認

§3.1 と同じ SW1 (iosvl2) 上で DAI も VLAN 10 で有効化し、固定 IP 環境を想定して ARP ACL DAI-PC1 を適用してあります。まず VLAN 単位の有効状態を show ip arp inspection vlan 10 で確認します。

snippet
SW1#show ip arp inspection vlan 10

Source Mac Validation      : Disabled
Destination Mac Validation : Disabled
IP Address Validation      : Disabled

 Vlan     Configuration    Operation   ACL Match          Static ACL
 ----     -------------    ---------   ---------          ----------
   10     Enabled          Active      DAI-PC1            No 

 Vlan     ACL Logging      DHCP Logging      Probe Logging
 ----     -----------      ------------      -------------
   10     Deny             Deny              Off

VLAN 10 が Enabled / Active で稼働しており、ACL Match 列に DAI-PC1 が表示されています。これは固定 IP 用に書いた ARP ACL が VLAN 10 の検査に適用されていることを示します。Static ACL: No は、この ACL を static キーワードなしで適用していることを意味します。この場合、ARP ACL で許可されなかったパケットは、続けて §3 の DHCP Snooping binding table との突合に回されます(static を付けると ACL の判定だけで完結し、binding table へのフォールバックは行われません)。「ARP ACL → binding table」の二段で検査する、という建て付けです。

trust 境界はインターフェイス単位で show ip arp inspection interfaces で確認します。

snippet
SW1#show ip arp inspection interfaces

 Interface        Trust State     Rate (pps)    Burst Interval
 ---------------  -----------     ----------    --------------
 Gi0/0            Untrusted               15                 1
 Gi0/1            Trusted               None               N/A
 Gi0/2            Untrusted               15                 1

Gi0/1 が Trusted(R1 = 正規機器方向のため検査をスキップ)、Gi0/2 が Untrusted(PC1 側のため検査対象)です。untrust ポートには既定で 15 pps のレート制限が掛かり、ARP を大量に流す攻撃に対する保険となります。trust ポートはレート制限の対象外 (None) です。DHCP Snooping の trust 境界と DAI の trust 境界が同じインターフェイス (Gi0/1) で一致しているのが、この二機能をセットで設計する理由です。

検査結果の統計を show ip arp inspection statistics vlan 10 で確認します。

snippet
SW1#show ip arp inspection statistics vlan 10

 Vlan      Forwarded        Dropped     DHCP Drops      ACL Drops
 ----      ---------        -------     ----------      ---------
   10             15              0              0              0

 Vlan   DHCP Permits    ACL Permits  Probe Permits   Source MAC Failures
 ----   ------------    -----------  -------------   -------------------
   10              0             15              0                     0

 Vlan   Dest MAC Failures   IP Validation Failures   Invalid Protocol Data
 ----   -----------------   ----------------------   ---------------------
   10                   0                        0                       0

PC1 が送出する ARP は、登録済みの (IP 192.168.10.50, MAC 5254.0000.00aa) と一致するため ARP ACL で許可され、ACL Permits: 15Forwarded: 15 とカウントされています。矛盾する ARP が無いため Dropped: 0 です。実際に攻撃が起きると、binding と矛盾する ARP が Dropped および DHCP Drops / ACL Drops として計上されます。適用中の ARP ACL の中身は show arp access-list で確認できます。

snippet
SW1#show arp access-list
ARP access list DAI-PC1
    permit ip host 192.168.10.50 mac host 5254.0000.00aa

192.168.10.50 の正規の持ち主は 5254.0000.00aa だけ、というルールが 1 行で表現されています。固定 IP 環境ではこのように ARP ACL を明示的に書きますが、DHCP で IP を配る環境では §3 の binding table がこの「正しい対応関係」を自動的に供給する、という役割分担になります。

なお、不正 ARP を実際に注入して Dropped カウンタを増やす実演までは、本検証では行っていません。攻撃側の不正 ARP 送出にも検証端末 (Alpine Linux) の非特権制約が掛かるためで、ここでは「機能が有効で trust 境界と検証ルールが効いている状態」を示すに留めています。


5. Storm Control

Storm Control は、ポートで観測する ブロードキャスト / マルチキャスト / 未知ユニキャスト の流量がしきい値を超えたら、そのポートで該当トラフィックを抑制する機能です。

ループや誤設定や端末の暴走で、ブロードキャストが大量に発生することがあります。これを放置すると、同一 VLAN の全ポートに複製されて流れるブロードキャストの宿命で、関係ない端末まで巻き込んで CPU が振り切れ、LAN 全体が機能不全に陥ります(ブロードキャストストーム / Broadcast Storm)。Storm Control は発生源になりかけているポートを早期に切り落とすことで被害を局所化する機能です。

Storm Control のしきい値の単位は 帯域比(%)pps(パケット毎秒 / Packet Per Second) で指定します。動作はポリシングのように「超過分だけを正確に間引く」のではなく、測定間隔の中で上限しきい値 (rising threshold) を超えたら、その時点から該当種別のトラフィックを破棄(フィルタ)し、流量が下限しきい値 (falling threshold) を下回るまで破棄を続ける という挙動です。これが Storm Control の基本動作で、storm-control action で指定するのは「破棄に加えて何をするか」です。

  • action 無指定(既定): しきい値超過中、該当種別のフレームを破棄します。ポートはリンクアップのまま、SNMP trap も送りません。
  • storm-control action trap: 破棄に加えて SNMP trap を送信します(破棄そのものは続くので「フレームを流し続ける」わけではありません)。
  • storm-control action shutdown: 超過を検知するとポートを errdisable に落とす最も厳格な動作。該当種別だけでなくポート全体の通信が止まり、復旧は手動か errdisable recovery 経由となります。

本ラボでは Gi0/1 / Gi0/2 にブロードキャスト 1.00% のしきい値で shutdown action を投入しています。

snippet
interface range GigabitEthernet0/1 - 2
 storm-control broadcast level 1.00
 storm-control action shutdown

1.00% は 1 Gbps 換算で 10 Mbps 相当となり、検証用としてはかなり攻撃的な値です。本番では 5 〜 30% を用途に応じて選ぶことが多くなります。

なお Storm Control については、本ラボで用いている iosvl2 が show storm-control コマンドを提供しておらず(実行すると % Invalid input となります)、実機の動作確認 show を掲載できません。設定行自体は running-config に投入できますが、しきい値超過時の抑制状態を観測する手段が無いため、本節では概念の説明に留めています。


6. CML での検証

DHCP Snooping (§3.1) と DAI (§4.1) の実機確認は済んでいるので、ここからは Port-Security を CML(Cisco Modeling Labs)上の iosvl2 で詳しく追っていきます。SW1 に PC1 / PC2 が VLAN 10 のアクセスポートで接続され、30 秒周期で peer に ping を打って MAC 学習を継続させた状態となります。Port-Security は maximum 1、violation shutdown、sticky 学習を有効化済みで、PC1 / PC2 の MAC アドレスがそれぞれ Gi0/1 / Gi0/2 に学習されている前提です。

day0 で投入した SW1 側の Port-Security と Storm Control の設定は、§2 / §5 で示したとおりです。以降では、この設定状態でどの show コマンドが何を見せるかを 1 つずつ確認し、§8 では実際に違反を起こして err-disabled への遷移と復旧までを追っていきます。


7. show port-security — sticky MAC 学習の確認

検証の中心となるのが show port-security 系のコマンドです。まずポート単位の集約ビューから確認していきます。

snippet
SW1#show port-security
Secure Port  MaxSecureAddr  CurrentAddr  SecurityViolation  Security Action
                (Count)       (Count)          (Count)
---------------------------------------------------------------------------
      Gi0/1              1            1                  0         Shutdown
      Gi0/2              1            1                  0         Shutdown
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Gi0/1 / Gi0/2 ともに MaxSecureAddr = 1CurrentAddr = 1SecurityViolation = 0Action = Shutdown となっています。設定上の上限は 1、現在の学習数も 1、これまでの違反回数 0、違反時のアクションは Shutdown、という意味です。CurrentAddr が MaxSecureAddr に張り付いており、ここから 1 つでも MAC が増えれば即座に違反としてカウントされる、という状態となります。

ポートごとの詳細は show port-security interface で確認できます。

snippet
SW1#show port-security interface GigabitEthernet0/1
Port Security              : Enabled
Port Status                : Secure-up
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 0
Sticky MAC Addresses       : 1
Last Source Address:Vlan   : 5254.00e4.4813:10
Security Violation Count   : 0

注目すべき行を順に拾います。Port Status : Secure-up は「Port-Security が有効化された状態で、ポートが正常にアップしている」ことを示します。違反が起きると Secure-shutdown に切り替わります。Maximum MAC Addresses : 1Total MAC Addresses : 1 から、上限 1 に対して現在 1 個の MAC が学習されており、これ以上の新規 MAC は受け付けない状態であることが分かります。Configured MAC Addresses : 0 は手動で静的指定した MAC が 0 件、つまりすべての secure MAC が sticky 学習由来であることを意味します。

そして本節の核心となるのが Sticky MAC Addresses : 1Last Source Address:Vlan : 5254.00e4.4813:10 の 2 行です。sticky で 1 個の MAC(PC1 の 5254.00e4.4813)が VLAN 10 で学習され、固定された状態となっています。この時点で、もしこのポートに別の MAC を持つ端末を差し替えると、即座に violation shutdown が発動して Secure-shutdown に落ちる、という保証が成立しています。

Gi0/2 も対称的に動作しています。

snippet
SW1#show port-security interface GigabitEthernet0/2
Port Security              : Enabled
Port Status                : Secure-up
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 0
Sticky MAC Addresses       : 1
Last Source Address:Vlan   : 5254.00bd.016b:10
Security Violation Count   : 0

Gi0/2 では PC2 の 5254.00bd.016b が VLAN 10 で sticky 学習されています。「アクセスポートに 1 台しか繋がない」というポリシーがスイッチ自身の機能として強制されている状態です。


8. violation を実際に起こす — err-disabled への遷移と復旧

§7 では「別の MAC を持つ端末を接続すると即座に violation shutdown が発動する」と述べました。ここではその挙動を実機で発生させ、ポートが err-disabled に落ちる様子と、そこから復旧する 2 通りの手順を確認していきます。

検証のため、Gi0/1 を sticky 学習ではなく MAC アドレスの静的指定 に変更しています。許可する 1 つの MAC を PC1 のものに固定したうえで、同じポートに 2 台目(PC3)をぶら下げ、PC3 の MAC が違反を起こす構図です。sticky のままだと最初に学習される MAC がどちらになるか不定になるため、違反を「狙ったポートで・狙った MAC で」起こすには静的指定が確実です。Gi0/1 と Gi0/2 の Secure MAC は、由来の違いが Type 列に現れます。

snippet
SW1#show port-security address
               Secure Mac Address Table
-----------------------------------------------------------------------------
Vlan    Mac Address       Type                          Ports   Remaining Age
                                                                   (mins)    
----    -----------       ----                          -----   -------------
  10    5254.0000.0011    SecureConfigured              Gi0/1        -
  10    5254.0000.0022    SecureSticky                  Gi0/2        -
-----------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Gi0/1 の 5254.0000.0011(PC1)が静的指定を意味する SecureConfigured、Gi0/2 の 5254.0000.0022(PC2)が sticky 学習を意味する SecureSticky です。同じ secure MAC でも、設定で固定したものと自動学習したものが Type 列で区別されます。

違反の発生

この状態で、Gi0/1 に許可されていない MAC(PC3 の 5254.0000.0033)が現れると、即座に違反が成立します。

snippet
SW1#show interfaces GigabitEthernet0/1 status

Port      Name               Status       Vlan       Duplex  Speed Type 
Gi0/1     PC1 (static-mac, v err-disabled 10           auto   auto RJ45

Status 列が err-disabled に変わりました。リンクは物理的には繋がっていても、スイッチがソフトウェア的にポートを無効化した状態です。ポートの詳細を確認します。

snippet
SW1#show port-security interface GigabitEthernet0/1
Port Security              : Enabled
Port Status                : Secure-shutdown
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 1
Sticky MAC Addresses       : 0
Last Source Address:Vlan   : 5254.0000.0033:10
Security Violation Count   : 1

§7 で Secure-up だった Port StatusSecure-shutdown に遷移 しています。Security Violation Count が 1 に増え、Last Source Address:Vlan に違反を起こした MAC 5254.0000.0033(PC3) が記録されました。この Last Source は「誰が違反を起こしたか」を後から特定する手がかりとなります。

集約ビューにも違反が反映されています。

snippet
SW1#show port-security
Secure Port  MaxSecureAddr  CurrentAddr  SecurityViolation  Security Action
                (Count)       (Count)          (Count)
---------------------------------------------------------------------------
      Gi0/1              1            1                  1         Shutdown
      Gi0/2              1            1                  0         Shutdown
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Gi0/1 の SecurityViolation 列が 0 から 1 に変わり、違反を起こしていない Gi0/2 は 0 のままです。err-disabled に落ちたポートは、理由つきで一覧できます。

snippet
SW1#show interfaces status err-disabled

Port      Name               Status       Reason               Err-disabled Vlans
Gi0/1     PC1 (static-mac, v err-disabled psecure-violation

Reason 列が psecure-violation(Port-Security violation)です。同時にスイッチのログにも記録が残ります。

snippet
SW1#show logging | include PM-4-ERR_DISABLE
*Jun  9 14:48:30.507: %PM-4-ERR_DISABLE: psecure-violation error detected on Gi0/1, putting Gi0/1 in err-disable state

%PM-4-ERR_DISABLE は、psecure-violation を検知して Gi0/1 を err-disable 状態にした、という意味のメッセージです。座学では「違反するとポートが落ちる」で終わりがちな箇所ですが、実機ではこのように Port Status・Violation Count・Last Source・Reason・syslog の 5 つが連動して状態を伝えてきます。

手動での復旧

err-disabled に落ちたポートは、後述の errdisable recovery を有効にしていなければ、放置しても自動では戻りません。最も基本的な復旧は、ポートを shutdown してから no shutdown で入れ直す手順です。ただし その前に違反の原因(許可されていない MAC を持つ端末)を取り除く 必要があります。原因が残ったまま no shutdown すると、ポートがアップして原因端末が再びフレームを送った時点でまた同じ違反が起きて、再び err-disabled に落ちるためです。

PC3 を切り離してから、Gi0/1 を入れ直します。

snippet
SW1#show interfaces GigabitEthernet0/1 status

Port      Name               Status       Vlan       Duplex  Speed Type 
Gi0/1     PC1 (static-mac, v connected    10         a-full   auto RJ45
SW1#show port-security interface GigabitEthernet0/1
Port Security              : Enabled
Port Status                : Secure-up
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 1
Sticky MAC Addresses       : 0
Last Source Address:Vlan   : 0000.0000.0000:0
Security Violation Count   : 1

StatusconnectedPort StatusSecure-up に戻り、ポートが復旧しました。ここで注目すべきは Security Violation Count が 1 のまま という点です。復旧してもこのカウンタは 0 に戻らず、違反が起きた履歴として累積し続けます。カウンタをリセットするには、そのポートの Port-Security 設定を一度外して入れ直すなどの操作が別途必要となります。

errdisable recovery による自動復旧

毎回手動で復旧するのが現実的でない環境向けに、IOS には 一定時間が経過したら err-disabled のポートを自動で戻す 仕組み(errdisable recovery)が用意されています。psecure-violation を対象に有効化し、待ち時間(interval)を指定します。

snippet
SW1(config)#errdisable recovery cause psecure-violation
SW1(config)#errdisable recovery interval 300

設定状態は show errdisable recovery で確認できます。psecure-violation の行が Enabled に変わっています。

snippet
SW1#show errdisable recovery
ErrDisable Reason            Timer Status
-----------------            --------------
...
psecure-violation            Enabled
...
Timer interval: 300 seconds

Interfaces that will be enabled at the next timeout:

この状態で再び違反を起こすと、ポートは err-disabled に落ちますが、今度は復旧タイマーの待ち行列に入ります。

snippet
SW1#show errdisable recovery
...
Timer interval: 300 seconds

Interfaces that will be enabled at the next timeout:

Interface       Errdisable reason       Time left(sec)
---------       -----------------       --------------
Gi0/1          psecure-violation          254

Interfaces that will be enabled at the next timeout の一覧に Gi0/1 が現れ、Time left(sec)あと 254 秒で自動的に有効化される ことを示しています。interval を 300 秒に設定しているため、違反からの経過時間に応じてこの値が減っていきます。タイマーが満了すると、ポートは自動でアップを試み、ログにその記録が残ります。

snippet
SW1#show logging | include ERR_RECOVER
*Jun  9 14:05:07.207: %PM-4-ERR_RECOVER: Attempting to recover from psecure-violation err-disable state on Gi0/1

%PM-4-ERR_RECOVER は、psecure-violation による err-disable からの復旧を試みた、というメッセージです。なお自動復旧であっても、違反の原因が残っていれば、復旧したポートに原因端末が再びフレームを送った時点で再び落ちる 点は手動復旧と変わりません。errdisable recovery は「原因が去ったあとに自動で戻す」仕組みであり、原因そのものを取り除くわけではないためです。interval を短くしすぎると、原因が残っている間は「落ちる→戻る→また落ちる」を繰り返してログが埋まるため、実運用では原因の通知(restrict モードの SNMP trap など)と組み合わせて運用するのが現実的となります。


9. Secure MAC Address Table と sticky の保存性

§8 で show port-security address を確認したとおり、Port-Security で管理される MAC は、通常の MAC アドレステーブルとは別の Secure MAC Address Table に記録されます。ここでは sticky 学習されたエントリの性質を、もう一度この表に立ち戻って確認します(以下は両ポートとも sticky 学習で動かしたときの表示です)。

snippet
SW1#show port-security address
               Secure Mac Address Table
-----------------------------------------------------------------------------
Vlan    Mac Address       Type                          Ports   Remaining Age
                                                                   (mins)    
----    -----------       ----                          -----   -------------
  10    5254.00e4.4813    SecureSticky                  Gi0/1        -
  10    5254.00bd.016b    SecureSticky                  Gi0/2        -
-----------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Type 列が SecureSticky となっています。これが sticky 学習由来であることを示します(§8 で見た静的指定の SecureConfigured と対になる種別です)。Remaining Age - は「エージング無効」を意味し、無通信時間が長くなっても自動削除されません。2-2 で見た通常の DYNAMIC エントリは 300 秒の aging-time で消えていたのと対照的な扱いです。

比較のため、同じスイッチで通常の MAC アドレステーブルも確認します。

snippet
SW1#show mac address-table dynamic
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    bc24.1127.cd21    DYNAMIC     Gi0/0
Total Mac Addresses for this criterion: 1

VLAN 1 の Gi0/0(管理用の外部接続ポート)で 1 件の DYNAMIC エントリが学習されているだけで、VLAN 10 で sticky 化された PC1 / PC2 の MAC は現れません。Secure MAC は別管理となっているためです。Port-Security 有効時は show port-security address 側を参照する、という点が運用上のポイントとなります。

sticky 学習されたエントリは、エージング無効であることに加えて、running-config に逐次書き込まれる という性質もあります。実際、Gi0/1 の running-config は以下のとおりで、sticky 学習で発見した PC1 の MAC が mac-address sticky 5254.00e4.4813 として自動的に追加されています。

snippet
SW1#show running-config interface GigabitEthernet0/1
Building configuration...

Current configuration : 253 bytes
!
interface GigabitEthernet0/1
 description PC1
 switchport access vlan 10
 switchport mode access
 switchport port-security mac-address sticky
 switchport port-security mac-address sticky 5254.00e4.4813
 switchport port-security
 negotiation auto
end

switchport port-security mac-address sticky が 2 行並んでいます。1 行目は sticky 機能の有効化、2 行目が「sticky 学習結果として記録された具体的な MAC」となります。あとは write memory で startup-config に保存すれば、再起動後もこの MAC が secure MAC(§8 で見た SecureSticky 種別)として残り、別の端末を接続すると即座に違反として検知される運用に入ります。

ポートのリンク状態も確認します。

snippet
SW1#show interfaces status

Port      Name               Status       Vlan       Duplex  Speed Type 
Gi0/0                        connected    1          a-full   auto RJ45
Gi0/1     PC1                connected    10         a-full   auto RJ45
Gi0/2     PC2                connected    10         a-full   auto RJ45

Gi0/1 / Gi0/2 ともに VLAN 10 で connected、Auto-Negotiation で full-duplex、リンクは正常にアップしています。Port-Security が有効でもリンク自体は通常の access ポートとして使用でき、内部で MAC 検査が走っているだけ、という状態です。


10. 落とし穴・補足

実運用で踏みやすい注意点を 5 点挙げます。

  • Violation Mode の使い分け: §8 で実機確認した shutdown はポートを errdisable に落とす最も厳格なモードで、復旧は手動 shutdown / no shutdownerrdisable recovery cause psecure-violation の自動復旧設定に頼る形です。残る 2 モードのうち、restrict は違反フレームを破棄しつつ SNMP trap とログを残す中庸モード、protect は破棄するだけで通知すら出さない最弱モードとなります。shutdown は通信が完全に止まる代わりに違反に最も気づきやすく、restrict は通信を流したまま違反を記録できる一方でポートは落ちません。本番では「気づける」モードである shutdown か restrict を選ぶのが基本で、protect は通知が出ない分だけ運用上の発見が遅れるため、限定的な用途に留めるのが無難です。
  • sticky の保存: 学習直後の sticky MAC は running-config に書き込まれていますが、write memory (または copy running-config startup-config) を忘れると、再起動で sticky エントリ全消失 → 起動後に最初に来たフレームの MAC を新規 sticky として学習、という挙動になります。別の端末を刺し替えた直後に再起動すると「攻撃者の MAC が sticky として固定されてしまう」事故に繋がります。Port-Security を本格運用に乗せる時は、sticky 学習が完了したタイミングで write memory を打つフローを必ず入れます。
  • DHCP Snooping の信頼境界: 信頼境界を跨ぐ階層構成では、エッジスイッチがアクセスポートを untrust、コアスイッチへの uplink を trust、コアスイッチ側で DHCP relay と option-82 を扱う、というレイヤ分けになります。エッジ側にコア側でしか trust にしていないポートが残っていると、そこから流れる Offer / ACK が遮断されて正規 DHCP が機能しなくなる事故が起きます。設計時に各リンクの信頼方向を 1 枚の図に書き出すのが安全です。
  • DAI と Storm Control の併用: ARP storm (短時間に大量の ARP を流す攻撃や暴走) は、Storm Control で多すぎる側を ports 単位に抑え、流量が許容範囲内に収まったうえで内容の正当性を DAI が DHCP Snooping binding table と突き合わせて検証する、という二段構えになります。片方だけだと、量で潰されるか中身を信用するかのどちらかが甘くなります。
  • Storm Control の単位選び: しきい値は level が帯域比、level pps が pps の絶対値、level bps が bps の絶対値です。本ラボの level 1.00 は % (帯域比) の指定で、1 Gbps リンクなら 10 Mbps 相当という意味になります。10G / 25G リンクが混在する現代の LAN では、% 指定のままだと 10G ポートで 100 Mbps、25G ポートで 250 Mbps と「実効しきい値」が変わってしまうため、安全寄りに pps 指定で揃えるのも 1 つの選択です。

11. 第 2 章のまとめと次章の内容

第 2 章では、Ethernet とスイッチを軸に LAN 内部の動作原理と運用機能を 8 節にわたって体系的に扱ってきました。2-1 で Ethernet の歴史と速度系統を整理し、2-2 で CAM テーブルによる自動学習という出発点を押さえ、2-3 で 1 台のスイッチを複数の論理ネットワークに分ける VLAN を、2-4 で複数 VLAN を 1 リンクで運ぶ Trunk と 802.1Q タグを、2-5 でその VLAN 情報を複数スイッチ間で同期する VTP を、2-6 で物理的なループを論理的に断つ STP を、2-7 で複数の物理リンクを 1 本に束ねる EtherChannel を扱いました。そして本節 2-8 では、それらの上に Port-Security / DHCP Snooping / DAI / Storm Control という防御層を重ね、CAM 自動学習の便利さの裏側にある「想定外の MAC」「偽 DHCP」「ARP スプーフィング」「ブロードキャスト暴走」をスイッチ自身が抑え込む仕組みを確認しました。CAM の自動学習が出発点、Trunk と VTP が拡張の道具、STP と EtherChannel が冗長と帯域の解決策、L2 セキュリティが防御の上塗り、という積み重ねで現代の LAN は成り立っています。

続く 第 3 章 L3 編 では視点を一段引き上げ、L3 ルーティングの世界に踏み込みます。IP アドレッシングとサブネット、静的ルートと動的ルーティングプロトコル (RIP / EIGRP / OSPF / BGP)、ルーティングテーブルと FIB、再配送、ルーティングポリシー、FHRP (HSRP / VRRP / GLBP)、IPv6、マルチキャストまで全 14 節で網羅します。第 2 章で VLAN 単位に隔離した複数のネットワークを L3 で繋ぐ SVI / router-on-a-stick もここで扱うため、L2 と L3 の境界がどう接続されるかが自然に見えてくる構成です。