BGP Flowspecの解説

BGP Flowspecについてざっと解説

BGP Flowspecでは条件とアクションをBGPのUPDATEメッセージに載せて送信できる。

# 条件
条件はRFC4760で定義されているMP_REACH_NLRIまたはMP_UNREACH_NLRIに記述する。

使用するAFIとSAFIそれぞれ下記の通りである。
AFI：1
SAFI：133
http://www.iana.org/assignments/safi-namespace/safi-namespace.xhtml
NextHopは使用しないのであれば、長さ0とする。

```:TYPE14
        +---------------------------------------------------------+
        | Address Family Identifier (2 octets)                    |
        +---------------------------------------------------------+
        | Subsequent Address Family Identifier (1 octet)          |
        +---------------------------------------------------------+
        | Length of Next Hop Network Address (1 octet)            |
        +---------------------------------------------------------+
        | Network Address of Next Hop (variable)                  |
        +---------------------------------------------------------+
        | Reserved (1 octet)                                      |
        +---------------------------------------------------------+
        | Network Layer Reachability Information (variable)       |
        +---------------------------------------------------------+
```
```:TYPE15
        +---------------------------------------------------------+
        | Address Family Identifier (2 octets)                    |
        +---------------------------------------------------------+
        | Subsequent Address Family Identifier (1 octet)          |
        +---------------------------------------------------------+
        | Withdrawn Routes (variable)                             |
        +---------------------------------------------------------+
```

条件として指定できる内容は下記がある。

- Type 1 - Destination Prefix
- Type 2 - Source Prefix
- Type 3 - IP Protocol
- Type 4 - Port
- Type 5 - Destination port
- Type 6 - Source port
- Type 7 - ICMP type
- Type 8 - ICMP code
- Type 9 - TCP flags
- Type 10 - Packet length
- Type 11 - DSCP (Diffserv Code Point)
- Type 12 - Fragment

※Type3はIPパケット中にあるプロトコルタイプの値の事
Type3-Type12については不等号などの比較演算子も使える。

各Typeを複数使った条件を作成する事も可能でその場合は原則AND評価になる。

条件を複数作成した場合、あるトラフィックが複数の条件にマッチする事もある。
そのような場合には若い番号のTypeを持つ条件が優先的にマッチされる。
Typeに優先度が同じ場合には次のルールで優先付が行われる。
Type1,Type2の場合には最小プレフィックスマッチ
それ以外のTypeの場合には最長文字列マッチ

# アクション
```:TYPE16
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Type high    |  Type low(*)  |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+          Value                |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```


- Type 0x8006 - traffic-rate
4バイトのフロートでBps単位でトラフィックレートを指定する。
0が指定された場合にはトラフィックの破棄を意味する。

- Type 0x8007 - traffic-action
TerminalビットとSampleビットがある。
Terminalビットがセットされている場合は後に続くアクションを適用し、セットされていない場合は、そこでアクションは終了する。
Sampleビットがセットされている場合はサンプリングとロギングを行う。

- Type 0x8008 - redirect
VRFへのトラフィックのリダイレクトを行う。リストにしてVRFを複数指定可能。
ただし、複数のVRFにリダイレクトさせることはできない。
RFC4360にあるRTと同様に処理される。

- Type 0x8000 - traffic-marking
IPパケットのDSCPのマーキング（あるいはリマーキング）

## 参考文献
RFC5575 Dissemination of Flow Specification Rules　https://tools.ietf.org/html/rfc5575
RFC4760 Multiprotocol Extensions for BGP-4  https://tools.ietf.org/html/rfc4760
RFC4360 BGP Extended Communities Attribute　https://tools.ietf.org/html/rfc4360
https://milestone-of-se.nesuke.com/nw-advanced/mpls-vpn/detail-of-mp-bgp/
http://www.hogetan.net/translate/bgpflowspec-1/bgpflowspec.html