メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. OSPF記事一覧/

OSPFの認証

目次

OSPFの認証とは

OSPFの認証は、同じリンク上のルータが正しい相手かどうかを確かめる仕組みです。認証を設定していないOSPFは、届いたHelloの送信元を検証しません。同じセグメントにつないだ機器がHelloを流せば、それだけで隣接が成立し、LSAが流れ込みます。

認証はOSPFヘッダーの中で完結していて、AuType(認証方式)とAuthentication(8バイト)の2つのフィールドで表現されます。ヘッダーの構造はOSPFパケットの種類とヘッダーフォーマットで解説しているので、ここでは設定方法と鍵の運用を扱います。

方式AuType内容
認証なし0検証しない。既定の状態
平文認証1パスワードをそのままパケットに入れる。キャプチャーすれば読める
暗号認証2鍵から計算したダイジェストをパケット末尾に付ける。鍵そのものは流れない

認証はリンク単位の設定です。 片側だけに設定すると相手のHelloは検証に失敗して捨てられ、Deadインターバルの満了で隣接が落ちます。逆に、同じルータでもリンクごとに有効・無効や鍵を変えられます。

設定する場所は2つある

IOS XRでは、認証をエリア単位インタフェース単位のどちらでも設定できます。

設定場所書く位置効く範囲
エリア単位router ospf <プロセス>area <ID> 配下そのエリアに属する全インタフェース
インタフェース単位area <ID>interface <IF> 配下そのインタフェースだけ

両方を書いた場合はインタフェース単位が優先されます。エリア単位でまとめて有効にし、例外のリンクだけインタフェース単位で上書きする使い方ができます。

鍵はキーチェーンで管理する

暗号認証の鍵は、OSPFの設定に直接書くのではなくキーチェーンという独立した入れ物に定義し、インタフェースからは名前で参照します。

キーチェーンの構造
key chain <名前>
 key <鍵ID>
  cryptographic-algorithm <アルゴリズム>
  key-string clear <鍵文字列>
  send-lifetime   <開始> <終了>   ← この鍵で送信してよい期間
  accept-lifetime <開始> <終了>   ← この鍵を受信で受け付ける期間

要点は、鍵IDごとに送信と受信の期間を別々に持てることです。1つのキーチェーンに複数の鍵を入れ、受信を先に、送信を後に切り替えることで、隣接を落とさずに鍵を入れ替えられます

鍵IDはパケットのKey IDフィールドに入り、受信側はその番号で使う鍵を選びます。ダイジェストの長さはアルゴリズムで決まり、RFC 5709が定めるHMAC-SHA-256なら32バイト、MD5なら16バイトです。この長さはパケットのAuth Crypt Data Lengthにそのまま出ます。

検証構成

R1 - R2 - R3の直線で、全リンクがエリア0です。認証はR1 - R2間にだけ設定し、R2 - R3間は認証なしのままにします。R2のshow出力の中に「認証あり」と「なし」のインタフェースが並ぶため、認証がリンク単位であることをそのまま確認できます。

項目内容
認証を設定するリンクR1 - R2間(10.1.2.0/24)
認証を設定しないリンクR2 - R3間(10.2.3.0/24)
ルータIDR1が1.1.1.1、R2が2.2.2.2、R3が3.3.3.3(すべて明示設定)
キャプチャーR1 - R2間(フィルタはip proto 89
ソフトウェアXRd 26.1.1

7つのSTEPで進めます。

STEP操作確かめること
0認証なし認証の行が表示されない
1平文認証を設定パスワードがキャプチャーに平文で見える。片側だけだと隣接が落ちる
2MD5(キーチェーン)に変更Auth Crypt Data Length16。R2の隣のリンクは認証なしのまま
3HMAC-SHA-256に変更Auth Crypt Data Length32に変わる
4鍵を追加してローテーションKey IDが1から2へ。隣接は落ちない
5エリア単位の認証を併用インタフェース単位が優先される
6認証を削除認証なしの状態へ復旧(最終状態)

STEP 0:認証なしの状態

認証を設定していないインタフェースでは、show ospf interfaceに認証に関する行がそもそも表示されません。この記事で見るのは、Suppress helloMulti-area interface Countの間です。

R1 Gi0/0/0/0(認証なし。STEP 0)
RP/0/RP0/CPU0:R1#show ospf interface GigabitEthernet0/0/0/0
Fri Sep 11 05:45:20.485 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.1.2.1/24, Area 0, SID 0, Strict-SPF SID 0
  Label stack Primary label 0 Backup label 0 SRTE label 0
  Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State DR, Priority 1, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Designated Router (ID) 1.1.1.1, Interface address 10.1.2.1
  Backup Designated router (ID) 2.2.2.2, Interface address 10.1.2.2
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:04:035
  Index 1/1, flood queue length 0
  Next 0(0)/0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Backup Designated Router)
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

