■経路フィルタリング
以下のようなマルチホーミング構成である場合、BGPの経路フィルタリングは必須となります。
例えばAS100からの1.1.1.1/32の経路をAS200が受信した場合、何もフィルタリングされていなければそれをAS300に送信してしまいAS200はトランジットASになってしまうためです。このためマルチホーム構成では自経路のみアドバタイズというフィルタが必要となります。
経路をフィルタする際に使用される主な手法が以下のものです。
- as-pathフィルタ
- prefix-listフィルタ
- distribute-listフィルタ
どれを使用するかはその人の好みになると思います。ちなみに私はprefix-listが一番使いやすいと思っています。上の3つは同一のネイバーに対して併用することはできません。また、distribute-listとprefix-listを併用することもできません。
■as-pathフィルタリング
as-pathフィルタの最大の特徴は正規表現を用いるところです。書式は以下のようになります。
router bgp 100 neighbor 1.1.1.1 filter-list <AS-ACL> { in|out } ip as-path access-list <AS-ACL> permit <regexp> |
PerlプログラマーやUNIX Userなら正規表現が得意な方が多いのではないでしょうか。ちなみに私は得意ではありません。正規表現とは一つの形式で複数の表現をするための表現方法で通常は抽出したい文字列と特殊文字を組み合わせて使用します。特殊文字として主に以下のものがあります。
特殊文字 | 説明 |
. | 任意の一文字 |
^ | 文字列の先頭 |
$ | 文字列の終了 |
* | 直前の文字がないか1つ以上連続 |
? | 直前の文字がないか1つだけ存在 |
+ | 直前の文字が1つ以上存在 |
[ABD] | A,B,Dのいずれか |
[A-D] | A,B,C,Dのいずれか |
[1235] | 1,2,3,5のいずれか |
[1-5] | 1,2,3,4,5のいずれか |
これらを踏まえて正規表現を使った例が以下です。
使用例 | 説明 |
_100_ | AS100を経由 |
^100_ | AS100がネイバー |
_100$ | AS100がOriginate-As |
^100$ | AS100がネイバーでかつOriginate-AS |
^100_. | AS100がネイバーでかつ先に他のASが存在する |
^[0-9]+$ | あるASがネイバーでかつOriginate-AS |
^$ | 自分のASがOriginate-AS |
.* | すべて |
上のマルチホームの構成でR2で自経路のみアドバタイズするためにAS-PATHを使ったフィルタの設定例が以下です。下記の設定によりAS300からの経路はフィルタされ、AS100に対して自経路のみアドバタイズするようになります。
[ R2 ] ip as-path access-list 1 permit ^$ ip as-path access-list 1 deny .* router bgp 200 neighbor 10.10.10.1 filter-list 1 out |
確認コマンドは以下のようになります。
# 正規表現にマッチしたBGPルートを表示 R2# show ip bgp regexp ^$ BGP table version is 16, local router ID is 2.2.2.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 2.2.2.2/32 0.0.0.0 0 32768 ? *> 3.3.3.3/32 192.168.0.2 11 32768 ? * i4.4.4.4/32 4.4.4.4 0 100 0 ? *> 192.168.0.2 21 32768 ? *> 192.168.0.0 0.0.0.0 0 32768 ? * i192.168.1.0 4.4.4.4 0 100 0 ? *> 192.168.0.2 20 32768 ? # AS-PATHにマッチしたBGPルートの表示 R2# show ip bgp filter-list 1 BGP table version is 16, local router ID is 2.2.2.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 2.2.2.2/32 0.0.0.0 0 32768 ? *> 3.3.3.3/32 192.168.0.2 11 32768 ? * i4.4.4.4/32 4.4.4.4 0 100 0 ? *> 192.168.0.2 21 32768 ? *> 192.168.0.0 0.0.0.0 0 32768 ? * i192.168.1.0 4.4.4.4 0 100 0 ? *> 192.168.0.2 20 32768 ? |
■prefix-listフィルタ
私が最もよく使うフィルタです。私だけでなく一般的にprefix-listを好む方は非常に多いのではとおもいます。他社が設定したBGPルータでもprefix-listを使っているケースが非常に多く見受けられます。書式は以下のようになります。
router bgp 100 neighbor 1.1.1.1 prefix-list <AS-ACL> { in|out } ip prefix-list <list-name> seq <seq> {permit|deny} <network/len> \ [ge <ge-value>] [le <le-value>] |
各項目の意味は以下のようになります。
項目 | 説明 |
list-name | プレフィックスリストに使う名前 |
seq-value | シーケンスの数値 |
network | ネットワークアドレス |
len | サブネットマスク長 |
ge-value. | 範囲の始まりの値 |
le-value | 範囲の終わりの値 |
prefix-list特有なのがge-valueとle-valueです。これらは入力されるネットワークアドレスに対して許可または拒絶のアドレスの範囲を指定することができます。
len < ge-value < le-value <= 32
また、これらの値はお互いに関係なく使うことができます。以下、使用例です。
設定例 | 説明 |
ip prefix-list name permit 192.168.0.0/24 | 192.168.0.0/24に完全一致する経路のみ。 192.168.0.0/25や192.168.0.0/26にはマッチしない |
ip prefix-list name permit 192.168.0.0/24 ge 28 | 192.168.0.0の24ビット目まで合致した上で prefixが/28以上、例えば192.168.0.0/28や29などにマッチ 192.168.0.0/27などにはマッチしない |
ip prefix-list name permit 192.168.0.0/24 le 28 | 192.168.0.0の24ビット目まで合致した上で prefixが/28までの経路、例えば192.168.0.0/25などにマッチ 192.168.0.0/29などにはマッチしない |
ip prefix-list name permit 192.168.0.0/24 le 32 | 192.168.0.0の24ビット目まで合致した上で prefixが/32までの経路。つまり192.168.0.0/24の全ての範囲。 |
ip prefix-list name permit 0.0.0.0/0 le 32 | 全ての経路にマッチ |
上のマルチホームの構成でR2で自経路のみアドバタイズするためにprefix-listを使ったフィルタの設定例が以下です。
[ R2 ] ip prefix-list name seq 5 permit 2.2.2.2/32 ip prefix-list name seq 10 permit 3.3.3.3/32 ip prefix-list name seq 15 permit 4.4.4.4/32 ip prefix-list name seq 20 permit 192.168.0.0/24 ip prefix-list name seq 25 permit 192.168.1.0/24 router bgp 200 neighbor 10.10.10.1 prefix-list name out |
■distribute-listフィルタ
あまり使われることはないのですが、distribute-listでも経路フィルタリングを行うことは可能です。sこれはアクセスリストを使用してフィルタリングを行いますのでprefix-listのようにprefixの値まで厳密に指定することはできません。以下、設定例です。
[ R2 ] access-list 1 permit 2.2.2.2 0.0.0.0 access-list 1 permit 3.3.3.3 0.0.0.0 access-list 1 permit 4.4.4.4 0.0.0.0 access-list 1 permit 192.168.0.0 0.0.0.255 access-list 1 permit 192.168.1.0 0.0.0.255 router bgp 200 neighbor 10.10.10.1 distribute-list 1 out |
■経路集約
BGPでネイバーに経路を広報するとき、経路を集約することができます。例えば上記の構成でいうと192.168.0.0/24と192.168.1.0/24を一括りに192.168.0.0/16とすることが可能です。経路を集約したルータ上ではNull0ルートが自動的に生成されます。
[ R2 ] router bgp 200 aggregate-address 192.168.0.0 255.255.0.0 R2# show ip route | i Null0 B 192.168.0.0/16 [200/0] via 0.0.0.0, 00:00:50, Null0 |
Null0経路が追加されるのは例えば192.168.100.1宛の経路がAS100からきた場合、実際のそのような経路は使っていないのでR1とR2との間でピンポンルーティングになるのを防ぐためです。
R1のルーティングテーブル上では次のように表示されます。個々の経路と集約経路の両方がアドバタイズされているのわかります。
[ R1 ] R1# show ip route | i 192.168 B 192.168.0.0/24 [20/0] via 10.10.10.2, 00:09:14 B 192.168.1.0/24 [200/0] via 5.5.5.5, 00:09:17 B 192.168.0.0/16 [20/0] via 10.10.10.2, 00:00:36 |
aggregateコマンドには主に以下のオプションがあり必要に応じて使い分けることが可能です。
summary-only | 集約経路のみ広報され、個々の経路は広報されない |
suppress-map route-map | route-mapでマッチしたアドレスは広報しない |
attribute-map route-map | 集約経路に対してroute-mapで指定した属性をセットできる |
コマンドのヘルプには以下のものが表示され、他にもあるようですが使うことが多いのは上の3つです。
(config-router)# aggregate-address 192.168.0.0 255.255.0.0 ? advertise-map Set condition to advertise attribute as-set Generate AS set path information attribute-map Set attributes of aggregate nlri Nlri aggregate applies to route-map Set parameters of aggregate summary-only Filter more specific routes from updates suppress-map Conditionally filter more specific routes from updates |