BGPのフィルタリング設定（Distribute-List、Prefix-List）

## Distribute-Listについて
[前回の記事](https://qiita.com/coco0922/items/a943abb6e294c3703be3)で、AS_PATH ACLによる、AS_PATH属性に基づいたフィルタリングを行う検証をしました。今回検証するDistribute-Listでは、通常のACLに基づいたフィルタリングを行うことができます。

## Prefix-Listについて
BGPでは、ACLだけではなく、Prefix-Listを用いて、フィルタリングをかけることもできます。Prefix-Listでは、ネットワークとサブネットマスクの指定をすることができ、ネットワークのプレフィックス長を指定できるため、ACLよりも柔軟にフィルタリングを行うことができます。

BGPのフィルタ機能については下記の記事が参考になります。
[BGP - ルートフィルタリングの種類](https://www.infraexpert.com/study/bgpz30.html)

## 物理構成図
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/b74c480a-a182-3767-3d43-6d7b0153a25d.jpeg)

環境はCMLで以下のように構成しています。
CSR1000-V（ルータ）×7
Alpine Linux（デスクトップ）×5
※CMLはネットワーク機器のシミュレートをするサービスでCisco社が有償で提供しています。

スタブASであるRT1、RT6、RT7の先には、PCを設置します。
PC1（10.1.0.1/24）
PC2（10.2.0.1/24）
PC3（10.3.0.1/24）
PC4（10.200.0.1/24）
PC5（10.100.0.1/28）

今回はRT1の先に、10.1.0.0/24、10.200.0.0/24のネットワーク、RT7の先に、10.3.0.0/24、10.100.0.0/28のネットワークを配置してみました。

## フィルタリングの設計

[前回](https://qiita.com/coco0922/items/a943abb6e294c3703be3)までに、RT1とRT7をお互いに通信させないという要件を達成しました。今回達成したい要件は以下となります。

①PC4（10.200.0.1/24）をPC2（10.2.0.1/24）と通信できないようにする
②RT1側でフィルタリングをしない

また、[前回の内容](https://qiita.com/coco0922/items/a943abb6e294c3703be3)はRT1とRT7をAS_PATH ACLで通信させないようにしましたが、今回もこの設定を保持し、引き続き、RT1とRT7間では、通信できないようにしています。

## BGPの設定
CMLでは下記のような画面になっています。
※desktop-0をPC1、desktop-1をPC2、desktop-2をPC3、desktop-3をPC4、desktop-4をPC5、として設定しています。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533510/577d54b1-6bd7-9419-daa7-c2327792b49d.jpeg)

この構成についての具体的なコンフィグは前回の記事に記載しています。
今回は、PC4とPC5が追加されたため、それに関連する設定を記載します。

```:RT1
RT7(config)#router bgp 100
RT7(config-router)#net 10.200.0.0 mask 255.255.255.0
```
```:RT7
RT7(config)#router bgp 500
RT7(config-router)#net 10.100.0.0 mask 255.255.255.240
```
現状の設定では、フィルタがかけられていないため、PC4からPC2へ通信できています。
```:RT4
PC4:/home/cisco# ping 10.2.0.1
PING 10.2.0.1 (10.2.0.1): 56 data bytes
64 bytes from 10.2.0.1: seq=1 ttl=60 time=2.640 ms
64 bytes from 10.2.0.1: seq=2 ttl=60 time=3.336 ms
64 bytes from 10.2.0.1: seq=3 ttl=60 time=2.642 ms
```

## Distribute-Listの設定

RT3のshow ip bgpの結果から、10.200.0.0/24の経路を受信していることが確認できます。

```:RT3
RT3#sh ip bgp
BGP table version is 16, local router ID is 10.30.2.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
              t secondary path, L long-lived-stale,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i  10.1.0.0/24      10.20.0.1                0    200      0 100 i
 *                     10.10.2.1                0             0 100 i
 *>i  10.2.0.0/24      10.20.0.1                0    200      0 300 400 i
 *                     10.30.2.2                              0 300 400 i
 * i  10.3.0.0/24      10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 * i  10.10.1.0/24     10.20.0.1                0    100      0 100 i
 *>                    10.10.2.1                0             0 100 i
 r i  10.10.2.0/24     10.20.0.1                0    100      0 100 i
 r>                    10.10.2.1                0             0 100 i
 *    10.30.1.0/24     10.30.2.2                              0 300 i
 *>i                   10.20.0.1                0    100      0 i
 *>   10.30.2.0/24     0.0.0.0                  0         32768 i
 *>   10.50.1.0/24     10.30.2.2                              0 300 i
 * i                   10.20.0.1                0    100      0 300 i
 * i  10.50.2.0/24     10.20.0.1                0    100      0 300 i
 *>                    10.30.2.2                0             0 300 i
 * i  10.60.1.0/24     10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 r i  10.60.2.0/24     10.20.0.1                0    100      0 500 i
 r>                    10.60.2.1                0             0 500 i
 * i  10.100.0.0/28    10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 * i  10.200.0.0/24    10.20.0.1                0    100      0 100 i
 *>                    10.10.2.1                0             0 100 i
```
10.200.0.0/24の経路を受信しないようにするには、経路を広報しているBGPネイバーに対してIN方向にDistribute-Listを設定して、経路を受信しないようにします。
※許可する経路だけをACLで設定して、マッチしない経路を受信しないように設定しています。

```:RT2
RT2(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT2(config)# access-list 1 permit 10.3.0.0 0.0.0.255
RT2(config)# access-list 1 permit 10.100.0.0 0.0.0.15
RT2(config)#router bgp 200
RT2(config-router)#neighbor 10.10.1.1 distribute-list 1 in
RT2(config-router)#neighbor 10.60.1.1 distribute-list 1 in
```
```:RT3
RT3(config)# access-list 1 permit 10.1.0.0 0.0.0.255
RT3(config)# access-list 1 permit 10.3.0.0 0.0.0.255
RT3(config)# access-list 1 permit 10.100.0.0 0.0.0.15
RT3(config)#router bgp 200
RT3(config-router)#neighbor 10.10.2.1 distribute-list 1 in
RT3(config-router)#neighbor 10.60.2.1 distribute-list 1 in
```
フィルタ設定後は、BGPテーブルから10.200.0.0/24が消えていることが確認できます。
```
RT3#clear ip bgp * soft
RT3#sh ip bgp
BGP table version is 21, local router ID is 10.30.2.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
              t secondary path, L long-lived-stale,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i  10.1.0.0/24      10.20.0.1                0    200      0 100 i
 *                     10.10.2.1                0             0 100 i
 *>i  10.2.0.0/24      10.20.0.1                0    200      0 300 400 i
 *                     10.30.2.2                              0 300 400 i
 * i  10.3.0.0/24      10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 *    10.30.1.0/24     10.30.2.2                              0 300 i
 *>i                   10.20.0.1                0    100      0 i
 *>   10.30.2.0/24     0.0.0.0                  0         32768 i
 *>   10.50.1.0/24     10.30.2.2                              0 300 i
 * i                   10.20.0.1                0    100      0 300 i
 * i  10.50.2.0/24     10.20.0.1                0    100      0 300 i
 *>                    10.30.2.2                0             0 300 i
 *>i  10.60.1.0/24     10.20.0.1                0    100      0 500 i
 r>i  10.60.2.0/24     10.20.0.1                0    100      0 500 i
 * i  10.100.0.0/28    10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
```
10.200.0.0/24が、RT2、RT3が10.200.0.0/24の経路を受け取らなくなることで、RT2、RT3とPC4間で通信が取れなくなりますので、PC2と PC4が通信できなくなりました。
```:RT4
PC4:/home/cisco# ping 10.30.1.1 -c 3
PING 10.30.1.1 (10.30.1.1): 56 data bytes

--- 10.30.1.1 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
PC4:/home/cisco# ping 10.2.0.1 -c 3
PING 10.2.0.1 (10.2.0.1): 56 data bytes

--- 10.2.0.1 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
```
PC1、PC3、PC5はPC2と通信できていることがわかります。
```:PC1
PC1:/home/cisco# ping 10.2.0.1
PING 10.2.0.1 (10.2.0.1): 56 data bytes
64 bytes from 10.2.0.1: seq=0 ttl=60 time=2.540 ms
64 bytes from 10.2.0.1: seq=1 ttl=60 time=2.658 ms
64 bytes from 10.2.0.1: seq=2 ttl=60 time=3.124 ms
```
```
PC3:/home/cisco# ping 10.2.0.1
PING 10.2.0.1 (10.2.0.1): 56 data bytes
64 bytes from 10.2.0.1: seq=0 ttl=60 time=2.706 ms
64 bytes from 10.2.0.1: seq=1 ttl=60 time=2.499 ms
64 bytes from 10.2.0.1: seq=2 ttl=60 time=2.562 ms
```
```:PC5
PC5:/home/cisco# ping 10.2.0.1
PING 10.2.0.1 (10.2.0.1): 56 data bytes
64 bytes from 10.2.0.1: seq=0 ttl=60 time=2.775 ms
64 bytes from 10.2.0.1: seq=1 ttl=60 time=2.487 ms
64 bytes from 10.2.0.1: seq=2 ttl=60 time=2.499 ms
```
## Prefix-Listの設定
上記のDistribute-Listの設定により、要件自体は満たすことができました。しかしながら、上記のように、許可する対象が増えるたびに、ACLの設定をするのでは、運用面に支障が出ますし、ACLよりもPrefix-Listを使用したほうが処理が高速になります。
下記では、Prefix-Listを設定することでより柔軟に経路のフィルタリングを設定したいと思います。例えば、今回の構成では、仮に、10.0.0.0 ~ 10.127.255.255のアドレスを持つネットワークの中で/24以上の経路を全て許可し、それ以外のネットワークをフィルタするという運用にするとします。
この場合、ACLでは、上記の範囲のネットワークが新設されるたびにACLを設定しなければなりませんが、Prefix-Listでは、より少ない設定で、条件を満たすことができ、一度設定したレンジ内の経路情報の追加であれば、追加の設定は不要です。

先ほど設定したDistribute-Listの設定は外します。
```:RT2
RT2(config)#router bgp 200
RT2(config-router)#no neighbor 10.10.1.1 distribute-list 1 in
RT2(config-router)#no neighbor 10.60.1.1 distribute-list 1 in
```
```:RT3
RT3(config)#router bgp 200
RT3(config-router)#no neighbor 10.10.2.1 distribute-list 1 in
RT3(config-router)#no neighbor 10.60.2.1 distribute-list 1 in
```
Distribute-Listを外したことで、再び10.200.0.0/24の経路を受信するようになります。
```:RT3
RT3#clear ip bgp * soft
RT3#sh ip bgp
BGP table version is 26, local router ID is 10.30.2.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
              t secondary path, L long-lived-stale,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i  10.1.0.0/24      10.20.0.1                0    200      0 100 i
 *                     10.10.2.1                0             0 100 i
 *>i  10.2.0.0/24      10.20.0.1                0    200      0 300 400 i
 *                     10.30.2.2                              0 300 400 i
 * i  10.3.0.0/24      10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 *>   10.10.1.0/24     10.10.2.1                0             0 100 i
 r>   10.10.2.0/24     10.10.2.1                0             0 100 i
 *    10.30.1.0/24     10.30.2.2                              0 300 i
 *>i                   10.20.0.1                0    100      0 i
 *>   10.30.2.0/24     0.0.0.0                  0         32768 i
 *>   10.50.1.0/24     10.30.2.2                              0 300 i
 * i                   10.20.0.1                0    100      0 300 i
 * i  10.50.2.0/24     10.20.0.1                0    100      0 300 i
 *>                    10.30.2.2                0             0 300 i
 *>   10.60.1.0/24     10.60.2.1                0             0 500 i
 * i                   10.20.0.1                0    100      0 500 i
 r>   10.60.2.0/24     10.60.2.1                0             0 500 i
 r i                   10.20.0.1                0    100      0 500 i
 * i  10.100.0.0/28    10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 *>   10.200.0.0/24    10.10.2.1                0             0 100 i
```
今度は下記のように、Prefix-Listで設定してみます。
冒頭で述べた通り、Prefix-Listでは、ネットワークとサブネットマスクの両方でマッチする経路を判定することができます。
例えば、下記のように、10.0.0.0/9 ge 24のように記述すると、アドレスビットとして、10.0.0.0/9のもの＋サブネットマスクとして24以上になるものがマッチされます。このようにすることで、要件の10.0.0.0 ~ 10.127.255.255のアドレスビットにマッチし、かつ、サブネットマスクが/24以上の経路のみを受信するように設定することができます。

```:RT2
RT2(config)#ip prefix-list Permit-PL permit 10.0.0.0/9 ge 24
RT2(config)#router bgp 200
RT2(config-router)#neighbor 10.10.1.1 prefix-list Permit-PL in
RT2(config-router)#neighbor 10.60.1.1 prefix-list Permit-PL in
```
```:RT3
RT3(config)#ip prefix-list Permit-PL permit 10.0.0.0/9 ge 24
RT3(config)#router bgp 200
RT3(config-router)#neighbor 10.10.1.1 prefix-list Permit-PL in
RT3(config-router)#neighbor 10.60.1.1 prefix-list Permit-PL in
```

```:RT3
RT3#clear ip bgp * soft
RT3#sh ip bgp
BGP table version is 70, local router ID is 10.30.2.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
              t secondary path, L long-lived-stale,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>i  10.1.0.0/24      10.20.0.1                0    200      0 100 i
 *                     10.10.2.1                0             0 100 i
 *>i  10.2.0.0/24      10.20.0.1                0    200      0 300 400 i
 *                     10.30.2.2                              0 300 400 i
 * i  10.3.0.0/24      10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 * i  10.10.1.0/24     10.20.0.1                0    100      0 100 i
 *>                    10.10.2.1                0             0 100 i
 r i  10.10.2.0/24     10.20.0.1                0    100      0 100 i
 r>                    10.10.2.1                0             0 100 i
 *    10.30.1.0/24     10.30.2.2                              0 300 i
 *>i                   10.20.0.1                0    100      0 i
 *>   10.30.2.0/24     0.0.0.0                  0         32768 i
 *>   10.50.1.0/24     10.30.2.2                              0 300 i
 * i                   10.20.0.1                0    100      0 300 i
 * i  10.50.2.0/24     10.20.0.1                0    100      0 300 i
 *>                    10.30.2.2                0             0 300 i
 * i  10.60.1.0/24     10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
 r i  10.60.2.0/24     10.20.0.1                0    100      0 500 i
 r>                    10.60.2.1                0             0 500 i
 * i  10.100.0.0/28    10.20.0.1                0    100      0 500 i
 *>                    10.60.2.1                0             0 500 i
```
Prefix-Listを使用することで、ACLより高速に処理され、設定の行数も少なく済むメリットがあります。両者の違いについて下記の記事を参考にするのが良いかと思います。
[アクセスリストとプレフィックスリストの違い](http://ccnpnimukete.seesaa.net/article/364854463.html)
[Cisco ip prefix-list コマンドの解説](https://www.infraexpert.com/study/routecontrol07.html)