STEP 1:平文認証を設定する

インタフェース配下でauthenticationをキーワードなしで書くと平文認証になり、authentication-keyでパスワードを指定します。

STEP 1で投入した設定(まずR1だけ)
(R1)
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   authentication
   authentication-key ospfauth

R1にだけ設定した時点で、R1 - R2の隣接が落ちます。 R2は認証なしのHelloを送り続けますが、R1はそれを検証に失敗したものとして捨てるためです。R1のsyslogを見ると、設定をcommitした32秒後に隣接が落ちています。認証エラーではなくdead timer expiredとしか記録されません。

R1 syslog(片側だけ設定した直後。STEP 1)
RP/0/RP0/CPU0:Sep 11 05:46:42.207 UTC: config[67620]: %MGBL-CONFIG-6-DB_COMMIT : Configuration committed by user 'cisco'. Use 'show configuration commit changes 1000000001' to view the changes. 
RP/0/RP0/CPU0:Sep 11 05:46:42.444 UTC: config[67620]: %MGBL-SYS-5-CONFIG_I : Configured from console by cisco 
RP/0/RP0/CPU0:Sep 11 05:46:44.236 UTC: config[67639]: %MGBL-CONFIG-6-DB_COMMIT : Configuration committed by user 'cisco'. Use 'show configuration commit changes 1000000002' to view the changes. 
RP/0/RP0/CPU0:Sep 11 05:46:44.418 UTC: config[67639]: %MGBL-SYS-5-CONFIG_I : Configured from console by cisco 
RP/0/RP0/CPU0:Sep 11 05:47:16.873 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 2.2.2.2 on GigabitEthernet0/0/0/0 in area 0 from FULL to DOWN, Neighbor Down: dead timer expired, vrf default vrfid 0x60000000 

設定ミスに気づきにくいのはこのためです。隣接が落ちた原因を追うときは、両端の認証設定を突き合わせる必要があります。

R2にも同じ設定を入れると隣接が戻ります。認証の行が1行だけ現れました

R1 Gi0/0/0/0(平文認証。STEP 1)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Clear text authentication enabled
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

問題は、この方式ではパスワードがそのままパケットに入ることです。キャプチャーのNo.33を見ると、設定したospfauthがそのまま読み取れます。

No.33 Hello(平文認証。パスワードがそのまま見える)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 1.1.1.1
        Area ID: 0.0.0.0 (Backbone)
        Checksum: 0xce8e [correct]
        Instance ID: Base IPv4 Unicast Instance (0)
        Auth Type: Simple password (1)
        Auth Data (Simple): ospfauth
    OSPF Hello Packet
        Network Mask: 255.255.255.0
        Hello Interval [sec]: 10
        Options: 0x12, (L) LLS Data block, (E) External Routing
            0... .... = DN: Not set
            .0.. .... = (O) Opaque: Not set
            ..0. .... = (DC) Demand Circuits: Not supported
            ...1 .... = (L) LLS Data block: Present
            .... 0... = (N) NSSA: Not supported
            .... .0.. = (MC) Multicast: Not capable
            .... ..1. = (E) External Routing: Capable
            .... ...0 = (MT) Multi-Topology Routing: No
        Router Priority: 1
        Router Dead Interval [sec]: 40
        Designated Router: 10.1.2.1
        Backup Designated Router: 10.1.2.2
        Active Neighbor: 2.2.2.2
    OSPF LLS Data Block
        Checksum: 0x7fc2
        LLS Data Length: 32 bytes
        Extended options TLV
            TLV Type: 1
            TLV Length: 4
            Options: 0x00000001, (LR) LSDB Resynchronization
                .... .... .... .... .... .... .... ..0. = (RS) Restart Signal: Not set
                .... .... .... .... .... .... .... ...1 = (LR) LSDB Resynchronization: Set
        Local Interface ID
            TLV Type: 18
            TLV Length: 4
            Local Interface ID: 00000004
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
上のtshark出力のパケット(No.33 Hello)のpcapをダウンロード

