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

OSPFの認証

目次

OSPFの認証とは

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

認証はOSPFヘッダーの中で完結していて、AuType(2バイト)とAuthentication(8バイト)の2つのフィールドで 表現されます(RFC 2328 Appendix A.3.1)。 ヘッダーの構造はOSPFパケットの種類とヘッダーフォーマットで解説しています。

方式AuTypeAuthentication(8バイト)の中身
認証なし0使わない
平文認証1パスワードそのもの。 キャプチャーすれば読める
暗号認証2鍵ID・ダイジェストの長さ・シーケンス番号。ダイジェストはパケットの末尾に付く

平文認証のパスワードが入るのはこの8バイトだけです。9文字目以降は運ばれません。 暗号認証では8バイトに鍵の情報だけを入れ、鍵から計算したダイジェストをパケットの後ろに付けるので、 鍵そのものはネットワークに流れません。

認証はインタフェース単位に設定する

RFC 2328 Appendix D は、認証タイプをインタフェース単位(同じことですがネットワーク/サブネット単位)で 設定できると定めています。1台のルータでも、リンクごとに違う方式・違う鍵を使えます。

IOS XRでは、OSPFのインタフェース配下に書きます。

インタフェース単位(このリンクだけに効く)
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   authentication keychain KC-OSPF

エリア配下に書くと、そのエリアの全インタフェースの既定になります。インタフェース単位の設定があれば そちらが優先され、authentication null を書いたインタフェースだけを認証なしに戻せます。

エリア単位(そのエリアの全インタフェースに効く)
router ospf 1
 area 0
  authentication message-digest
  interface GigabitEthernet0/0/0/1
   authentication null

エリア単位は便利な反面、入れ忘れたリンクを落とします。 エリア内の一部のルータにだけ入れると、 入れた側は認証付きのHelloを送り、入れていない側はそれを捨てるので、そのリンクの隣接が切れます。

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

暗号認証の鍵は、OSPFの設定に直接書かずキーチェーンで管理します。1つのキーチェーンに複数の鍵を持たせ、 鍵ごとに「受信に使ってよい期間」と「送信に使ってよい期間」を別々に指定できます (RFC 2328 Appendix D の KeyStartAccept / KeyStartGenerate / KeyStopGenerate / KeyStopAccept)。

キーチェーンの設定(IOS XR)
key chain KC-OSPF
 key 1
  key-string clear <パスワード>
  cryptographic-algorithm HMAC-SHA-256
  accept-lifetime 00:00:00 january 01 2020 infinite
  send-lifetime 00:00:00 january 01 2020 infinite

アルゴリズムはダイジェストの長さを決めます。パケットの長さが変わるので、キャプチャーを見れば どちらを使っているか分かります。

アルゴリズムダイジェスト長規定
MD516バイトRFC 2328 Appendix D
HMAC-SHA-25632バイトRFC 5709

鍵IDはインタフェース単位で一意であればよく、両端で同じ番号・同じパスワード・同じアルゴリズムに そろえる必要があります。

鍵を足しただけでは送信に使われない

キーチェーンに新しい鍵を足しても、送信に使う鍵はすぐには変わりません。 RFC 2328 Appendix D.4.3 は、 送信には「送信可能な鍵のうち KeyStartGenerate が最も新しいもの」を使うと定めています。 送信の開始時刻が古い鍵と同じままなら、実装は古い鍵を使い続けます。

そのため、隣接を落とさずに鍵を入れ替える手順は受信が先、送信が後になります。

  1. 両端で新しい鍵を「受信だけ」許可する(accept-lifetime だけ書く)
  2. 両端の送信を新しい鍵へ切り替える(新しい鍵に send-lifetime を書き、古い鍵の送信を止める)

1 の時点ではどちらもまだ古い鍵で送っているので、何も起きません。2 で片方ずつ切り替えても、 相手は新旧どちらの鍵でも受け取れるため隣接は維持されます。

一致しないと隣接は落ちるが、落ちるまでには時間がかかる

認証が一致しないパケットは黙って捨てられます。 相手に「認証が違う」と伝える仕組みはありません。 Helloが届かなくなるので、Deadインターバル(既定40秒)が満了して初めて隣接が落ちます。

