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 のスイッチ自身が抑え込むための機能群です。

検証トポロジは 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 も同一)。
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 stickymaximum を 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 の設定は概ね以下のような形となります。
ip dhcp snooping
ip dhcp snooping vlan 10
!
interface GigabitEthernet0/24
description Uplink to DHCP server
ip dhcp snooping trustVLAN 単位で機能を有効化し、正規 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 で確認します。
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 上で実際に動作中であることが分かります。configured と operational が両方 VLAN 10 を挙げているのが「設定されているだけでなく稼働している」状態です。末尾の trust 一覧には Gi0/1 だけが Trusted: yes で現れており、ここが正規 DHCP サーバへの上流ポートであることを示します。一覧に出てこない Gi0/2 (PC1 側) は既定の untrust のままで、明示設定は不要です。
次に binding table を show ip dhcp snooping binding で確認します。
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 モードで実行する点に注意が必要です。
統計情報も合わせて確認します。
SW1#show ip dhcp snooping statistics
Packets Forwarded = 75
Packets Dropped = 0
Packets Dropped From untrusted ports = 0trust 境界を越えて転送された 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 単位で有効化します。
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 で確認します。
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 OffVLAN 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 で確認します。
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 1Gi0/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 で確認します。
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 0PC1 が送出する ARP は、登録済みの (IP 192.168.10.50, MAC 5254.0000.00aa) と一致するため ARP ACL で許可され、ACL Permits: 15・Forwarded: 15 とカウントされています。矛盾する ARP が無いため Dropped: 0 です。実際に攻撃が起きると、binding と矛盾する ARP が Dropped および DHCP Drops / ACL Drops として計上されます。適用中の ARP ACL の中身は show arp access-list で確認できます。
SW1#show arp access-list
ARP access list DAI-PC1
permit ip host 192.168.10.50 mac host 5254.0000.00aa192.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 を投入しています。
interface range GigabitEthernet0/1 - 2
storm-control broadcast level 1.00
storm-control action shutdown1.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 系のコマンドです。まずポート単位の集約ビューから確認していきます。
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) : 4096Gi0/1 / Gi0/2 ともに MaxSecureAddr = 1、CurrentAddr = 1、SecurityViolation = 0、Action = Shutdown となっています。設定上の上限は 1、現在の学習数も 1、これまでの違反回数 0、違反時のアクションは Shutdown、という意味です。CurrentAddr が MaxSecureAddr に張り付いており、ここから 1 つでも MAC が増えれば即座に違反としてカウントされる、という状態となります。
ポートごとの詳細は show port-security interface で確認できます。
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 : 1 と Total MAC Addresses : 1 から、上限 1 に対して現在 1 個の MAC が学習されており、これ以上の新規 MAC は受け付けない状態であることが分かります。Configured MAC Addresses : 0 は手動で静的指定した MAC が 0 件、つまりすべての secure MAC が sticky 学習由来であることを意味します。
そして本節の核心となるのが Sticky MAC Addresses : 1 と Last Source Address:Vlan : 5254.00e4.4813:10 の 2 行です。sticky で 1 個の MAC(PC1 の 5254.00e4.4813)が VLAN 10 で学習され、固定された状態となっています。この時点で、もしこのポートに別の MAC を持つ端末を差し替えると、即座に violation shutdown が発動して Secure-shutdown に落ちる、という保証が成立しています。
Gi0/2 も対称的に動作しています。
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 : 0Gi0/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 列に現れます。
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) : 4096Gi0/1 の 5254.0000.0011(PC1)が静的指定を意味する SecureConfigured、Gi0/2 の 5254.0000.0022(PC2)が sticky 学習を意味する SecureSticky です。同じ secure MAC でも、設定で固定したものと自動学習したものが Type 列で区別されます。
違反の発生
この状態で、Gi0/1 に許可されていない MAC(PC3 の 5254.0000.0033)が現れると、即座に違反が成立します。
SW1#show interfaces GigabitEthernet0/1 status
Port Name Status Vlan Duplex Speed Type
Gi0/1 PC1 (static-mac, v err-disabled 10 auto auto RJ45Status 列が err-disabled に変わりました。リンクは物理的には繋がっていても、スイッチがソフトウェア的にポートを無効化した状態です。ポートの詳細を確認します。
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 Status が Secure-shutdown に遷移 しています。Security Violation Count が 1 に増え、Last Source Address:Vlan に違反を起こした MAC 5254.0000.0033(PC3) が記録されました。この Last Source は「誰が違反を起こしたか」を後から特定する手がかりとなります。
集約ビューにも違反が反映されています。
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) : 4096Gi0/1 の SecurityViolation 列が 0 から 1 に変わり、違反を起こしていない Gi0/2 は 0 のままです。err-disabled に落ちたポートは、理由つきで一覧できます。
SW1#show interfaces status err-disabled
Port Name Status Reason Err-disabled Vlans
Gi0/1 PC1 (static-mac, v err-disabled psecure-violationReason 列が psecure-violation(Port-Security violation)です。同時にスイッチのログにも記録が残ります。
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 を入れ直します。
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 : 1Status が connected、Port Status が Secure-up に戻り、ポートが復旧しました。ここで注目すべきは Security Violation Count が 1 のまま という点です。復旧してもこのカウンタは 0 に戻らず、違反が起きた履歴として累積し続けます。カウンタをリセットするには、そのポートの Port-Security 設定を一度外して入れ直すなどの操作が別途必要となります。
errdisable recovery による自動復旧
毎回手動で復旧するのが現実的でない環境向けに、IOS には 一定時間が経過したら err-disabled のポートを自動で戻す 仕組み(errdisable recovery)が用意されています。psecure-violation を対象に有効化し、待ち時間(interval)を指定します。
SW1(config)#errdisable recovery cause psecure-violation
SW1(config)#errdisable recovery interval 300設定状態は show errdisable recovery で確認できます。psecure-violation の行が Enabled に変わっています。
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 に落ちますが、今度は復旧タイマーの待ち行列に入ります。
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 254Interfaces that will be enabled at the next timeout の一覧に Gi0/1 が現れ、Time left(sec) が あと 254 秒で自動的に有効化される ことを示しています。interval を 300 秒に設定しているため、違反からの経過時間に応じてこの値が減っていきます。タイマーが満了すると、ポートは自動でアップを試み、ログにその記録が残ります。
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 学習で動かしたときの表示です)。
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) : 4096Type 列が SecureSticky となっています。これが sticky 学習由来であることを示します(§8 で見た静的指定の SecureConfigured と対になる種別です)。Remaining Age - は「エージング無効」を意味し、無通信時間が長くなっても自動削除されません。2-2 で見た通常の DYNAMIC エントリは 300 秒の aging-time で消えていたのと対照的な扱いです。
比較のため、同じスイッチで通常の MAC アドレステーブルも確認します。
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: 1VLAN 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 として自動的に追加されています。
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
endswitchport port-security mac-address sticky が 2 行並んでいます。1 行目は sticky 機能の有効化、2 行目が「sticky 学習結果として記録された具体的な MAC」となります。あとは write memory で startup-config に保存すれば、再起動後もこの MAC が secure MAC(§8 で見た SecureSticky 種別)として残り、別の端末を接続すると即座に違反として検知される運用に入ります。
ポートのリンク状態も確認します。
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 RJ45Gi0/1 / Gi0/2 ともに VLAN 10 で connected、Auto-Negotiation で full-duplex、リンクは正常にアップしています。Port-Security が有効でもリンク自体は通常の access ポートとして使用でき、内部で MAC 検査が走っているだけ、という状態です。
10. 落とし穴・補足
実運用で踏みやすい注意点を 5 点挙げます。
- Violation Mode の使い分け: §8 で実機確認した
shutdownはポートを errdisable に落とす最も厳格なモードで、復旧は手動shutdown / no shutdownかerrdisable 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 の境界がどう接続されるかが自然に見えてくる構成です。