平文認証は経路を盗み見られる環境では意味を持ちません。 設定ミスで意図しない隣接が張られるのを防ぐ用途に限られます。

STEP 2:MD5(キーチェーン)に変更する

暗号認証に切り替えます。まずキーチェーンを定義し、インタフェースから名前で参照します。

STEP 2で投入した設定
(R1・R2の両方に投入する)
key chain KC-OSPF
 key 1
  accept-lifetime 00:00:00 january 01 2020 infinite
  send-lifetime 00:00:00 january 01 2020 infinite
  cryptographic-algorithm HMAC-MD5
  key-string clear ospfkey1
!
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   no authentication
   no authentication-key
   authentication keychain KC-OSPF

表示がKeychain-based authentication enabledに変わり、キーチェーン名・使用中の鍵ID・アルゴリズムが続きます。HMAC_MD5_16の末尾の16はダイジェストのバイト数です。

R1 Gi0/0/0/0(MD5。STEP 2)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Keychain-based authentication enabled
    Keychain name KC-OSPF
    Key id used is 1
    Cryptographic algorithm HMAC_MD5_16
  Multi-area interface Count is 0

鍵文字列そのものはパケットに入りません。 show key chainでも暗号化されて表示されます。

R1 show key chain(STEP 2)
RP/0/RP0/CPU0:R1#show key chain
Fri Sep 11 05:53:12.011 UTC

Key-chain: KC-OSPF -

  timezone -- local
  Key 1 -- text "0700325C48021C1C46"
    Cryptographic-Algorithm -- HMAC_MD5
    Send lifetime --  00:00:00, 01 Jan 2020 - Always valid  [Valid now]
    Accept lifetime -- 00:00:00, 01 Jan 2020 - Always valid [Valid now]

キャプチャーではAuth Type: Cryptographic (2)になり、Auth Crypt Data Length16です。ダイジェスト本体はパケットの末尾に付きます。Auth Crypt Sequence Numberは、同じパケットを録音して再送する攻撃を防ぐための単調増加する値です。

No.3 Hello(MD5。Auth Crypt Data Length が 16)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 1.1.1.1
        Area ID: 0.0.0.0 (Backbone)
        Checksum: 0x0000 (None)
        Instance ID: Base IPv4 Unicast Instance (0)
        Auth Type: Cryptographic (2)
        Auth Crypt Key id: 1
        Auth Crypt Data Length: 16
        Auth Crypt Sequence Number: 1789105860
        Auth Crypt Data: f3be6f6190f302a73b4b99071c5d3fde
    OSPF Hello Packet
        Network Mask: 255.255.255.0
        Hello Interval [sec]: 10
        Options: 0x12, (L) LLS Data block, (E) External Routing
            0... .... = DN: Not set
            .0.. .... = (O) Opaque: Not set
            ..0. .... = (DC) Demand Circuits: Not supported
            ...1 .... = (L) LLS Data block: Present
            .... 0... = (N) NSSA: Not supported
            .... .0.. = (MC) Multicast: Not capable
            .... ..1. = (E) External Routing: Capable
            .... ...0 = (MT) Multi-Topology Routing: No
        Router Priority: 1
        Router Dead Interval [sec]: 40
        Designated Router: 10.1.2.2
        Backup Designated Router: 10.1.2.1
        Active Neighbor: 2.2.2.2
    OSPF LLS Data Block
        Checksum: 0x0000
        LLS Data Length: 56 bytes
        Extended options TLV
            TLV Type: 1
            TLV Length: 4
            Options: 0x00000001, (LR) LSDB Resynchronization
                .... .... .... .... .... .... .... ..0. = (RS) Restart Signal: Not set
                .... .... .... .... .... .... .... ...1 = (LR) LSDB Resynchronization: Set
        Local Interface ID
            TLV Type: 18
            TLV Length: 4
            Local Interface ID: 00000004
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
        Crypto Authentication TLV
            TLV Type: 2
            TLV Length: 20
            Sequence number: 0x6aa396c4
            Auth Data: bb2d9f6e43f93bf3d125592e350d8006