このとき、次の2つは別の時間です。

  • 隣接が落ちるまで: Deadインターバルの満了待ち。秒の単位
  • 転送が切り替わるまで: 隣接が落ちた後のSPF計算とFIB更新。ミリ秒の単位

壊れる向きが片方だけの場合(自分が送るパケットだけ相手に捨てられる場合)は、相手のDeadだけが満了します。 自分は相手のHelloを受け取り続けますが、そのHelloの隣接リストから自分が消えるため、隣接は双方向ではなくなり INITに落ちます。

検証構成

IOS XR(XRd 26.1.1)4台で、R1 - R2 のリンクにだけ認証を設定します。R2 - R3 は認証なしのままにして、 インタフェース単位であることの対照にします。R1 - R4 - R2 はコスト10の迂回路で、R1 - R2 が落ちたときの 転送の切り替え先です。

OSPF認証の検証構成
ルータルータID管理IP役割
R11.1.1.110.19.3.59認証を設定する側
R22.2.2.210.19.3.60対向。R3向けは認証なしのまま
R33.3.3.310.19.3.64認証なしのリンクの先。疎通の測定にも使う
R44.4.4.410.19.3.65迂回路(コスト10)

検証は13段階で進めます。

|STEP|操作|確かめること| |0|初期状態(認証なし)|認証の行が出ない。R1 → R3 は R2 経由| |1|R1 側だけ平文認証を入れる|不一致。隣接が落ちるまでの時間と、転送が迂回へ移るまでの時間| |2|R2 側にも同じパスワードを入れる|復旧。パスワードがキャプチャーでそのまま読める| |3|両側をキーチェーン(MD5、鍵1)へ|ダイジェスト長が 16| |4|鍵1のアルゴリズムを HMAC-SHA-256 へ|ダイジェスト長が 32 に変わる| |5|R1 に鍵2を足す(送受信とも有効)|送信鍵は鍵1のまま。隣接は落ちない| |6|R1 で鍵1の送信を止める|R1 が鍵2で送り始め、R2 は知らないので不一致| |7|R1 で鍵1の送信を戻す|復旧| |8|R2 に鍵2を受信だけ許可して足す|隣接は落ちない。送信鍵も変わらない| |9|両端の送信を鍵2へ切り替える|Key id が 1 → 2。隣接は落ちない| |10|4台すべてにエリア単位の認証を足す|キーチェーンの無いリンクにも Key id 0 の認証が付く| |11|例外のリンクに authentication null を入れる|そのリンクだけ認証なしに戻る| |12|認証とキーチェーンを削除する(最終状態)|初期状態へ復旧|

以降の節はSTEP順ではなく、確かめる内容ごとにまとめています。

平文認証はパスワードがそのまま流れる

STEP 1で、R1のGi0/0/0/0にだけ平文認証を入れます。authentication-key がパスワード、authentication が 方式の指定(AuType 1)です。running-configではパスワードが暗号化されて表示されます。

STEP 1:R1 だけに平文認証を入れる
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Sep 28 02:46:38.634 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   authentication-key encrypted 000F121C1157040100325C48
   authentication
  !
 !
!
end

この時点でR1とR2の認証は一致しません。両方向とも壊れるので、両側のDeadが満了して両側が隣接の消滅を 記録します。R2は commit の 30.1秒後、R1は32.0秒後でした。

STEP 1:R1 のsyslog
RP/0/RP0/CPU0:Sep 28 02:46:40.464 UTC: ssh_syslog_proxy[1188]: %SECURITY-SSHD_SYSLOG_PRX-6-INFO_GENERAL : sshd[6794]: Disconnected from user cisco 10.20.1.1 port 40876 
RP/0/RP0/CPU0:Sep 28 02:47:10.133 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 
STEP 1:R2 のsyslog
RP/0/RP0/CPU0:Sep 28 02:45:07.920 UTC: ssh_syslog_proxy[1188]: %SECURITY-SSHD_SYSLOG_PRX-6-INFO_GENERAL : sshd[6377]: Disconnected from user cisco 10.20.1.1 port 38838 
RP/0/RP0/CPU0:Sep 28 02:47:08.266 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 1.1.1.1 on GigabitEthernet0/0/0/0 in area 0 from FULL to DOWN, Neighbor Down: dead timer expired, vrf default vrfid 0x60000000 