interface GigabitEthernet0/1
switchport port-security
switchport port-security maximum 1
switchport port-security violation shutdown
switchport port-security mac-address stickymaximum 1 で、最初に学習した 1 個の MAC だけを許可。violation shutdown で、別の MAC が来た瞬間にポートを errdisable に落とす、最も厳格な動作だ。mac-address sticky は、学習した MAC を running-config に動的に書き込む設定で、これが無いと再起動で MAC が消えてしまう。show port-security interface で見える。まず違反が起きていない平常時だ。SW1#show port-security interface GigabitEthernet0/1
Port Security : Enabled
Port Status : Secure-up
Violation Mode : Shutdown
Maximum MAC Addresses : 1
Total MAC Addresses : 1
Sticky MAC Addresses : 1
Last Source Address:Vlan : 5254.00e4.4813:10
Security Violation Count : 0Port Status: Secure-up が「有効で正常にアップ」を示す。Maximum 1 に対して Total 1 ── 上限ぴったりまで埋まっていて、ここから 1 つでも増えれば違反だ。Sticky MAC Addresses: 1 と Last Source Address に PC1 の MAC が記録されている。Security Violation Count: 0 は、まだ違反が起きていない状態だね。SW1#show interfaces GigabitEthernet0/1 status
Port Name Status Vlan Duplex Speed Type
Gi0/1 PC1 (static-mac, v err-disabled 10 auto auto RJ45Status が err-disabled に変わった。リンクは物理的にはつながっていても、スイッチがソフト的にポートを無効化した状態だ。ポートの詳細を見ると、さっきの平常時から状態が一変している。SW1#show port-security interface GigabitEthernet0/1
Port Status : Secure-shutdown
Last Source Address:Vlan : 5254.0000.0033:10
Security Violation Count : 1Port Status が Secure-up から Secure-shutdown へ遷移。Security Violation Count が 1 に増えて、Last Source Address に違反を起こした PC3 の MAC 5254.0000.0033 が記録された。この Last Source が「誰が違反を起こしたか」を後から特定する手がかりになる。ログにも記録が残るよ。SW1#show logging | include PM-4-ERR_DISABLE
%PM-4-ERR_DISABLE: psecure-violation error detected on Gi0/1, putting Gi0/1 in err-disable stateshutdown してから no shutdown で入れ直すんだけど ── その前に 違反の原因(許可されてない MAC を持つ端末)を取り除くのが大前提だ。原因が残ったまま no shutdown すると、ポートが上がって原因端末が再びフレームを送った瞬間に、また同じ違反でまた落ちる。だから PC3 を切り離してから入れ直すんだ。戻すとこうなる。SW1#show port-security interface GigabitEthernet0/1
Port Status : Secure-up
Security Violation Count : 1Secure-up に戻ったりん!…あれ、でもご主人、Security Violation Count が 1 のままりん? 復旧したのに 0 に戻らないりん?SW1(config)#errdisable recovery cause psecure-violation
SW1(config)#errdisable recovery interval 300
SW1#show errdisable recovery
Interface Errdisable reason Time left(sec)
--------- ----------------- --------------
Gi0/1 psecure-violation 254Time left(sec) が「あと 254 秒で自動的に有効化される」ことを示している。300 秒に設定したから、経過とともにこの値が減る。満了するとポートは自動でアップを試みて、ログに %PM-4-ERR_RECOVER が残る。ただし ── ここも手動と同じで、違反の原因が残っていれば、復旧したポートに原因端末が再びフレームを送った時点でまた落ちる。errdisable recovery は「原因が去ったあとに自動で戻す」仕組みであって、原因そのものを取り除くわけじゃないんだ。interval を短くしすぎると「落ちる→戻る→また落ちる」でログが埋まるから、実運用では原因の通知と組み合わせるのが現実的だよ。SW1#show ip dhcp snooping
Switch DHCP snooping is enabled
DHCP snooping is operational on following VLANs:
10
Interface Trusted Allow option Rate limit (pps)
----------------------- ------- ------------ ----------------
GigabitEthernet0/1 yes yes unlimitedenabled で機能 ON、operational on VLANs: 10 で VLAN 10 上で実際に稼働中。trust 一覧には Gi0/1 だけが Trusted: yes で、ここが正規 DHCP サーバへの上流ポートだ。アクセスポート側(Gi0/2)は既定の untrust のままで、明示設定は要らない。そして DHCP のやり取りを観測すると、(IP, MAC, ポート, VLAN, リース時間) の対応関係が binding table に記録される。割り当て IP とリース時間が確定するのはサーバが返す DHCPACK のタイミングで、Discover や Request の段階ではまだ確定しない、という点も押さえておこう。SW1#show ip arp inspection vlan 10
Vlan Configuration Operation ACL Match Static ACL
---- ------------- --------- --------- ----------
10 Enabled Active DAI-PC1 NoEnabled / Active で稼働中。ACL Match に DAI-PC1 ── 固定 IP 用に書いた ARP ACL が適用されている。Static ACL: No は、ARP ACL で許可されなかったパケットを、続けて DHCP Snooping binding table との突合に回す設定だ。「ARP ACL → binding table」の二段で検査する建て付けだね。そして trust 境界が DHCP Snooping と同じ Gi0/1 で一致しているのが、この 2 機能をセットで設計する理由だよ。show storm-control コマンドを提供していなくて(実行すると % Invalid input になる)、しきい値超過時の抑制状態を観測する手段が無いんだ。設定行自体は running-config に投入できるけど、動作確認の show は載せられない。だから本節の Storm Control は 概念の説明にとどめてある。動作については、抑制の挙動だけ説明しておくよ ── ポリシングみたいに「超過分だけ正確に間引く」のではなく、測定間隔の中で上限しきい値(rising)を超えたら、その時点から該当種別を破棄し続けて、流量が下限しきい値(falling)を下回るまで破棄を続ける、という動きだ。