Transit Gateway ConnectでAWS Transit GatewayにGREトンネル経由でルート伝搬してみる

本ブログではSD-WAN向けの新機能Transit Gateway Connectを用いてEC2のソフトウェア処理でTGWにルーティング情報を伝搬させてみます。
2020.12.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストのソラコム大瀧です。
re:Inventのさなか、AWS Transit Gatewayの新機能としてTransit Gateway Connectがリリースされました。AWS Transit Gateway(以下TGW)は、VPC、Direct Connect Gateway、Site-to-Site VPN(IPsec)を相互接続できるネットワークコンポーネントで、これまでソフトウェアによる仮想ネットワークとの連携には物理的制約のないIPsec VPNが好んで利用されてきました。Transit Gateway ConnectはIPsec VPNよりパフォーマンス面で有利かつシンプルな新しい連携形式として、主にSD-WAN製品向けに利用できる機能です。

本ブログではまずその様子を確認するために、EC2のソフトウェア処理でTGWにルーティング情報を伝搬させてみます。

Transit Gateway Connectの仕組み

Transit Gateway ConnectはTGWアタッチメントのひとつとして、TGWに追加して構成します。TGWとはGREトンネルを介してBGPでルート情報を広告しますが、GREのトラフィックは暗号化されないためTGWと安全に通信するために、他のTGWアタッチメントをトランスポートアタッチメントとして利用する特徴があります。図で示すと以下の通りです。

というわけで、Transit Gateway Connectを使うためには、以下が必要です。

  • Transit Gateway ConnectをサポートするリージョンのTGW
    • 2020/12/15時点では US East (N. Virginia), US West (N. California), US West (Oregon), and Europe (Ireland) です。
  • トランスポートアタッチメントとして利用する既存のTGWアタッチメント(VPCとDirect Connect Gatewayのどちらかで、VPNはサポートされません)
  • ピアとなるホスト

今回はピアとなるホストとして、以下のEC2インスタンスとソフトウェアを利用しました。

  • リージョン : オレゴンリージョン
  • AMI : ami-03c1b544a7566b3e5 (ubuntu/images/hvm-ssd/ubuntu-focal-20.04-arm64-server-20201026)
  • GRE : Netplan
  • BGP : gobgp version 2.22.0

では、TGWとVPC、VPCへのTGWアタッチメントはそれぞれ作成済みとし、手順を追って設定していきます。

1. TGWとVPCの準備

Transit Gateway Connect作成の前にVPCとTGWの事前準備を行います。Transit Gateway ConnectではGREトンネルでピアから接続するためのリモートIPアドレスをピアごとにTGWに割り振るため、準備としてはCIDR(IPアドレスのプール)をTGWに設定します。TGW管理画面からTGWの変更(Modify)を選択し、一番下の項目[Transit Gateway CIDR blocks]の[CIDR]に他のアタッチメントと被らない任意のCIDRを入力し、[Modify transit gateway]ボタンをクリックして追加します。

続いて、Transit Gateway CIDR blockに到達するためのルーティングをVPCに追加します。これは通常のTGWへのルーティング追加と同様で、送信先にTransit Gateway CIDR block、ターゲットにTGWを指定すればOKです。(スクリーンショットには他のルーティングが映り込んでいますが、特に必要なものではありません)

2. Transit Gateway ConnectピアのEC2インスタンスの構成

続いて、Transit Gateway ConnectピアとなるEC2インスタンスを構成します。GREの通信ができれば良いので、セキュリティグループのインバウンドルールでGREのプロトコル番号47をターゲットTransit Gateway CIDR blockから許可する設定を追加します。

このあとTGW Connectにピアを登録するため、インスタンスのプライベートIPを控えておきましょう。(今回の構成では、172.30.2.126)

3. Transit Gateway Connectの追加

では、TGWにTransit Gateway Connectを追加し、ピアを登録します。VPC管理画面のメニューから[Transit Gateway接続]を選択し、[Create Transit Gateway Attachment]ボタンをクリックします。作成画面では、[Transit Gateway ID]でTGWを選択、[Attachment type]で「Connect」、[Transport Attachment ID]でトランスポートアタッチメントとして利用するTGWアタッチメントを選択します。

続いて、作成したTransit Gateway Connectにピアを登録します。[Connect Peers]タブを開き、「Create Connect Peer」ボタンをクリックします。

設定項目がそれなりにありますが、*マークの必須項目以外は自動で採番されるのでお任せにします。以下の項目を入力し「Create」で作成します。

  • Peer GRE address : 手順2で確認したEC2インスタンスのプライベートIP
  • BGP Inside CIDR blocks IPv4 : 169.254.0.0/16のうち予約アドレス以外の/29のCIDRを入力

登録したピアのプロパティにこのあと設定する各項目が表示されます。横長のテーブル表示でスクリーンショットに収めにくいため(実際の画面では右にスクロールして見ます)、以下に箇条書きしますw