上のtshark出力のパケット(No.3 Hello)のpcapをダウンロード

ここで認証がリンク単位であることも確認できます。R2のshow ospf interfaceには2本のインタフェースが並びますが、R1向けのGi0/0/0/0にだけ認証の行があり、R3向けのGi0/0/0/1には同じ出力の中で1行も出ていません。R2 - R3の隣接は認証なしのまま維持されています。

R2 認証ありと認証なしのインタフェースが並ぶ(STEP 2)
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 1.1.1.1  (Backup Designated Router)
  Suppress hello for 0 neighbor(s)
  Keychain-based authentication enabled
    Keychain name KC-OSPF
    Key id used is 1
    Cryptographic algorithm HMAC_MD5_16
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never
GigabitEthernet0/0/0/1 is up, line protocol is up 
  Internet Address 10.2.3.2/24, Area 0, SID 0, Strict-SPF SID 0
  Label stack Primary label 0 Backup label 0 SRTE label 0
  Process ID 1, Router ID 2.2.2.2, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State DR, Priority 1, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Designated Router (ID) 2.2.2.2, Interface address 10.2.3.2
  Backup Designated router (ID) 3.3.3.3, Interface address 10.2.3.3
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:00:478
  Index 2/2, flood queue length 0
  Next 0(0)/0(0)
  Last flood scan length is 1, maximum is 2
  Last flood scan time is 0 msec, maximum is 0 msec
  LS Ack List: current length 0, high water mark 1
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 3.3.3.3  (Backup Designated Router)
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0

STEP 3:HMAC-SHA-256に変更する

鍵の文字列はそのままに、アルゴリズムだけを差し替えます。XRd 26.1.1のキーチェーンでは次のアルゴリズムが選べました。

キーチェーンで選べるアルゴリズム
AES-128-CMAC-96   HMAC-MD5      HMAC-SHA-256   HMAC-SHA1-12
HMAC-SHA1-20      HMAC-SHA1-96  MD5            SHA-1
STEP 3で投入した設定
(R1・R2の両方に投入する)
key chain KC-OSPF
 key 1
  cryptographic-algorithm HMAC-SHA-256

show ospf interfaceのアルゴリズム行が変わります。

R1 Gi0/0/0/0(HMAC-SHA-256。STEP 3)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Keychain-based authentication enabled
    Keychain name KC-OSPF
    Key id used is 1
    Cryptographic algorithm HMAC-SHA-256
  Multi-area interface Count is 0

パケット側ではAuth Crypt Data Lengthが16から32になります。

No.42 Hello(HMAC-SHA-256。Auth Crypt Data Length が 32)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 1.1.1.1
        Area ID: 0.0.0.0 (Backbone)
        Checksum: 0x0000 (None)
        Instance ID: Base IPv4 Unicast Instance (0)
        Auth Type: Cryptographic (2)
        Auth Crypt Key id: 1
        Auth Crypt Data Length: 32
        Auth Crypt Sequence Number: 1789106045
        Auth Crypt Data: 17dbf327138380c48f79512045ee29048f7f5ee887c0e9763eebbe8001fbdb67
    OSPF Hello Packet
        Network Mask: 255.255.255.0
        Hello Interval [sec]: 10
        Options: 0x12, (L) LLS Data block, (E) External Routing
            0... .... = DN: Not set
            .0.. .... = (O) Opaque: Not set
            ..0. .... = (DC) Demand Circuits: Not supported
            ...1 .... = (L) LLS Data block: Present
            .... 0... = (N) NSSA: Not supported
            .... .0.. = (MC) Multicast: Not capable
            .... ..1. = (E) External Routing: Capable
            .... ...0 = (MT) Multi-Topology Routing: No
        Router Priority: 1
        Router Dead Interval [sec]: 40
        Designated Router: 10.1.2.2
        Backup Designated Router: 10.1.2.1
        Active Neighbor: 2.2.2.2
    OSPF LLS Data Block
        Checksum: 0x0000
        LLS Data Length: 72 bytes
        Extended options TLV
            TLV Type: 1
            TLV Length: 4
            Options: 0x00000001, (LR) LSDB Resynchronization
                .... .... .... .... .... .... .... ..0. = (RS) Restart Signal: Not set
                .... .... .... .... .... .... .... ...1 = (LR) LSDB Resynchronization: Set
        Local Interface ID
            TLV Type: 18
            TLV Length: 4
            Local Interface ID: 00000004
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
        Crypto Authentication TLV
            TLV Type: 2
            TLV Length: 36
            Sequence number: 0x6aa3977d
            Auth Data: 3c03c25d0614f54b6bda0b649d28a32a8bf479c1178a294ac7707434999c7d5a