転送のほうは桁が違います。 R3から1.1.1.1へ100ミリ秒間隔で900発のpingを流したまま設定を変えましたが、 ロスは0発(900/900)でした。R1 - R2 を通った最後のICMPと、迂回路の R1 - R4 を通った最初のICMPの差は 99.7ミリ秒で、ping1発分の間に切り替わっています。

STEP 1:R1 - R2 を通った最後のICMP(切り替えの前後 0.7 秒)
2026-09-28T11:47:08.052496000+0900	3.3.3.3	1.1.1.1	351
2026-09-28T11:47:08.054700000+0900	1.1.1.1	3.3.3.3	351
2026-09-28T11:47:08.152576000+0900	3.3.3.3	1.1.1.1	352
2026-09-28T11:47:08.154623000+0900	1.1.1.1	3.3.3.3	352
2026-09-28T11:47:08.253070000+0900	3.3.3.3	1.1.1.1	353
2026-09-28T11:47:08.255245000+0900	1.1.1.1	3.3.3.3	353
2026-09-28T11:47:08.353982000+0900	3.3.3.3	1.1.1.1	354
2026-09-28T11:47:08.356487000+0900	1.1.1.1	3.3.3.3	354
STEP 1:R1 - R4(迂回路)を通った最初のICMP(同じ 0.7 秒)
2026-09-28T11:47:08.456223000+0900	3.3.3.3	1.1.1.1	355
2026-09-28T11:47:08.458460000+0900	1.1.1.1	3.3.3.3	355
2026-09-28T11:47:08.556514000+0900	3.3.3.3	1.1.1.1	356
2026-09-28T11:47:08.558910000+0900	1.1.1.1	3.3.3.3	356
2026-09-28T11:47:08.657181000+0900	3.3.3.3	1.1.1.1	357
2026-09-28T11:47:08.659706000+0900	1.1.1.1	3.3.3.3	357

STEP 2でR2にも同じパスワードを入れると隣接が戻ります。このときのHelloをキャプチャーすると、 パスワードがそのまま入っています。

STEP 2:両側に平文認証を入れた後のHello(R1 → R2)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 44
        Source OSPF Router: 1.1.1.1
        Area ID: 0.0.0.0 (Backbone)
        Checksum: 0xea9b [correct]
        Instance ID: Base IPv4 Unicast Instance (0)
        Auth Type: Simple password (1)
        Auth Data (Simple): kazulogo
    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: 0.0.0.0
        Backup Designated Router: 0.0.0.0
    OSPF LLS Data Block
        Checksum: 0x7fc6
        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: 00000002
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
上のtshark出力のパケット(Hello)のpcapをダウンロード

設定したパスワードはkazulogospf(11文字)ですが、出ているのは kazulogo(8文字) です。 Authenticationフィールドが8バイトしかないためで、9文字目以降は運ばれません。 両端とも同じ8バイトになるので隣接は成立しますが、9文字目以降は認証の強度に寄与しません。

暗号認証のダイジェストは方式で長さが変わる

STEP 3で、両側をキーチェーンによる暗号認証(MD5、鍵1)へ変更します。平文認証のauthentication-keyを 外し、authentication keychainに置き換えます。

STEP 3:R1 をキーチェーン(MD5)へ変更する
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Sep 28 02:59:44.705 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
key chain KC-OSPF
 key 1
  accept-lifetime 00:00:00 january 01 2020 infinite
  key-string password 0118071E4E0709082A495758
  send-lifetime 00:00:00 january 01 2020 infinite
  cryptographic-algorithm MD5
 !
!
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   no authentication-key encrypted 000F121C1157040100325C48
   authentication keychain KC-OSPF
  !
 !
!
end

HelloはAuth Type: Cryptographic (2)になり、8バイトのフィールドにはAuth Crypt Key id(鍵ID)と Auth Crypt Data Length(ダイジェストの長さ)が入ります。ダイジェスト(Auth Crypt Data)は OSPFパケットの後ろに付いていて、長さは16バイトです。

STEP 3:MD5のHello(R1 → R2)
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: 1790564360
        Auth Crypt Data: 10a3f63aeeef318548fc9aad2d2bcd6f
    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: 0.0.0.0
        Backup Designated Router: 0.0.0.0
        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: 00000002
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
        Crypto Authentication TLV
            TLV Type: 2
            TLV Length: 20
            Sequence number: 0x6ab9d808
            Auth Data: 8401e287670f622907126fed5eaf7ee4