項目名 説明
Transit Gateway GRE address Transit Gateway CIDR blockから採番されたGREトンネルのリモートIPアドレス 192.168.151.181
Peer GRE address EC2インスタンスのプライベートIP 172.30.2.126
BGP Inside CIDR blocks GREトンネル内リンクローカルアドレスのCIDR 169.254.6.0/29
Transit Gateway ASN TGW側のBGP ASナンバー 64512
Peer ASN ピアのBGP ASナンバー(自動選択の場合はTGWと同一になりiBGPになる) 64512
Peer BGP address ピアのBGPアドレス(リンクローカルアドレス) 169.254.6.1
Transit Gateway BGP 1 address TGWの1つ目のBGPアドレス 169.254.6.2
Transit Gateway BGP 2 address TGWの2つ目のBGPアドレス 169.254.6.3

この情報を元に、ピアのEC2インスタンスでGREとBGPを構成していきます。

4. ConnectピアのGRE、BGP構成

EC2にSSH接続し、GREトンネルとBGPのルート広告を設定します。まずは手順3のGREの設定を引用して以下のファイルを作成しGREトンネルを設定します。

/etc/netplan/gre.yaml

network:
    tunnels:
        gre1:
            mode: gre
            local: 172.30.2.126
            remote: 192.168.151.181
            mtu: 8476
            addresses:
                - 169.254.6.1/29

以下のコマンドで適用します。

$ sudo netplan apply
$ ip a show gre1
6: gre1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8476 qdisc noqueue state UNKNOWN group default qlen 1000
    link/gre 172.30.2.126 peer 192.168.151.181
    inet 169.254.6.1/29 brd 169.254.6.7 scope global gre1
       valid_lft forever preferred_lft forever
$

OKですね、続いてBGPはgobgpでルート広告を設定します(実際のLinuxのルーティング操作にはQuagga/FRRoutingの設定が必要ですが今回は動作確認のため割愛します)。以下のコマンドでgobgpをダウンロードし、カレントディレクトリに配置しました。

$ wget https://github.com/osrg/gobgp/releases/download/v2.22.0/gobgp_2.22.0_linux_arm64.tar.gz
$ tar zxf gobgp_2.22.0_linux_arm64.tar.gz
$ ls
LICENSE  README.md  gobgp  gobgp_2.22.0_linux_arm64.tar.gz  gobgpd
$

手順3のBGPの設定を引用して、以下のファイルを作成します。

gobgpd.conf

[global.config]
  as = 64512
  router-id = "169.254.6.1"

[[neighbors]]
  [neighbors.config]
    neighbor-address = "169.254.6.2"
    peer-as = 64512

[[neighbors]]
  [neighbors.config]
    neighbor-address = "169.254.6.3"
    peer-as = 64512

ではファイルを読み込んでデーモン(gobgpd)を実行します。

$ sudo ./gobgpd -f gobgpd.conf
{"level":"info","msg":"gobgpd started","time":"2020-12-14T21:59:03Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2020-12-14T21:59:03Z"}
{"level":"info","msg":"Peer 169.254.6.2 is added","time":"2020-12-14T21:59:03Z"}
{"Topic":"Peer","level":"info","msg":"Add a peer configuration for:169.254.6.2","time":"2020-12-14T21:59:03Z"}
{"level":"info","msg":"Peer 169.254.6.3 is added","time":"2020-12-14T21:59:03Z"}
{"Topic":"Peer","level":"info","msg":"Add a peer configuration for:169.254.6.3","time":"2020-12-14T21:59:03Z"}
{"Key":"169.254.6.3","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2020-12-14T21:59:10Z"}
{"Key":"169.254.6.2","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2020-12-14T21:59:12Z"}

この時点でBGPセッションが確立されるため、Connectピア画面のBGPステータスが UP に変わるはずです。

続いてルーティングを広告するために別ターミナルを立ち上げ、CLI(gobgp)でルーティングエントリー10.128.0.0/10を追加します。

$ ./gobgp global rib add 10.128.0.0/10 nexthop 169.254.6.1 origin igp aspath 100

なお、AS-PATHを空欄にするとTGWルーティングテーブルに伝搬されなかったので、適当なASを入れてみました。MED値、Local Preferenceは無しでも大丈夫でした。ドキュメントでもECMPのためにAS-PATHを設定せよとあります。

ルーティング一覧を見てみると。。。

$ ./gobgp global rib
   Network              Next Hop             AS_PATH              Age        Attrs
*> 10.128.0.0/10        169.254.6.1          100                  00:01:43   [{Origin: i}]
*> 172.30.0.0/16        169.254.6.2                               00:01:50   [{Origin: i} {Med: 100} {LocalPref: 100}]
*  172.30.0.0/16        169.254.6.3                               00:01:52   [{Origin: i} {Med: 100} {LocalPref: 100}]
$

インスタンスからは広告できているようです。TGWルーティングテーブルを見てみると。。。

おおー、追加されました!

まとめ

SD-WAN向けの新機能Transit Gateway Connectを用いてEC2のソフトウェア処理でTGWにルーティング情報を伝搬させてみました。実案件ではサードパーティのSD-WANアプライアンスを利用することになると思いますが、動作原理を理解するために今回のような実験をしてみるのも良いのではないでしょうか。