上のtshark出力のパケット(No.42 Hello)のpcapをダウンロード

ダイジェストが16バイト伸びるので、フレーム長そのものが154バイトから186バイトに増えます。切り替わりは14:54:26のHelloからで、隣接は落ちていません。

R1が送るHelloのフレーム長が154から186に変わる
   36 2026-09-11 14:53:57.562199     10.1.2.1 → 224.0.0.5    OSPF 154 Hello Packet
   38 2026-09-11 14:54:07.263721     10.1.2.1 → 224.0.0.5    OSPF 154 Hello Packet
   40 2026-09-11 14:54:16.344887     10.1.2.1 → 224.0.0.5    OSPF 154 Hello Packet
   42 2026-09-11 14:54:26.309415     10.1.2.1 → 224.0.0.5    OSPF 186 Hello Packet
   45 2026-09-11 14:54:36.189748     10.1.2.1 → 224.0.0.5    OSPF 186 Hello Packet

このとき両側の設定が揃わない時間がわずかに生まれます。今回はDeadインターバル(40秒)より早く両側の変更を終えられたため隣接が維持されました。運用では、次のSTEPと同じく鍵IDを分けて切り替えるほうが安全です。

STEP 4:鍵をローテーションする

運用で一番使うのがこれです。手順は2段階に分けます。いきなり送信鍵を変えると、相手がその鍵を受け付けられずに隣接が落ちるためです。

隣接を落とさずに鍵を入れ替える手順
1. 両側に新しい鍵を追加する。accept-lifetime だけ設定し、送信はまだ旧鍵のまま
2. 両側の送信を新しい鍵へ切り替える(新鍵に send-lifetime を設定し、旧鍵の send-lifetime を外す)
3. 旧鍵を削除する

まず鍵2を受信専用で両側に追加します。accept-lifetimeだけを書き、send-lifetimeは書きません。

STEP 4-1で投入した設定(受信だけ有効にする)
(R1・R2の両方に投入する)
key chain KC-OSPF
 key 2
  accept-lifetime 00:00:00 january 01 2020 infinite
  cryptographic-algorithm HMAC-SHA-256
  key-string clear ospfkey2

この時点で両側は「鍵1で送り、鍵1と鍵2のどちらでも受け取れる」状態です。次に送信を鍵2へ切り替えます。

STEP 4-2で投入した設定(送信を切り替える)
(R1・R2の両方に投入する)
key chain KC-OSPF
 key 2
  send-lifetime 00:00:00 january 01 2020 infinite
 !
 key 1
  no send-lifetime

show key chainを見ると、鍵1は受信専用(Send lifetime -- Not configured)、鍵2は送受信とも有効になっています

R1 show key chain(鍵が2本ある状態。STEP 4)
RP/0/RP0/CPU0:R1#show key chain
Fri Sep 11 06:00:19.100 UTC

Key-chain: KC-OSPF -

  timezone -- local
  Key 1 -- text "0700325C48021C1C46"
    Cryptographic-Algorithm -- HMAC_SHA_256
    Send lifetime -- Not configured
    Accept lifetime -- 00:00:00, 01 Jan 2020 - Always valid [Valid now]

  Key 2 -- text "000B001602500E1F5D"
    Cryptographic-Algorithm -- HMAC_SHA_256
    Send lifetime --  00:00:00, 01 Jan 2020 - Always valid  [Valid now]
    Accept lifetime -- 00:00:00, 01 Jan 2020 - Always valid [Valid now]

OSPF側の表示はKey id used is 2に変わります。