上のtshark出力のパケット(MD5のHello)のpcapをダウンロード

STEP 4で鍵1のアルゴリズムをHMAC-SHA-256に変えると、同じ鍵IDのままAuth Crypt Data Lengthが 32バイトになり、Auth Crypt Dataも倍の長さになります。

STEP 4:HMAC-SHA-256のHello(R1 → R2)
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: 1790564668
        Auth Crypt Data: 7c7534fc8fdbeca415aca46a2c82479f2773c08beff2916c56e01dfafb2bfc59
    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: 0.0.0.0
        Backup Designated Router: 0.0.0.0
        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: 00000002
        Unknown LLS TLV
            TLV Type: 32768
            TLV Length: 8
        Crypto Authentication TLV
            TLV Type: 2
            TLV Length: 36
            Sequence number: 0x6ab9d93c
            Auth Data: 009d37ffd911e8a06bd1f435e6a75f24d543db1016965afbd1d39faf5fc9872e
上のtshark出力のパケット(HMAC-SHA-256のHello)のpcapをダウンロード

装置側では、どの方式が有効かをshow ospf interfaceで確認できます。キーチェーンを使っている場合は Keychain-based authentication enabledです。

STEP 4:R1 の show ospf interface GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:R1#show ospf interface GigabitEthernet0/0/0/0
Mon Sep 28 03:07:46.736 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.0.12.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 POINT_TO_POINT, Cost: 1
  Transmit Delay is 1 sec, State POINT_TO_POINT, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:01:400
  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 2
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 2.2.2.2
  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
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

鍵を足しても送信鍵は変わらない

STEP 5で、R1にだけ鍵2(HMAC-SHA-256)を足します。受信も送信も有効にしてあります。

STEP 5:R1 に鍵2を足す(送受信とも有効)
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Sep 28 03:10:19.920 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
key chain KC-OSPF
 key 2
  accept-lifetime 00:00:00 january 01 2020 infinite
  key-string password 070420565B0516021C17125E
  send-lifetime 00:00:00 january 01 2020 infinite
  cryptographic-algorithm HMAC-SHA-256
 !
!
end

show key chainでは、鍵1・鍵2とも送信・受信の両方が[Valid now]です。

STEP 5:R1 の show key chain
RP/0/RP0/CPU0:R1#show key chain
Mon Sep 28 03:12:57.531 UTC

Key-chain: KC-OSPF -

  timezone -- local
  Key 1 -- text "0118071E4E0709082A495758"
    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]

  Key 2 -- text "070420565B0516021C17125E"
    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]

それでもR1が送るHelloは鍵1のままです。このSTEPでR1が送った全Helloの鍵IDとダイジェスト長を並べても、 1と32しか出てきません。

STEP 5:R1 が送ったHelloの鍵IDとダイジェスト長(全数)
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32
1	32

STEP 6で鍵1の送信だけを止めると、R1は鍵2で送り始めます。R2は鍵2を知らないので、ここで初めて不一致に なります。

STEP 6:R1 で鍵1の送信を止める
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Sep 28 03:15:28.657 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
key chain KC-OSPF
 key 1
  no send-lifetime 00:00:00 january 01 2020 infinite
 !
!
end

壊れるのはR1 → R2 の向きだけです。R1はR2のHelloを受け取り続けるのでDeadは満了せず、 相手の隣接リストから自分が消えることでINITに落ちます。隣接の消滅を記録するのはR2だけで、 commitから39.6秒後でした。両方向が壊れたSTEP 1の30.1秒より遅いのは、R2のDeadが 「R1が最後に鍵1で送ったHello」から数え始めるためで、Hello間隔(10秒)のぶん後ろにずれます。

STEP 6:R2 のsyslog
RP/0/RP0/CPU0:Sep 28 03:13:56.659 UTC: ssh_syslog_proxy[1188]: %SECURITY-SSHD_SYSLOG_PRX-6-INFO_GENERAL : sshd[11959]: Disconnected from user cisco 10.20.1.1 port 43294 
RP/0/RP0/CPU0:Sep 28 03:16:07.784 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 1.1.1.1 on GigabitEthernet0/0/0/0 in area 0 from FULL to DOWN, Neighbor Down: dead timer expired, vrf default vrfid 0x60000000 

STEP 7で鍵1の送信を戻すと復旧します。

