ORIGINとは
ORIGIN(Type code 1)は、その経路がどうやってBGPに入ったかを示すパス属性です。BGPパス属性とベストパス選択で解説したとおりwell-known mandatoryに分類され、UPDATEには必ず含まれます。値は1バイトで、経路をBGPに持ち込んだルータが決めます。
一度付いた値は、経路が他のASへ伝わっても自動的には書き換わりません。受け取ったルータは「この経路はもともとどういう素性で入ってきたのか」を知ることができます。
3つの値
| 値 | 名前 | 意味 |
|---|---|---|
| 0 | IGP | BGPを動かしているルータ自身が、AS内部の経路として明示的にBGPへ入れた。 |
| 1 | EGP | BGPの前身であるEGP(RFC 904)から学習した。EGPは使われていないため、現在の運用で見ることはない。 |
| 2 | Incomplete | 上記以外の方法でBGPに入った。再配布(redistribute)で入れた経路がこれにあたる。 |
show bgpの出力では、凡例のOrigin codesのとおり各行の末尾1文字で表されます。IGPがi、EGPがe、Incompleteが?です。
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.3.0/24 0.0.0.0 0 32768 iPath列の先頭にあるi(*>iの3文字目)はステータスコードの「internal(iBGPで学習した)」で、行末のiとは別物です。行末の1文字だけがORIGINを表します。どの操作でどの値になるか
| BGPへの入れ方 | ORIGIN |
|---|---|
networkで明示的に指定する | IGP(i) |
aggregate-addressで集約経路を生成する | IGP(i) |
redistributeで他プロトコル・スタティック・接続経路から再配布する | Incomplete(?) |
networkは「この経路をBGPで広告する」と管理者が1つずつ宣言する方法で、意図が明確なためIGPになります。redistributeは他プロトコルが持っている経路をまとめてBGPへ流し込む方法で、BGPから見ると素性が分からないためIncompleteになります。
ベストパス選択での位置づけ
同じプレフィックスに複数の経路がある場合、ベストパス選択の5段階目でORIGINが比較されます。小さいほうが優先されるため、次の順に優先されます。
IGP(0) < EGP(1) < Incomplete(2)実際の運用では、ORIGINにたどり着く前にLOCAL_PREFやAS_PATHの長さで決着することがほとんどです。ORIGINが効くのは、それより前の段階がすべて同点になったときに限られます。同じプレフィックスをAS内の2箇所から、一方はnetworkで、もう一方はredistributeでBGPに入れた場合などが該当します。
eBGPへ広告するときにORIGINをIGPに揃える
自AS発の経路をBGPへ入れる基本はnetwork(またはaggregate-address)で、この場合は最初からORIGINがIGPになります。ORIGINを意識せずに済む一番の方法は、自AS発の経路をこの方法で入れることです。
一方、運用の都合でredistributeを使っていると、同じ自AS発の経路でもiと?が混在します。これは自AS内部の都合にすぎませんが、受け取った隣のASではORIGINがベストパス選択の比較対象になるため、自AS内の設定変更(networkからredistributeへの切り替えなど)が他ASの経路選択に影響することがあります。これを避けたい場合の選択肢として、eBGPへ出すときにルートポリシーでIGPへ揃える方法があります。
ORIGINの書き換えは「経路がどうやってBGPに入ったか」という情報を消す操作でもあります。必須の設定ではなく、?の混在が問題になる場合の対処と考えてください。とくに他のASから受け取った経路(トランジット)に適用すると、他ASが付けたORIGINまで潰してしまいます。もっとも単純な書き方は、そのピアへ出すすべての経路をIGPにするものです。
route-policy EBGP-OUT
set origin igp
pass
end-policy
!
router bgp <AS番号>
neighbor <eBGPピアのアドレス>
address-family ipv4 unicast
route-policy EBGP-OUT out
!
!
!route-map EBGP-OUT permit 10
set origin igp
!
router bgp <AS番号>
address-family ipv4
neighbor <eBGPピアのアドレス> activate
neighbor <eBGPピアのアドレス> route-map EBGP-OUT outIOS XRのpass、IOS XEのpermit 10(matchなし)はどちらも「すべての経路を通す」意味です。ここを書き忘れると経路がまったく広告されなくなるので注意してください。
ただしこの形はトランジット経路にも効いてしまいます。自AS発の経路だけに限定するには、AS_PATHが空であること(^$)を条件にします。 eBGPへ広告する際のAS_PATHへの自AS番号の追加はルートポリシーの評価より後に行われるため、出方向のポリシーから見ると自AS発の経路はAS_PATHが空です。プレフィックスで指定する方法と違い、広告するアドレスが増減しても設定を直す必要がありません。
as-path-set LOCAL-ORIGIN
ios-regex '^$'
end-set
!
route-policy EBGP-OUT
if as-path in LOCAL-ORIGIN then
set origin igp
endif
pass
end-policyip as-path access-list 1 permit ^$
!
route-map EBGP-OUT permit 10
match as-path 1
set origin igp
!
route-map EBGP-OUT permit 20IOS XEのpermit 20は、条件に一致しなかった経路をそのまま通すための空エントリです。これが無いと、自AS発以外の経路がすべて破棄されます。
実機での検証
XRd(IOS XR 26.1.1)6台のラボで、次の2点を確認します。
- 他の比較項目がすべて同点のとき、
ORIGINがベストパスを決めること - eBGP出方向のポリシーで
ORIGINを書き換えると何が起きるか(全経路に適用した場合と、^$で自AS発に限定した場合の違い)
同じプレフィックス192.168.99.0/24を、AS 65001の2箇所から別々の方法でBGPへ入れています。
router bgp 65001
address-family ipv4 unicast
network 192.168.1.0/24
network 192.168.99.0/24
!router static
address-family ipv4 unicast
192.168.99.0/24 Null0
!
!
router bgp 65001
address-family ipv4 unicast
network 192.168.3.0/24
redistribute static
!R2はルートリフレクタなので、この2つの経路を同時に受け取ります。
さらにAS 65004(R6)からは、iの経路と?の経路を1つずつ受け取っています。これらはAS 65001を通過するトランジット経路として、STEP 3以降で使います。
router static
address-family ipv4 unicast
192.168.66.0/24 Null0
!
!
router bgp 65004
address-family ipv4 unicast
network 192.168.6.0/24
redistribute static
!STEP 0:ORIGINがベストパスを決める
R2のBGPテーブルです。192.168.99.0/24だけ2行あり、末尾のProcessed 8 prefixes, 9 pathsのとおり8プレフィックスに対して9パスを保持しています。
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 100 0 i
*> 192.168.2.0/24 0.0.0.0 0 32768 i
*>i192.168.3.0/24 10.0.0.3 0 100 0 i
*>i192.168.4.0/24 10.3.4.4 0 100 0 65002 i
*>i192.168.5.0/24 10.3.4.4 100 0 65002 65003 i
*>i192.168.6.0/24 10.1.6.6 0 100 0 65004 i
*>i192.168.66.0/24 10.1.6.6 0 100 0 65004 ?
*>i192.168.99.0/24 10.0.0.1 0 100 0 i
* i 10.0.0.3 0 100 0 ?
Processed 8 prefixes, 9 paths2行目はNetwork欄が空白ですが、これは1行上と同じプレフィックスであることを示します。先頭が*>の行(ネクストホップ10.0.0.1=R1、行末i)がベストパスで、>が付かない* iの行(ネクストホップ10.0.0.3=R3、行末?)は有効だが選ばれなかったパスです。
プレフィックスを指定すると、経路ごとの詳細が見えます。192.168.99.0/24には2つのパスがあり、Origin IGPのPath #1(R1から)がbest、Origin incompleteのPath #2(R3から)は選ばれていません。
RP/0/RP0/CPU0:R2#show bgp 192.168.99.0/24
Sat Sep 5 12:11:21.522 UTC
BGP routing table entry for 192.168.99.0/24
Versions:
Process bRIB/RIB SendTblVer
Speaker 15 15
Last Modified: Sep 5 12:09:04.774 for 00:02:16
Paths: (2 available, best #1)
Advertised IPv4 Unicast paths to update-groups (with more than one peer):
0.2
Path #1: Received by speaker 0
Advertised IPv4 Unicast paths to update-groups (with more than one peer):
0.2
Local, (Received from a RR-client)
10.0.0.1 (metric 2) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 100, valid, internal, best, group-best
Received Path ID 0, Local Path ID 1, version 15
Path #2: Received by speaker 0
Not advertised to any peer
Local, (Received from a RR-client)
10.0.0.3 (metric 2) from 10.0.0.3 (10.0.0.3)
Origin incomplete, metric 0, localpref 100, valid, internal
Received Path ID 0, Local Path ID 0, version 0ベストパス選択の1〜4段階目を確認すると、すべて同点です。
| 順序 | 比較項目 | Path #1(R1) | Path #2(R3) | 結果 |
|---|---|---|---|---|
| 1 | WEIGHT | 0 | 0 | 同点 |
| 2 | LOCAL_PREF | 100 | 100 | 同点 |
| 3 | 自身が生成した経路 | どちらもiBGPで学習 | どちらもiBGPで学習 | 同点 |
| 4 | AS_PATHの長さ | 0(AS内で生成) | 0(AS内で生成) | 同点 |
| 5 | ORIGIN | IGP | Incomplete | Path #1が優先 |
5段階目のORIGINで決着しています。
STEP 1:iの経路を消すと?が選ばれる
ORIGINが決め手になっていることを確かめるため、R1からnetworkを外してiの経路を消します。
router bgp 65001
address-family ipv4 unicast
no network 192.168.99.0/24
!
!R2のベストパスは、R3から受け取ったOrigin incompleteの経路に切り替わりました。
RP/0/RP0/CPU0:R2#show bgp 192.168.99.0/24
Sat Sep 5 12:15:34.272 UTC
BGP routing table entry for 192.168.99.0/24
Versions:
Process bRIB/RIB SendTblVer
Speaker 16 16
Last Modified: Sep 5 12:14:04.774 for 00:01:29
Paths: (1 available, best #1)
Advertised IPv4 Unicast paths to update-groups (with more than one peer):
0.2
Path #1: Received by speaker 0
Advertised IPv4 Unicast paths to update-groups (with more than one peer):
0.2
Local, (Received from a RR-client)
10.0.0.3 (metric 2) from 10.0.0.3 (10.0.0.3)
Origin incomplete, metric 0, localpref 100, valid, internal, best, group-best
Received Path ID 0, Local Path ID 1, version 16この変化は隣のAS 65004(R6)からも見えます。行末がiから?に変わりました。
(STEP 0)*> 192.168.99.0/24 10.1.6.1 0 0 65001 i
(STEP 1)*> 192.168.99.0/24 10.1.6.1 0 65001 ?AS 65001内の「どちらの方法でBGPに入れたか」という違いが、そのまま隣のASに伝わっていることが分かります。このあとのSTEP以降は、R1のnetwork 192.168.99.0/24を元に戻した状態(STEP 2)から始めます。
STEP 3:出方向ポリシーで全経路のORIGINをIGPにする
R3からR4(AS 65002)へのeBGPに、すべての経路のORIGINをIGPにするポリシーを適用します。
route-policy EBGP-OUT-ALL
set origin igp
pass
end-policy
!
router bgp 65001
neighbor 10.3.4.4
address-family ipv4 unicast
route-policy EBGP-OUT-ALL out
!
!
!R3がR4へ広告している経路のAS Path列(末尾1文字がORIGIN)を、適用前後で比較します。
(STEP 2:ポリシー適用前)
Network Next Hop From AS Path
192.168.1.0/24 10.3.4.3 10.0.0.2 65001i
192.168.2.0/24 10.3.4.3 10.0.0.2 65001i
192.168.3.0/24 10.3.4.3 Local 65001i
192.168.6.0/24 10.3.4.3 10.0.0.2 65001 65004i
192.168.66.0/24 10.3.4.3 10.0.0.2 65001 65004?
192.168.99.0/24 10.3.4.3 Local 65001?
Processed 6 prefixes, 6 paths
(STEP 3:EBGP-OUT-ALL 適用後)
Network Next Hop From AS Path
192.168.1.0/24 10.3.4.3 10.0.0.2 65001i
192.168.2.0/24 10.3.4.3 10.0.0.2 65001i
192.168.3.0/24 10.3.4.3 Local 65001i
192.168.6.0/24 10.3.4.3 10.0.0.2 65001 65004i
192.168.66.0/24 10.3.4.3 10.0.0.2 65001 65004i
192.168.99.0/24 10.3.4.3 Local 65001i
Processed 6 prefixes, 6 paths自AS発の192.168.99.0/24が?からiになったのは狙いどおりですが、AS 65004から受け取ったトランジット経路192.168.66.0/24まで?からiに書き換わっています。AS 65004が付けたORIGINの情報が、AS 65001を通過したことで失われました。
書き換えは2つ先のAS 65003(R5)からも見えます。
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.2.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.3.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.4.0/24 10.4.5.4 0 0 65002 i
*> 192.168.5.0/24 0.0.0.0 0 32768 i
*> 192.168.6.0/24 10.4.5.4 0 65002 65001 65004 i
*> 192.168.66.0/24 10.4.5.4 0 65002 65001 65004 i
*> 192.168.99.0/24 10.4.5.4 0 65002 65001 i
Processed 8 prefixes, 8 pathsSTEP 4:自AS発の経路だけIGPに揃える
AS_PATHが空であること(^$)を条件に加えて、自AS発の経路だけを対象にします。
as-path-set LOCAL-ORIGIN
ios-regex '^$'
end-set
!
route-policy EBGP-OUT-LOCAL
if as-path in LOCAL-ORIGIN then
set origin igp
endif
pass
end-policy
!
router bgp 65001
neighbor 10.3.4.4
address-family ipv4 unicast
route-policy EBGP-OUT-LOCAL out
!
!
!R3がR4へ広告している経路です。
RP/0/RP0/CPU0:R3#show bgp neighbors 10.3.4.4 advertised-routes
Sat Sep 5 12:30:48.096 UTC
Network Next Hop From AS Path
192.168.1.0/24 10.3.4.3 10.0.0.2 65001i
192.168.2.0/24 10.3.4.3 10.0.0.2 65001i
192.168.3.0/24 10.3.4.3 Local 65001i
192.168.6.0/24 10.3.4.3 10.0.0.2 65001 65004i
192.168.66.0/24 10.3.4.3 10.0.0.2 65001 65004?
192.168.99.0/24 10.3.4.3 Local 65001i
Processed 6 prefixes, 6 paths自AS発の192.168.99.0/24はiに揃い、トランジット経路の192.168.66.0/24は?のまま残りました。R5から見ても同じです。
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.2.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.3.0/24 10.4.5.4 0 65002 65001 i
*> 192.168.4.0/24 10.4.5.4 0 0 65002 i
*> 192.168.5.0/24 0.0.0.0 0 32768 i
*> 192.168.6.0/24 10.4.5.4 0 65002 65001 65004 i
*> 192.168.66.0/24 10.4.5.4 0 65002 65001 65004 ?
*> 192.168.99.0/24 10.4.5.4 0 65002 65001 i
Processed 8 prefixes, 8 pathsadvertised-routesのAS Path列には65001が付いた状態で表示されますが、この65001はポリシーの評価より後に付加されます。ポリシーから見たAS_PATHは空だったため^$に一致し、set origin igpが適用されました。一方192.168.66.0/24はポリシー評価の時点でAS_PATHが65004だったため一致せず、ORIGINが保たれています。
192.168.1.0/24(R1のnetwork)や192.168.2.0/24(R2のnetwork)もAS_PATHが空なので^$に一致しますが、もともとORIGINがIGPなので見た目は変わりません。検証Configおよびshow結果
各STEPで6台すべてから、次の3種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route bgp / show bgp / show bgp summary / show bgp <プレフィックス>(8プレフィックス分) / show bgp neighbors <ピア> advertised-routes / show bgp neighbors <ピア> routes / show bgp neighbor / show bgp update-group / show rpl route-policy / show ospf neighbor |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
最終状態(STEP 4)でas-path-set LOCAL-ORIGINとroute-policy EBGP-OUT-LOCALが入っているのはR3だけです(STEP 3で使ったEBGP-OUT-ALLはSTEP 4で削除しています)。
STEP 0:初期状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| R5 | show | log | run |
| R6 | show | log | run |
STEP 1:R1のnetwork 192.168.99.0/24を削除した状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| R5 | show | log | run |
| R6 | show | log | run |
STEP 2:R1のnetwork 192.168.99.0/24を戻した状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| R5 | show | log | run |
| R6 | show | log | run |
STEP 3:R3にEBGP-OUT-ALLを適用した状態
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| R5 | show | log | run |
| R6 | show | log | run |
STEP 4:R3にEBGP-OUT-LOCALを適用した状態(最終状態)
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
| R3 | show | log | run |
| R4 | show | log | run |
| R5 | show | log | run |
| R6 | show | log | run |
参考
| 資料 | タイトル | 概要 |
|---|---|---|
| RFC 4271 | A Border Gateway Protocol 4 (BGP-4) | 4.3節でORIGINの3つの値を、9.1.2.2節でベストパス選択における比較順序を定義。 |
| RFC 904 | Exterior Gateway Protocol Formal Specification | ORIGINの値EGPが指すプロトコルの仕様。現在は使われていない。 |
| IANA | Border Gateway Protocol (BGP) Parameters | パス属性のType codeなど、BGPで使われる番号の割り当て一覧。 |