OSPFの認証とは
OSPFの認証は、同じリンクにつながった相手が正しいかどうかを確かめる仕組みです。認証を設定していないOSPFは、 届いたHelloの送信元を検証しません。同じセグメントに機器をつないでHelloを流せば、それだけで隣接が成立し、 LSAが流れ込みます。
認証はOSPFヘッダーの中で完結していて、AuType(2バイト)とAuthentication(8バイト)の2つのフィールドで
表現されます(RFC 2328 Appendix A.3.1)。
ヘッダーの構造はOSPFパケットの種類とヘッダーフォーマットで解説しています。
| 方式 | AuType | Authentication(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)。
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アルゴリズムはダイジェストの長さを決めます。パケットの長さが変わるので、キャプチャーを見れば どちらを使っているか分かります。
| アルゴリズム | ダイジェスト長 | 規定 |
|---|---|---|
| MD5 | 16バイト | RFC 2328 Appendix D |
| HMAC-SHA-256 | 32バイト | RFC 5709 |
鍵IDはインタフェース単位で一意であればよく、両端で同じ番号・同じパスワード・同じアルゴリズムに そろえる必要があります。
鍵を足しただけでは送信に使われない
キーチェーンに新しい鍵を足しても、送信に使う鍵はすぐには変わりません。 RFC 2328 Appendix D.4.3 は、 送信には「送信可能な鍵のうち KeyStartGenerate が最も新しいもの」を使うと定めています。 送信の開始時刻が古い鍵と同じままなら、実装は古い鍵を使い続けます。
そのため、隣接を落とさずに鍵を入れ替える手順は受信が先、送信が後になります。
- 両端で新しい鍵を「受信だけ」許可する(
accept-lifetimeだけ書く) - 両端の送信を新しい鍵へ切り替える(新しい鍵に
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 が落ちたときの 転送の切り替え先です。
| ルータ | ルータID | 管理IP | 役割 |
|---|---|---|---|
| R1 | 1.1.1.1 | 10.19.3.59 | 認証を設定する側 |
| R2 | 2.2.2.2 | 10.19.3.60 | 対向。R3向けは認証なしのまま |
| R3 | 3.3.3.3 | 10.19.3.64 | 認証なしのリンクの先。疎通の測定にも使う |
| R4 | 4.4.4.4 | 10.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ではパスワードが暗号化されて表示されます。
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秒後でした。
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 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発分の間に切り替わっています。
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 3542026-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 357STEP 2でR2にも同じパスワードを入れると隣接が戻ります。このときのHelloをキャプチャーすると、 パスワードがそのまま入っています。
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設定したパスワードはkazulogospf(11文字)ですが、出ているのは kazulogo(8文字) です。
Authenticationフィールドが8バイトしかないためで、9文字目以降は運ばれません。
両端とも同じ8バイトになるので隣接は成立しますが、9文字目以降は認証の強度に寄与しません。
暗号認証のダイジェストは方式で長さが変わる
STEP 3で、両側をキーチェーンによる暗号認証(MD5、鍵1)へ変更します。平文認証のauthentication-keyを
外し、authentication keychainに置き換えます。
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
!
!
!
endHelloはAuth Type: Cryptographic (2)になり、8バイトのフィールドにはAuth Crypt Key id(鍵ID)と
Auth Crypt Data Length(ダイジェストの長さ)が入ります。ダイジェスト(Auth Crypt Data)は
OSPFパケットの後ろに付いていて、長さは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: 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: 8401e287670f622907126fed5eaf7ee4STEP 4で鍵1のアルゴリズムをHMAC-SHA-256に変えると、同じ鍵IDのままAuth Crypt Data Lengthが
32バイトになり、Auth Crypt Dataも倍の長さになります。
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装置側では、どの方式が有効かをshow ospf interfaceで確認できます。キーチェーンを使っている場合は
Keychain-based authentication enabledです。
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)を足します。受信も送信も有効にしてあります。
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
!
!
endshow key chainでは、鍵1・鍵2とも送信・受信の両方が[Valid now]です。
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しか出てきません。
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 32STEP 6で鍵1の送信だけを止めると、R1は鍵2で送り始めます。R2は鍵2を知らないので、ここで初めて不一致に なります。
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秒)のぶん後ろにずれます。
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を受け取れるようになるだけで、送信には使いません。
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へ移します。
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
!
!
endR1が送るHelloの鍵IDは、切り替えの時刻を境に1から2へ変わります。
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 のリンクにも認証が付きます。
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になります。
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装置側の表示もMessage digest authentication enabledに変わります。
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 : Never4台すべてに入れたのでどのリンクも落ちませんが、一部のルータにだけ入れると、入れていない側のリンクが
落ちます。 例外を作るには、そのインタフェースにauthentication nullを書きます。
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
!
!
!
endHelloのAuTypeは、このコマンドを入れた直後のHelloから0に戻ります。
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が無い)。
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.txt | show一式(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.txt | show ospf trace events |
..._clear.txt | 採取前にクリアしたカウンタの記録 |
..._commit.cfg | そのSTEPで実際にcommitされた設定だけ(show configuration commit changes last 1)。設定を変えたルータの分だけ |
..._outage.txt | 設定変更をまたいで流したping(100ミリ秒間隔で900発)。断を測るため、設定を変える前に開始している |
STEP 0:初期状態(認証なし)
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | — | — |
| R2 | show | log | run | — | trace | clear | — | — |
| R3 | show | log | run | ping | trace | clear | — | — |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 1:R1 側だけ平文認証を入れる
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | — | — |
| R3 | show | log | run | ping | trace | clear | — | outage |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 2:R2 側にも同じパスワードを入れる
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | — | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | — | outage |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 3:両側をキーチェーン(MD5、鍵1)へ
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | — | — |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 4:鍵1のアルゴリズムを HMAC-SHA-256 へ
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | — | — |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 5:R1 に鍵2を足す(送受信とも有効)
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | — | — |
| R3 | show | log | run | ping | trace | clear | — | — |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 6:R1 で鍵1の送信を止める
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | — | — |
| R3 | show | log | run | ping | trace | clear | — | outage |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 7:R1 で鍵1の送信を戻す
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | — | — |
| R3 | show | log | run | ping | trace | clear | — | outage |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 8:R2 に鍵2を受信だけ許可して足す
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | — | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | — | — |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 9:両端の送信を鍵2へ切り替える
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | — | outage |
| R4 | show | log | run | — | trace | clear | — | — |
STEP 10:4台すべてにエリア単位の認証を足す
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | commit | — |
| R4 | show | log | run | — | trace | clear | commit | — |
STEP 11:例外のリンクに authentication null を入れる
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | commit | — |
| R4 | show | log | run | — | trace | clear | commit | — |
STEP 12:認証とキーチェーンを削除する(最終状態)(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | clear | commit | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | clear | commit | — |
| R2 | show | log | run | — | trace | clear | commit | — |
| R3 | show | log | run | ping | trace | clear | commit | — |
| R4 | show | log | run | — | trace | clear | commit | — |
パケットキャプチャーはSTEPごとに、3つの区間で取得しています。
| STEP | R1-R2間(認証あり) | R2-R3間(認証なし) | R1-R4間(迂回路) |
|---|---|---|---|
| 0 | pcap | pcap | pcap |
| 1 | pcap | pcap | pcap |
| 2 | pcap | pcap | pcap |
| 3 | pcap | pcap | pcap |
| 4 | pcap | pcap | pcap |
| 5 | pcap | pcap | pcap |
| 6 | pcap | pcap | pcap |
| 7 | pcap | pcap | pcap |
| 8 | pcap | pcap | pcap |
| 9 | pcap | pcap | pcap |
| 10 | pcap | pcap | pcap |
| 11 | pcap | pcap | pcap |
| 12 | pcap | pcap | pcap |
設計上の注意
- 平文認証は盗聴に対して無力です。 パスワードがそのまま流れるうえ、8バイトしか運ばれません。使うなら暗号認証にします
- 鍵の入れ替えは受信が先、送信が後。 順序を守れば隣接を落とさずに交換できます
- 不一致はsyslogに理由が出ません。 残るのは
dead timer expiredだけなので、隣接が落ちたら両端の設定を突き合わせます send-lifetimeとaccept-lifetimeは装置の時刻に依存します。 期間を区切って自動で切り替える運用にするなら、NTPで時刻を合わせておく必要があります
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 2328 | OSPF Version 2 | 認証の定義。AuTypeとAuthenticationフィールド(Appendix A.3.1)、AuType 0 / 1 / 2 の処理と鍵の4つの時刻(Appendix D、D.4.3)。 |
| RFC 5709 | OSPFv2 HMAC-SHA Cryptographic Authentication | AuType 2をHMAC-SHAへ拡張する仕様。ダイジェスト長がアルゴリズムの出力長になることを定める。 |
関連記事
- OSPFとは
- OSPFのルータID
- OSPFのルータIDが重複したときの挙動
- OSPFパケットの種類とヘッダーフォーマット
- OSPFの認証
- OSPFの状態遷移
- OSPF Optionsフィールド
- OSPFのDRとBDR
- OSPF ネットワークタイプ
- OSPFのコスト(メトリック)
- OSPFのECMP(等コストマルチパス)
- OSPFの外部経路(スタティックの再配布)
- OSPFのRFC1583互換(外部経路の選択規則)
- OSPFのAS外部経路のForwarding Address
- OSPFのマルチエリアとABR
- OSPFのバーチャルリンク
- OSPFのスタブエリアとトータリースタブエリア
- OSPFのNSSAとトータリーNSSA
- OSPFのデフォルトルート
- OSPFの経路集約
- OSPFのLSAとLSAヘッダー
- OSPFのHelloとDeadインターバル
- OSPFの収束タイマー(SPF / LSAスロットル)
- OSPFのLSAリフレッシュとペーシング
- OSPFのRouter-LSA(Type 1)
- OSPFのNetwork-LSA(Type 2)
- OSPFのSummary-LSA(Type 3)
- OSPFのASBR Summary-LSA(Type 4)
- OSPFのAS External-LSA(Type 5)
- OSPFのNSSA External-LSA(Type 7)