無停止で鍵を切り替える

正しい手順は、受信を先に、送信を後にです。STEP 8では、R2に鍵2をaccept-lifetimeだけ付けて足します。 送信の期間を書かないので、R2は鍵2を受け取れるようになるだけで、送信には使いません。

STEP 8:R2 に鍵2を受信だけ許可して足す
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Mon Sep 28 03:28:26.328 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
key chain KC-OSPF
 key 2
  accept-lifetime 00:00:00 january 01 2020 infinite
  key-string password 000F121C115704010424551C
  cryptographic-algorithm HMAC-SHA-256
 !
!
end

この時点で両端とも鍵1で送り、鍵1・鍵2の両方を受け取れる状態です。STEP 9で両端の送信を鍵2へ移します。

STEP 9:R1 の送信を鍵2へ切り替える
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Sep 28 03:33:10.518 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
key chain KC-OSPF
 key 1
  no send-lifetime 00:00:00 january 01 2020 infinite
 !
 key 2
  send-lifetime 00:00:00 january 01 2020 infinite
 !
!
end

R1が送るHelloの鍵IDは、切り替えの時刻を境に1から2へ変わります。

STEP 9:R1 が送ったHelloの鍵ID(時刻つき、全数)
2026-09-28T12:33:01.245449000+0900	1
2026-09-28T12:33:10.819064000+0900	2
2026-09-28T12:33:20.442057000+0900	2
2026-09-28T12:33:30.209365000+0900	2
2026-09-28T12:33:39.606135000+0900	2
2026-09-28T12:33:48.883604000+0900	2
2026-09-28T12:33:58.670707000+0900	2
2026-09-28T12:34:08.334187000+0900	2
2026-09-28T12:34:17.612667000+0900	2
2026-09-28T12:34:27.417014000+0900	2
2026-09-28T12:34:36.669876000+0900	2
2026-09-28T12:34:46.329512000+0900	2
2026-09-28T12:34:56.223066000+0900	2
2026-09-28T12:35:05.839839000+0900	2
2026-09-28T12:35:15.746548000+0900	2
2026-09-28T12:35:24.953261000+0900	2
2026-09-28T12:35:34.319100000+0900	2
2026-09-28T12:35:44.173105000+0900	2
2026-09-28T12:35:54.010739000+0900	2
2026-09-28T12:36:03.973249000+0900	2
2026-09-28T12:36:13.218704000+0900	2
2026-09-28T12:36:22.220105000+0900	2
2026-09-28T12:36:31.637461000+0900	2
2026-09-28T12:36:41.218468000+0900	2
2026-09-28T12:36:50.907313000+0900	2
2026-09-28T12:37:00.266247000+0900	2
2026-09-28T12:37:09.840607000+0900	2
2026-09-28T12:37:18.978877000+0900	2
2026-09-28T12:37:28.966898000+0900	2
2026-09-28T12:37:38.648102000+0900	2
2026-09-28T12:37:48.629419000+0900	2
2026-09-28T12:37:58.292910000+0900	2
2026-09-28T12:38:08.220736000+0900	2
2026-09-28T12:38:17.511246000+0900	2
2026-09-28T12:38:26.701885000+0900	2
2026-09-28T12:38:35.837746000+0900	2
2026-09-28T12:38:45.400570000+0900	2
2026-09-28T12:38:54.654058000+0900	2
2026-09-28T12:39:03.893012000+0900	2
2026-09-28T12:39:13.716348000+0900	2

このSTEPでは隣接の状態は一度も変化しません。 R1のsyslogにはADJCHGが1件も出ず、R3から1.1.1.1への pingも900発すべて応答があります。受信を先に許可してあるので、送信側がずれている間も相手は受け取れます。

エリア単位の認証はエリア全体に効く

STEP 10で、4台すべてのエリア0にauthentication message-digestを足します。キーチェーンを設定していない R2 - R3 のリンクにも認証が付きます。

STEP 10:R3 にエリア単位の認証を足す
RP/0/RP0/CPU0:R3#show configuration commit changes last 1
Mon Sep 28 03:39:50.326 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
 area 0
  authentication message-digest
 !
!
end

このリンクのHelloはAuth Type: Cryptographic (2)になり、Auth Crypt Key idは0、 Auth Crypt Data Lengthは16バイト(MD5)です。鍵を設定していないので鍵IDが0になります。

