OSPFのAS外部経路のForwarding Address
AS External-LSA(Type 5)にはForwarding Addressというフィールドがあります。ここが0.0.0.0なら、その外部宛てのパケットは広告したASBRへ送られます。非ゼロなら、ASBRを経由せずそのアドレスへ直接送られます。
この記事では、Forwarding Addressが何のためにあるのか、経路計算でどう扱われるのかをRFC 2328で確認し、IOS XRが非ゼロの値を入れる条件を実機で確かめます。Type 5 LSAの全体像とE1 / E2の違いはOSPFの外部経路で解説しています。
何のためにあるのか
RFC 2328のSection 2.3は、OSPFを動かしていない外部ルータと1台のASBRだけがBGPを話している構成を例に挙げています。
この状況に対処するため、OSPFはAS境界ルータがAS-external-LSAに「forwarding address」を指定できるようにしている。上の例では、ルータRT7は、パケットをRTXへ直接送るべき宛先について、RTXのIPアドレスをforwarding addressとして指定する。 (RFC 2328 Section 2.3)
同じセグメントに他のOSPFルータが並んでいるとき、この指定が無ければ、それらのルータはASBRを経由する余計な1ホップを踏みます。Forwarding Addressを入れておけば、外部ルータへ直接転送できます。
RFC 2328は非ゼロの値について「別のAutonomous Systemに属するルータを指すべき」(脚注24)としか述べていません。どういうときに非ゼロを入れるかは実装が決めます。
経路計算での扱い
Section 16.4のステップ(3)は、Forwarding Addressを次のように扱うと定めています。
forwarding addressが0.0.0.0に設定されている場合、パケットはASBR自身へ送られるべきである。(中略)forwarding addressが非ゼロの場合、ルーティングテーブルでforwarding addressを引く。一致するルーティングテーブルのエントリは、エリア内経路かエリア間経路でなければならない。そのような経路が無ければ、このLSAには何もせず、リストの次へ進む。 (RFC 2328 Section 16.4 (3))
非ゼロのForwarding Addressには2つの条件が付きます。エリア内経路かエリア間経路で引けること、そして続くステップ(4)のコストがASBRまでではなくForwarding Addressまでの距離になることです。外部経路で引けるだけのアドレスを指していると、そのLSAは計算に使われません。
同じ経路を2台が出したとき
Section 12.4.4.1は、2台のASBRが宛先・コスト・非ゼロのForwarding AddressのそろったLSAを出した場合の規則を決めています。
互いに到達可能な2台のルータが、機能的に等価なAS-external-LSA(すなわち同じ宛先、コスト、非ゼロのforwarding address)を出した場合、OSPFルータIDの大きいほうが出したLSAを使う。ルータIDの小さいほうは自分のLSAをフラッシュしてよい。 (RFC 2328 Section 12.4.4.1)
どちらが広告してもルーティングの結果は同じなので、LSDBを小さくするための規則です。
IOS XRが非ゼロを入れる条件
IOS XR(XRd 26.1.1)は、再配布した経路のネクストホップのアドレスをForwarding Addressに入れます。実機で確かめると、条件は次の3つでした(後半の検証でこの順に確認します)。
| 条件 | 満たさないとき |
|---|---|
| ネクストホップのあるインタフェースがOSPFに入っている | 0.0.0.0 |
そのインタフェースがpassiveでない | 0.0.0.0 |
| そのインタフェースのネットワークタイプがbroadcast | point-to-multipointでは0.0.0.0 |
3つめは、経路計算の条件と合わせて読むと理由が分かります。point-to-multipointのインタフェースは、そのセグメントのサブネットではなく自分のアドレスの/32だけをRouter-LSAに載せるため、他のルータはForwarding Addressを引けません。引けないアドレスを入れてもLSAが使われないだけなので、0.0.0.0にするほうが正しく動きます。
実機での検証
検証環境
R1・R2・R3と、OSPFを動かしていない外部ルータXが1つのLAN(10.0.123.0/24)に並びます。R1だけが192.0.2.0/24のスタティック(ネクストホップはXの10.0.123.100)を持ち、これを再配布します。R4はR2の先の観測点です。
R1 - R4のコスト50の回り道は、R1のLAN側をpassiveにしたりOSPFから外したりしてもR1が孤立しないようにするためのものです。R4からXへの距離は、R2経由なら11、R1経由なら51になります。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態(再配布なし) | 192.0.2.0/24がどのルータにも無い |
| 1 | R1でredistribute static | Forwarding AddressがXのアドレスになり、各ルータがXへ直接転送する |
| 2 | R1のLAN側をpassive enable | 0.0.0.0になり、転送がR1経由に戻る |
| 3 | LAN側をpoint-to-multipointにする | 0.0.0.0のまま。Forwarding Addressを引けないネットワークタイプ |
| 4 | R1のLAN側をOSPFから外す | 0.0.0.0。OSPFに入っていないインタフェース |
| 5 | R1のLAN側を戻し、R2にも同じ経路を再配布 | ルータIDの小さいR1が自分のLSAを取り下げる |
| 6 | すべて既定に戻す(最終状態) | — |
Forwarding Addressが入る(STEP 1)
R1が再配布した直後の、R4から見たType 5 LSAです。
RP/0/RP0/CPU0:R4#show ospf database external 192.0.2.0
Tue Sep 22 16:38:55.137 UTC
OSPF Router with ID (4.4.4.4) (Process ID 1)
Type-5 AS External Link States
Routing Bit Set on this LSA
LS age: 313
Options: (No TOS-capability, DC)
LS Type: AS External Link
Link State ID: 192.0.2.0 (External Network Number)
Advertising Router: 1.1.1.1
LS Seq Number: 80000001
Checksum: 0x1bd4
Length: 36
Network Mask: /24
Metric Type: 2 (Larger than any link state path)
TOS: 0
Metric: 20
Forward Address: 10.0.123.100
External Route Tag: 0広告元はR1(1.1.1.1)で、Forwarding Addressに入っているのはXのアドレス(10.0.123.100)です。R4はこのアドレスをルーティングテーブルで引きます。
RP/0/RP0/CPU0:R4#show route 10.0.123.0/24
Tue Sep 22 16:38:53.786 UTC
Routing entry for 10.0.123.0/24
Known via "ospf 1", distance 110, metric 11, type intra area
Installed Sep 22 16:18:47.770 for 00:20:06
Routing Descriptor Blocks
10.0.24.2, from 3.3.3.3, via GigabitEthernet0/0/0/0
Route metric is 11
No advertising protos. エリア内経路(type intra area)として引けているので、Section 16.4 (3)の条件を満たします。この経路のコスト11が、外部経路の計算に使われる距離です。
R4の192.0.2.0/24と、そこへのtracerouteです。
RP/0/RP0/CPU0:R4#show route 192.0.2.0/24
Tue Sep 22 16:38:53.149 UTC
Routing entry for 192.0.2.0/24
Known via "ospf 1", distance 110, metric 20, type extern 2
Installed Sep 22 16:33:43.895 for 00:05:09
Routing Descriptor Blocks
10.0.24.2, from 1.1.1.1, via GigabitEthernet0/0/0/0
Route metric is 20
No advertising protos. RP/0/RP0/CPU0:R4#traceroute 192.0.2.1 source 4.4.4.4 timeout 1 probe 3 maxttl 4
Tue Sep 22 16:35:49.692 UTC
Type escape sequence to abort.
Tracing the route to 192.0.2.1
1 10.0.24.2 6 msec 5 msec 5 msec
2 10.0.123.100 29 msec * 15 msec RP/0/RP0/CPU0:R2#traceroute 192.0.2.1 source 2.2.2.2 timeout 1 probe 3 maxttl 4
Tue Sep 22 16:35:36.267 UTC
Type escape sequence to abort.
Tracing the route to 192.0.2.1
1 10.0.123.100 20 msec * 8 msec RP/0/RP0/CPU0:R3#traceroute 192.0.2.1 source 3.3.3.3 timeout 1 probe 3 maxttl 4
Tue Sep 22 16:35:42.749 UTC
Type escape sequence to abort.
Tracing the route to 192.0.2.1
1 10.0.123.100 8 msec * 8 msec R4は10.0.24.2(R2)を通り、次のホップがもうXです。同じLANにいるR2とR3は1ホップでXに届いています。どのルータもASBRのR1を経由していません。
LANを流れたLink State Updateの中身です。添付のキャプチャー(STEP 1のR1 - LAN間)のNo.4にあたります。
LS Update Packet
Number of LSAs: 1
LSA-type 5 (AS-External-LSA (ASBR)), len 36
.000 0000 0000 0001 = LS Age (seconds): 1
0... .... .... .... = Do Not Age Flag: 0
Options: 0x20, (DC) Demand Circuits
0... .... = DN: Not set
.0.. .... = (O) Opaque: Not set
..1. .... = (DC) Demand Circuits: Supported
...0 .... = (L) LLS Data block: Not Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..0. = (E) External Routing: Not capable
.... ...0 = (MT) Multi-Topology Routing: No
LS Type: AS-External-LSA (ASBR) (5)
Link State ID: 192.0.2.0
Advertising Router: 1.1.1.1
Sequence Number: 0x80000001
Checksum: 0x1bd4
Length: 36
Netmask: 255.255.255.0
1... .... = External Type: Type 2 (metric is larger than any other link state path)
.000 0000 = TOS: 0
Metric: 20
Forwarding Address: 10.0.123.100
External Route Tag: 0LSA本体は36バイトで、Forwarding Addressは4バイトのフィールドです。showの表示と同じ値が入っています。
passiveにすると0.0.0.0になる(STEP 2)
R1のLAN側をpassive enableにしました。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Tue Sep 22 16:40:07.129 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
area 0
interface GigabitEthernet0/0/0/0
passive enable
!
!
!
endRP/0/RP0/CPU0:R4#show ospf database external 192.0.2.0
Tue Sep 22 16:45:23.746 UTC
OSPF Router with ID (4.4.4.4) (Process ID 1)
Type-5 AS External Link States
Routing Bit Set on this LSA
LS age: 318
Options: (No TOS-capability, DC)
LS Type: AS External Link
Link State ID: 192.0.2.0 (External Network Number)
Advertising Router: 1.1.1.1
LS Seq Number: 80000002
Checksum: 0xe7f0
Length: 36
Network Mask: /24
Metric Type: 2 (Larger than any link state path)
TOS: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 0Forwarding Addressが0.0.0.0になりました。パケットはASBRのR1へ送られます。
RP/0/RP0/CPU0:R4#traceroute 192.0.2.1 source 4.4.4.4 timeout 1 probe 3 maxttl 4
Tue Sep 22 16:42:13.853 UTC
Type escape sequence to abort.
Tracing the route to 192.0.2.1
1 10.0.14.1 7 msec 5 msec 50 msec
2 10.0.123.100 11 msec * 10 msec R4はまずR1(10.0.14.1、コスト50の回り道)へ行き、そこからXへ渡しています。passiveにするとLANの隣接も無くなるので、この構成ではR1へ回り道を通ることになります。ASBRを経由する1ホップが増えた形です。
point-to-multipointでも0.0.0.0(STEP 3)
passiveを外し、R1・R2・R3のLAN側をpoint-to-multipointに変えました。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Tue Sep 22 16:46:34.480 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
area 0
interface GigabitEthernet0/0/0/0
network point-to-multipoint
no passive enable
!
!
!
endRP/0/RP0/CPU0:R4#show ospf database external 192.0.2.0
Tue Sep 22 16:52:59.985 UTC
OSPF Router with ID (4.4.4.4) (Process ID 1)
Type-5 AS External Link States
Routing Bit Set on this LSA
LS age: 774
Options: (No TOS-capability, DC)
LS Type: AS External Link
Link State ID: 192.0.2.0 (External Network Number)
Advertising Router: 1.1.1.1
LS Seq Number: 80000002
Checksum: 0xe7f0
Length: 36
Network Mask: /24
Metric Type: 2 (Larger than any link state path)
TOS: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 0隣接は張れていますが、Forwarding Addressは0.0.0.0のままです。R4からLANのアドレスを引いてみます。
RP/0/RP0/CPU0:R4#show route 10.0.123.0/24
Tue Sep 22 16:52:58.646 UTC
% Network not in table
RP/0/RP0/CPU0:R4#show route 10.0.123.100/32
Tue Sep 22 16:52:58.845 UTC
% Network not in tableどちらも引けません。point-to-multipointのインタフェースはサブネットをRouter-LSAに載せないためです。仮に10.0.123.100がForwarding Addressに入っていても、Section 16.4 (3)の条件を満たさないのでこのLSAは使われません。
OSPFに入っていないインタフェース(STEP 4)
ネットワークタイプを戻し、R1のLAN側をOSPFから外しました。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Tue Sep 22 16:54:24.665 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
area 0
no interface GigabitEthernet0/0/0/0
!
!
endRP/0/RP0/CPU0:R4#show ospf database external 192.0.2.0
Tue Sep 22 17:00:38.150 UTC
OSPF Router with ID (4.4.4.4) (Process ID 1)
Type-5 AS External Link States
Routing Bit Set on this LSA
LS age: 1232
Options: (No TOS-capability, DC)
LS Type: AS External Link
Link State ID: 192.0.2.0 (External Network Number)
Advertising Router: 1.1.1.1
LS Seq Number: 80000002
Checksum: 0xe7f0
Length: 36
Network Mask: /24
Metric Type: 2 (Larger than any link state path)
TOS: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 00.0.0.0です。R1はLANのアドレスを持ったままですが、そのインタフェースがOSPFに入っていないので、Forwarding Addressには使われません。
同じLSAを2台が出したとき(STEP 5)
R1のLAN側をOSPFへ戻したうえで、R2にも同じスタティックを入れて再配布しました。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Tue Sep 22 17:01:58.392 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router static
address-family ipv4 unicast
192.0.2.0/24 10.0.123.100
!
!
router ospf 1
redistribute static
!
endR1 - R4間のキャプチャーで、2つのLSAの動きを並べます。左から、時刻・送信元・広告元・シーケンス番号・LS Age・Forwarding Addressです。
2026-09-23T02:01:50.801048000+0900 10.0.14.1 1.1.1.1 0x80000003 1 10.0.123.100
2026-09-23T02:01:51.793437000+0900 10.0.14.4 1.1.1.1,1.1.1.1 0x8000000a,0x80000003 1,1
2026-09-23T02:01:57.598710000+0900 10.0.14.4 2.2.2.2 0x80000001 2 10.0.123.100
2026-09-23T02:01:57.921569000+0900 10.0.14.1 1.1.1.1 0x80000004 3600 10.0.123.100
2026-09-23T02:01:59.602586000+0900 10.0.14.1 2.2.2.2,2.2.2.2 0x80000001,0x8000000b 2,2
2026-09-23T02:01:59.925625000+0900 10.0.14.4 1.1.1.1,1.1.1.1,3.3.3.3 0x80000004,0x8000000b,0x80000002 3600,1,2 3行目でR2(2.2.2.2)が同じ宛先・コスト・Forwarding Addressの自分のLSAを出し、その0.32秒後の4行目で、R1が自分のLSA(1.1.1.1、シーケンス番号0x80000004)をLS Age 3600で流しています。ルータIDの小さいR1が取り下げた形で、Section 12.4.4.1のとおりです。
R1に自分が出したType 5が残っていないことを確認します。
RP/0/RP0/CPU0:R1#show ospf database external self-originate
Tue Sep 22 17:04:52.900 UTC
OSPF Router with ID (1.1.1.1) (Process ID 1)RP/0/RP0/CPU0:R4#show ospf database external 192.0.2.0
Tue Sep 22 17:07:50.280 UTC
OSPF Router with ID (4.4.4.4) (Process ID 1)
Type-5 AS External Link States
Routing Bit Set on this LSA
LS age: 354
Options: (No TOS-capability, DC)
LS Type: AS External Link
Link State ID: 192.0.2.0 (External Network Number)
Advertising Router: 2.2.2.2
LS Seq Number: 80000001
Checksum: 0xfcee
Length: 36
Network Mask: /24
Metric Type: 2 (Larger than any link state path)
TOS: 0
Metric: 20
Forward Address: 10.0.123.100
External Route Tag: 0R4が持っているのはR2のLSAだけです。Forwarding Addressは同じなので、転送先はR1が出していたときと変わりません。
設計上の注意
- Forwarding Addressを効かせたいなら、ネクストホップのあるインタフェースをOSPFに入れ、passiveにしない。外部ルータと隣接を張りたくない場合、passiveにするとForwarding Addressも失われる
- 外部ルータのアドレスは、エリア内経路かエリア間経路で引ける必要がある。スタティックやBGPで引けるだけでは、そのLSAは経路計算に使われない
検証Configおよびshow結果
各STEPで5台すべてから、次のファイルをルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route ospfとshow ospf系一式(interface / neighbor / database / database router / database external / database external self-originate / border-routers)、show route 192.0.2.0/24 / show cef 192.0.2.0/24 / show route 10.0.123.0/24 / show route 10.0.123.100/32、show configuration commit list。X(OSPFなし)はshow ipv4 interface brief / show arp / show route static |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._trace.txt | show ospf trace all | include 192.0.2とshow ospf trace errors(R1〜R4) |
..._ping.txt | R2・R3・R4から192.0.2.1へのping(50発)とtraceroute |
..._commit.cfg | そのSTEPでcommitされた設定(show configuration commit changes last 1) |
設定を変えていないSTEPとルータにはcommit.cfgがありません。最終状態は初期状態と同じで、どのルータも192.0.2.0/24を再配布していません。
STEP 0:初期状態(再配布なし)
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | — |
| R2 | show | log | run | trace | ping | — |
| R3 | show | log | run | trace | ping | — |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 1:R1で192.0.2.0/24を再配布
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | — |
| R3 | show | log | run | trace | ping | — |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 2:R1のLAN側をpassiveにする
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | — |
| R3 | show | log | run | trace | ping | — |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 3:LAN側をpoint-to-multipointにする
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | commit |
| R3 | show | log | run | trace | ping | commit |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 4:R1のLAN側をOSPFから外す
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | commit |
| R3 | show | log | run | trace | ping | commit |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 5:R1のLAN側を戻し、R2にも同じ経路を再配布
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | commit |
| R3 | show | log | run | trace | ping | — |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
STEP 6:すべて既定に戻す(最終状態)
| ルータ | show出力 | syslog | running-config | trace | ping | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | trace | — | commit |
| R2 | show | log | run | trace | ping | commit |
| R3 | show | log | run | trace | ping | — |
| R4 | show | log | run | trace | ping | — |
| X | show | log | run | — | — | — |
パケットキャプチャーはSTEPごとに、LANのR1側とR1 - R4間で取得しています。
| STEP | R1-LAN間 | R1-R4間 |
|---|---|---|
| 0 | pcap | pcap |
| 1 | pcap | pcap |
| 2 | pcap | pcap |
| 3 | pcap | pcap |
| 4 | pcap | pcap |
| 5 | pcap | pcap |
| 6 | pcap | pcap |
参考
| 出典 | 参照した箇所 |
|---|---|
| RFC 2328 OSPF Version 2 | Section 2.3(forwarding addressを設けた理由)、Section 12.4.4.1(機能的に等価なLSA)、Section 16.4 (3)(4)(外部経路の計算)、Appendix A.4.5(Type 5のフォーマット)、脚注24 |
| 実機 | Cisco IOS XR(XRd 26.1.1)。非ゼロを入れる条件はSTEP 1〜4で確認 |
関連記事
- OSPFとは
- 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)