Transit GatewayとVRA間でGREを張り、BGPで経路交換する

# はじめに
Transit Gatewayには、Classic Infrastructure上のコンポーネントとの間でGREを張る機能があるので試してみました。
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-GRE-connection&interface=ui

構成の概要図は下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/b598d2cd-2b8a-db4a-fbc4-f9ae7db16080.png)

[追記]
この機能をベースにした[応用編](https://qiita.com/y_tama/items/ed31cc909afcce66c862)を書きました。

# Transit Gatewayの構成
GREを作成する前の段階で、Transit Gatewayには下記のConnectionを作っておきます。

2022/12/2追記　Classic InfrastructureへのConnectionが無くてもGREを張れるようになりました。
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-unbound-gre-connection&interface=ui
~~・Classic Infrastructure（Transit GatewayからGREを張る事ができる相手はClassic上のコンポーネントに限られるため、前提としてClassicへのConnectionが必要です）~~
・PowerVSから繋がっているDirect Link

Transit Gatewayで、Unbound GRE TunnelタイプのConnectionを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/87cb9bfd-24ff-2687-9ef8-a3aa64d273de.png)

Base networkとして、Classic infrastructureを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7f9d054a-e4e5-f18b-0f45-7bb4868a161a.png)


GREのパラメータを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/ed67b7ec-a311-9552-1a7e-23f55d069673.png)

**Zone**: Transit Gatewayは暗黙的にマルチゾーンで稼働しているサービスですが、GREを終端するのはいずれか1つのゾーンになりますので、選択します。今回はTokyo 2にします。ちなみに、終端するゾーンにより、Transit Gateway側のBGP ASNが異なります。

**Remote BGP ASN**: VRA側で使うBGP ASNになります。指定はoptionalで、指定しない場合は自動的に決定されます。

**Local gateway IP**: Transit Gateway側のアンダーレイネットワークのIPアドレスとして使われます。（他のアンダーレイネットワークのIPと重複がないようにユーザーが指定します。）

**Remote gateway IP**: GREを張る相手となるVRAのIPアドレスです。

**Local tunnel IP**, **Remote tunnel IP**: GREトンネル内で使われるIPアドレスです。

Transit GatewayにGREタイプのConnectionが作られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/94040dac-00ff-08bc-ade4-8577e7b36886.png)


# VRAの構成
上記の情報を使い、VRA側でGREとBGPの設定を行います。

Transit Gatewayに設定したアンダーレイのIPアドレス（今回は192.168.231.5）宛のパケットのnext hopがBCRになるよう静的経路を追加します。今回の環境では10.132.163.193がBCRのIPアドレスです。

```
set protocols static route 192.168.231.5/32 next-hop 10.132.163.193
```

GREトンネルを設定。remote-ipにはTransit GatewayのアンダーレイネットワークのIPを指定します。

```
set interfaces tunnel tun0 address 192.168.100.1/30
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 local-ip 10.132.163.242
set interfaces tunnel tun0 remote-ip 192.168.231.5
```

BGPを設定。
neighborは、GREトンネルのTransit Gateway側IP（今回は192.168.100.2）を指定します。
VRAのASNには、先ほどTransit Gateway側でGREを作成した時に指定した（あるいはTransit Gatewayが自動で払い出した）Remote BGP ASNの値を指定します。
今回、VRAからは192.168.170.0/24を広告することにします。

```
set protocols bgp 4205000063 address-family ipv4-unicast network 192.168.170.0/24
set protocols bgp 4205000063 neighbor 192.168.100.2 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp 4205000063 neighbor 192.168.100.2 remote-as 4201065555
set protocols bgp 4205000063 parameters extended-asn-capability
```

なお、上記でextended-asn-capabilityのパラメータを指定しない場合、commit時に下記のエラーになりました。
> Extended ASN Capability must be enabled for configuring ASN greater than 65535

設定は以上で、以下は確認です。

# 確認

GRE確認
```
vyatta@vra02:~$ show interfaces tunnel
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface       IP Address                        S/L  Speed/Duplex  Description
---------       ----------                        ---  ------------  -----------
tun0            192.168.100.1/30                  u/u  -/-           
vyatta@vra02:~$ 
```