STEP 10:R2 - R3 のHello(R3 → R2)
Open Shortest Path First
    OSPF Header
        Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 3.3.3.3
        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: 0
        Auth Crypt Data Length: 16
        Auth Crypt Sequence Number: 1790566706
        Auth Crypt Data: faf5961b72f123231828f7f085faad5e
    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: 0.0.0.0
        Backup Designated Router: 0.0.0.0
        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: 0x6ab9e132
            Auth Data: 17f6fe60a307b1f1826750a2c03304b9
上のtshark出力のパケット(エリア単位の認証のHello)のpcapをダウンロード

装置側の表示もMessage digest authentication enabledに変わります。

STEP 10:R3 の show ospf interface GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:R3#show ospf interface GigabitEthernet0/0/0/0
Mon Sep 28 03:43:51.673 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.0.23.3/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 3.3.3.3, Network Type POINT_TO_POINT, Cost: 1
  Transmit Delay is 1 sec, State POINT_TO_POINT, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:07:223
  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
  Suppress hello for 0 neighbor(s)
  Message digest authentication enabled
      No key configured, using default key id 0
  Multi-area interface Count is 0
  Segment Routing Forwarding MPLS enabled: Yes
  Adjacency hold timer expired last : Never
  Exchange timer expired last : Never

4台すべてに入れたのでどのリンクも落ちませんが、一部のルータにだけ入れると、入れていない側のリンクが 落ちます。 例外を作るには、そのインタフェースにauthentication nullを書きます。

STEP 11:R3 のインタフェースを認証なしに戻す
RP/0/RP0/CPU0:R3#show configuration commit changes last 1
Mon Sep 28 03:45:18.859 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/0
   authentication null
  !
 !
!
end

HelloのAuTypeは、このコマンドを入れた直後のHelloから0に戻ります。

STEP 11:R3 が送ったHelloのAuType(時刻つき、全数)
2026-09-28T12:45:06.032688000+0900	2
2026-09-28T12:45:15.421528000+0900	2
2026-09-28T12:45:25.328700000+0900	0
2026-09-28T12:45:34.637104000+0900	0
2026-09-28T12:45:44.471771000+0900	0
2026-09-28T12:45:54.320344000+0900	0
2026-09-28T12:46:03.679524000+0900	0
2026-09-28T12:46:13.305059000+0900	0
2026-09-28T12:46:23.234325000+0900	0
2026-09-28T12:46:33.116943000+0900	0
2026-09-28T12:46:42.690442000+0900	0
2026-09-28T12:46:52.045485000+0900	0
2026-09-28T12:47:01.994242000+0900	0
2026-09-28T12:47:11.710785000+0900	0
2026-09-28T12:47:21.160445000+0900	0
2026-09-28T12:47:30.192371000+0900	0
2026-09-28T12:47:39.521840000+0900	0
2026-09-28T12:47:48.647714000+0900	0
2026-09-28T12:47:58.331103000+0900	0
2026-09-28T12:48:08.290733000+0900	0
2026-09-28T12:48:18.188155000+0900	0
2026-09-28T12:48:27.972574000+0900	0
2026-09-28T12:48:37.708370000+0900	0
2026-09-28T12:48:47.070248000+0900	0
2026-09-28T12:48:56.814595000+0900	0
2026-09-28T12:49:06.523888000+0900	0
2026-09-28T12:49:16.021777000+0900	0
2026-09-28T12:49:25.921430000+0900	0
2026-09-28T12:49:35.129437000+0900	0
2026-09-28T12:49:44.398471000+0900	0
2026-09-28T12:49:53.472347000+0900	0
2026-09-28T12:50:03.370638000+0900	0
2026-09-28T12:50:12.677707000+0900	0

装置側の表示からも認証の行が消えます(STEP 10で出ていたMessage digest authentication enabledが無い)。

STEP 11:R3 の show ospf interface GigabitEthernet0/0/0/0
RP/0/RP0/CPU0:R3#show ospf interface GigabitEthernet0/0/0/0
Mon Sep 28 03:49:17.003 UTC