R1 Gi0/0/0/0(鍵2を使用中。STEP 4)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Keychain-based authentication enabled
    Keychain name KC-OSPF
    Key id used is 2
    Cryptographic algorithm HMAC-SHA-256
  Multi-area interface Count is 0

隣接は一度も落ちていません。 Neighbor is up forが12分を超えており、これはSTEP 1の復旧時点から継続していることを示します。MD5への変更もHMAC-SHA-256への変更も鍵の入れ替えも、この間に行っています。

R1 隣接は継続している(STEP 4)
RP/0/RP0/CPU0:R1#show ospf neighbor
Fri Sep 11 06:00:13.536 UTC

* Indicates MADJ interface
# Indicates Neighbor awaiting BFD session up

Neighbors for OSPF 1

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2         1     FULL/DR         00:00:31    10.1.2.2        GigabitEthernet0/0/0/0
    Neighbor is up for 00:12:09

Total neighbor count: 1

キャプチャーでも、R1が送るHelloのKey IDが14:58:26を境に1から2へ変わり、Helloの間隔は10秒のまま乱れていません。

R1が送るHelloの Key ID が 1 から 2 に変わる
frame.number	_ws.col.cls_time	ospf.auth.crypt.key_id	ospf.auth.crypt.data_length
1	2026-09-11 14:57:38.057345	1	32
3	2026-09-11 14:57:47.830721	1	32
5	2026-09-11 14:57:57.492035	1	32
7	2026-09-11 14:58:07.300398	1	32
9	2026-09-11 14:58:16.426431	1	32
11	2026-09-11 14:58:26.183293	2	32
13	2026-09-11 14:58:35.699347	2	32
15	2026-09-11 14:58:44.738048	2	32
17	2026-09-11 14:58:53.906863	2	32
19	2026-09-11 14:59:03.431175	2	32

切り替わった直後のパケットは次のようになります。

No.11 Hello(鍵2で送信)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 1.1.1.1
        Area ID: 0.0.0.0 (Backbone)
        Checksum: 0x0000 (None)
        Instance ID: Base IPv4 Unicast Instance (0)
        Auth Type: Cryptographic (2)
        Auth Crypt Key id: 2
        Auth Crypt Data Length: 32
        Auth Crypt Sequence Number: 1789106279
        Auth Crypt Data: 2a6a1e689084e5190b163af1c3f9141f1d325c227e7fb97d45dfacbf65d18db9
    OSPF Hello Packet
        Network Mask: 255.255.255.0
        Hello Interval [sec]: 10
        Options: 0x12, (L) LLS Data block, (E) External Routing
            0... .... = DN: Not set
            .0.. .... = (O) Opaque: Not set
            ..0. .... = (DC) Demand Circuits: Not supported
            ...1 .... = (L) LLS Data block: Present
            .... 0... = (N) NSSA: Not supported
            .... .0.. = (MC) Multicast: Not capable
            .... ..1. = (E) External Routing: Capable
            .... ...0 = (MT) Multi-Topology Routing: No
        Router Priority: 1
        Router Dead Interval [sec]: 40
        Designated Router: 10.1.2.2
        Backup Designated Router: 10.1.2.1
        Active Neighbor: 2.2.2.2
    OSPF LLS Data Block
        Checksum: 0x0000
        LLS Data Length: 72 bytes
        Extended options TLV
            TLV Type: 1
            TLV Length: 4
            Options: 0x00000001, (LR) LSDB Resynchronization
                .... .... .... .... .... .... .... ..0. = (RS) Restart Signal: Not set
                .... .... .... .... .... .... .... ...1 = (LR) LSDB Resynchronization: Set
        Local Interface ID
            TLV Type: 18
            TLV Length: 4
            Local Interface ID: 00000004
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
        Crypto Authentication TLV
            TLV Type: 2
            TLV Length: 36
            Sequence number: 0x6aa39867
            Auth Data: 01d3c53a9a853189b11c5b7d4afdb000869b2cea0321138318e1b39e6e249e07
上のtshark出力のパケット(No.11 Hello)のpcapをダウンロード

手順1を省いて先に送信鍵を変えると、相手はその鍵IDを知らないためパケットを捨て、Deadインターバルの満了で隣接が落ちます。受信を先に、送信を後にが鍵ローテーションの原則です。