GRE確認
```
vyatta@vra02:~$ show interfaces tunnel detail
tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1000
    link/gre 10.132.163.242 peer 192.168.231.5
    inet 192.168.100.1/30 brd 192.168.100.3 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::5efe:a84:a3f2/64 scope link 
       valid_lft forever preferred_lft forever

    RX:  bytes    packets     errors    ignored    overrun      mcast
         96495       1082          0          0          0          0
    TX:  bytes    packets     errors    dropped    carrier collisions
         79438        949          0          0          0          0
vyatta@vra02:~$ 
```

BGP確認
```
vyatta@vra02:~$ show ip bgp

BGP table version is 4, local router ID is 192.168.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
              l - labeled, S Stale, b - backup, x - best external
Origin codes: i - IGP, e - EGP, ? - incomplete

IPv4 Unicast address family:
    Network          Next Hop            Metric    LocPrf       Weight Path
*>  192.168.150.0    192.168.100.2        0        100          0       4201065555 64999 64997 64998 ?
*>  192.168.170.0    0.0.0.0                       100          32768    i

Total number of prefixes 2
vyatta@vra02:~$ 
```

BGP確認
```
vyatta@vra02:~$ show ip bgp neighbors 192.168.100.2
BGP neighbor is 192.168.100.2, remote AS 4201065555, local AS 4205000063, external link
  BGP version 4, remote router ID 10.0.13.29
  BGP state = Established, up for 01:40:26
  Last read 01:40:26, hold time is 90, keepalive interval is 30 seconds
  Neighbor capabilities:
    Route refresh: advertised and received (old and new)
    4-Octet ASN Capability: advertised and received
    Address family IPv4 Unicast: advertised and received
  Received 204 messages, 0 notifications, 0 in queue
  Sent 204 messages, 0 notifications, 0 in queue
  Route refresh request: received 0, sent 0
  Minimum time between advertisement runs is 30 seconds
 For address family: IPv4 Unicast
  BGP table version 4, neighbor version 4
  Index 1, Offset 0, Mask 0x2
    Graceful restart: received
  Inbound soft reconfiguration allowed
  Community attribute sent to this neighbor (both)
  1 accepted prefixes
  1 announced prefixes

 Connections established 1; dropped 0
Local host: 192.168.100.1, Local port: 54350
Foreign host: 192.168.100.2, Foreign port: 179
Nexthop: 192.168.100.1
Nexthop global: ::
Nexthop local: fe80::5efe:a84:a3f2
BGP connection: non shared network

vyatta@vra02:~$ 
```

BGPで受け取っている経路情報。PowerVS（192.168.150.0/24）へのルート情報を受け取っています。
```
vyatta@vra02:~$ show ip bgp neighbors 192.168.100.2 received-routes

BGP table version is 4, local router ID is 192.168.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

IPv4 Unicast address family:
    Network          Next Hop            Metric    LocPrf       Weight Path
*>  192.168.150.0    192.168.100.2                 100          0       4201065555 64999 64997 64998 ?

Total number of prefixes 1
vyatta@vra02:~$
```

BGPで送っている経路情報
```
vyatta@vra02:~$ show ip bgp neighbors 192.168.100.2 advertised-routes

BGP table version is 4, local router ID is 192.168.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

IPv4 Unicast address family:
    Network          Next Hop            Metric    LocPrf       Weight Path
*>  192.168.170.0    192.168.100.1                 100          32768    i

Total number of prefixes 1
vyatta@vra02:~$ 

```

VRAのルーティングテーブル確認。
Bで始まる行がBGPで受け取った経路情報です。
PowerVS（192.168.150.0/24）宛のパケットを、next hopであるGREの対向IP（192.168.100.2）に送る設定になっているのが分かります。
```
vyatta@vra02:~$ show ip route
Codes: K - kernel, C - connected, S - static, D - DHCP, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       L - LDP, V - RSVP-TE, I - IGP shortcut
       > - selected route, * - FIB route, p - stale info


（略）
C    *> 192.168.100.0/30 is directly connected, tun0
B    *> 192.168.150.0/24 [20/0] via 192.168.100.2, tun0, 00:31:14
S    *> 192.168.231.5/32 [1/0] via 10.132.163.193, dp0bond0
vyatta@vra02:~$ 
```

Transit Gatewayにも、VRAからGRE経由で192.168.170.0/24への経路情報が渡されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/09c0c3a4-2017-06b9-85eb-a1a2f6deb72a.png)

以上