GigabitEthernet0/0/0/0 is up, line protocol is up 
  Internet Address 10.0.23.3/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 3.3.3.3, Network Type POINT_TO_POINT, Cost: 1
  Transmit Delay is 1 sec, State POINT_TO_POINT, MTU 1500, MaxPktSz 1500
  Forward reference No, Unnumbered no,  Bandwidth 1000000 
  RIB LC sync Yes
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:08:144
  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
  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

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow一式(show version / show interface description / show route / show route ospf / show ospf / show ospf interface / show ospf neighbor / show ospf database / show key chain / show ospf interface GigabitEthernet0/0/0/0 など)
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txtそのSTEPでのpingとtraceroute
..._trace.txtshow ospf trace events
..._clear.txt採取前にクリアしたカウンタの記録
..._commit.cfgそのSTEPで実際にcommitされた設定だけ(show configuration commit changes last 1)。設定を変えたルータの分だけ
..._outage.txt設定変更をまたいで流したping(100ミリ秒間隔で900発)。断を測るため、設定を変える前に開始している

STEP 0:初期状態(認証なし)

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclear——
R2showlogrun—traceclear——
R3showlogrunpingtraceclear——
R4showlogrun—traceclear——

STEP 1:R1 側だけ平文認証を入れる

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclear——
R3showlogrunpingtraceclear—outage
R4showlogrun—traceclear——

STEP 2:R2 側にも同じパスワードを入れる

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclear——
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclear—outage
R4showlogrun—traceclear——

STEP 3:両側をキーチェーン(MD5、鍵1)へ

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclear——
R4showlogrun—traceclear——

STEP 4:鍵1のアルゴリズムを HMAC-SHA-256 へ

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclear——
R4showlogrun—traceclear——

STEP 5:R1 に鍵2を足す(送受信とも有効)

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclear——
R3showlogrunpingtraceclear——
R4showlogrun—traceclear——

STEP 6:R1 で鍵1の送信を止める

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclear——
R3showlogrunpingtraceclear—outage
R4showlogrun—traceclear——

STEP 7:R1 で鍵1の送信を戻す

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclear——
R3showlogrunpingtraceclear—outage
R4showlogrun—traceclear——

STEP 8:R2 に鍵2を受信だけ許可して足す

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclear——
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclear——
R4showlogrun—traceclear——

STEP 9:両端の送信を鍵2へ切り替える

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclear—outage
R4showlogrun—traceclear——

STEP 10:4台すべてにエリア単位の認証を足す

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclearcommit—
R4showlogrun—traceclearcommit—

STEP 11:例外のリンクに authentication null を入れる

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclearcommit—
R4showlogrun—traceclearcommit—

STEP 12:認証とキーチェーンを削除する(最終状態)(最終状態)

ルータshow出力syslogrunning-configpingtraceclearcommit断の測定
R1showlogrunpingtraceclearcommit—
R2showlogrun—traceclearcommit—
R3showlogrunpingtraceclearcommit—
R4showlogrun—traceclearcommit—

パケットキャプチャーはSTEPごとに、3つの区間で取得しています。

STEPR1-R2間(認証あり)R2-R3間(認証なし)R1-R4間(迂回路)
0pcappcappcap
1pcappcappcap
2pcappcappcap
3pcappcappcap
4pcappcappcap
5pcappcappcap
6pcappcappcap
7pcappcappcap
8pcappcappcap
9pcappcappcap
10pcappcappcap
11pcappcappcap
12pcappcappcap

設計上の注意

  • 平文認証は盗聴に対して無力です。 パスワードがそのまま流れるうえ、8バイトしか運ばれません。使うなら暗号認証にします
  • 鍵の入れ替えは受信が先、送信が後。 順序を守れば隣接を落とさずに交換できます
  • 不一致はsyslogに理由が出ません。 残るのはdead timer expiredだけなので、隣接が落ちたら両端の設定を突き合わせます
  • send-lifetimeとaccept-lifetimeは装置の時刻に依存します。 期間を区切って自動で切り替える運用にするなら、NTPで時刻を合わせておく必要があります

参考

RFCタイトル概要
RFC 2328OSPF Version 2認証の定義。AuTypeとAuthenticationフィールド(Appendix A.3.1)、AuType 0 / 1 / 2 の処理と鍵の4つの時刻(Appendix D、D.4.3)。
RFC 5709OSPFv2 HMAC-SHA Cryptographic AuthenticationAuType 2をHMAC-SHAへ拡張する仕様。ダイジェスト長がアルゴリズムの出力長になることを定める。

関連記事