STEP 5:エリア単位とインタフェース単位を併用する

R1のエリア0にエリア単位の認証を追加します。インタフェース単位のキーチェーン設定はそのままです。

STEP 5で投入した設定
(R1)
router ospf 1
 area 0
  authentication message-digest

両方が設定された状態になります。

R1 running-config(エリアとインタフェースの両方。STEP 5)
router ospf 1
 router-id 1.1.1.1
 area 0
  authentication message-digest
  interface Loopback0
   passive enable
  !
  interface GigabitEthernet0/0/0/0
   authentication keychain KC-OSPF
  !
 !
!

このときインタフェース単位が優先されます。表示はキーチェーンのままで、隣接も落ちません。エリア単位のmessage-digestはこのインタフェースには適用されませんでした。

R1 Gi0/0/0/0(インタフェース単位が優先。STEP 5)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Keychain-based authentication enabled
    Keychain name KC-OSPF
    Key id used is 2
    Cryptographic algorithm HMAC-SHA-256
  Multi-area interface Count is 0

STEP 6:認証を削除する

エリア単位とインタフェース単位の両方を外します。

STEP 6で投入した設定(最終状態)
(R1)
router ospf 1
 area 0
  no authentication message-digest
  interface GigabitEthernet0/0/0/0
   no authentication keychain KC-OSPF

(R2)
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   no authentication keychain KC-OSPF

認証の行が消え、STEP 0と同じ状態に戻ります。

R1 Gi0/0/0/0(認証なしに復帰。STEP 6)
  LS Ack List: current length 0, high water mark 3
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2  (Designated Router)
  Suppress hello for 0 neighbor(s)
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

設計上の注意

  • 平文認証は盗聴に対して無力です。 使うなら暗号認証にし、対向が対応していればHMAC-SHAを選びます
  • 鍵の入れ替えは受信を先、送信を後。 手順を守れば隣接を落とさずに交換できます
  • 片側だけの設定はDeadインターバルが切れるまでわかりません。 syslogにも認証エラーは出ずdead timer expiredとしか残らないので、隣接が落ちたら両端の設定を突き合わせます
  • send-lifetimeaccept-lifetimeは装置の時刻に依存します。 期間を区切って自動で切り替える運用にするなら、NTPで時刻を合わせておく必要があります

検証Configおよびshow結果

各STEPで3台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 6のもの)。

ファイル内容
..._show.txtshow version / show interface description / show route / show route ospf / show ospf / show ospf interface / show ospf interface brief / show ospf neighbor / show ospf neighbor detail / show ospf database / show ospf database router / show ospf database network / show ospf statistics interface / show ospf interface GigabitEthernet0/0/0/0 / show key chain
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)

STEP 0:認証なし — 認証の行が表示されない

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 1:平文認証を設定 — パスワードがキャプチャーに平文で見える。片側だけだと隣接が落ちる

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 2:MD5(キーチェーン)に変更Auth Crypt Data Length が 16。R2の隣のリンクは認証なしのまま

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 3:HMAC-SHA-256に変更Auth Crypt Data Length が 32 に変わる

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 4:鍵を追加してローテーションKey ID が 1 から 2 へ。隣接は落ちない

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 5:エリア単位の認証を併用 — インタフェース単位が優先される

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

STEP 6:認証を削除(最終状態) — 認証なしの状態へ復旧

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun

キャプチャーはR1 - R2間で、STEPをまとめて3本に分けて取得しました。

認証なしと平文認証(STEP 0〜1)のキャプチャーをダウンロード

MD5とHMAC-SHA-256(STEP 2〜3)のキャプチャーをダウンロード

鍵のローテーションと削除(STEP 4〜6)のキャプチャーをダウンロード

参考

RFCタイトル概要
RFC 2328OSPF Version 2認証の定義。AuTypeの値(Appendix A.3.1)と、AuType 0 / 1 / 2 それぞれの処理(Appendix D)。
RFC 5709OSPFv2 HMAC-SHA Cryptographic AuthenticationAuType 2の暗号認証をHMAC-SHAへ拡張する仕様。Auth Data Lenがアルゴリズムのダイジェスト長になることを定める。

関連記事