てくなべ (tekunabe)

ansible / network automation / 学習メモ

[AWS] Transit Gateway とオンプレの VPN 接続を試してみた

はじめに

AWSVPCVPN で接続する方法自体は、以前から仮想プライベートゲートウェイ(VGW)経由の方法がありました。

2018年に Transit Gateway というものを経由する方法もできてたことを知りました。

Transit Gateway を利用する場合は、VPC ごとに VGW、VPN を作成しなくてよく、効率的なようです。

そこで、雰囲気を掴みたく、Transit Gateway とオンプレの VPN 接続を試してみました。

設定手順

基本的には、以下の記事を参考にさせていただきました。

dev.classmethod.jp

私の環境の場合は、接続したい VPC 配下のサブネットが利用しているルートテーブルに、作成した Transit Gateway に向けるルートを追加しました。 (うまくやれば自動反映されるのでしょうか・・?)(追記: ルートテーブルの伝搬を有効にすれば反映されたはず)

f:id:akira6592:20210103113706p:plain
Transit Gateway をターゲットとしたルートエントリ

VPC は2つ(10.0.0.0/16、10.2.0.0/16)アタッチしました。

なお、オンプレ側のルーターは、固定IPを振った RTX 1200 を利用しました。コンフィグは、AWS 側の画面で生成されてダウンロードしたものをベースにしました。


確認

AWS

VPN 接続では、2つのトンネルがアップしました。

f:id:akira6592:20210103113640p:plain
トンネルのアップ

Transit Gateway 接続では、アタッチした2つの VPC(10.0.0.0/16、10.2.0.0/16)と、オンプレのルーターから広報された2つの経路(192.168.1.0/24、192.168.100.0/24)が掲載されました。

f:id:akira6592:20210103113749p:plain
VPC 側とオンプレ側のルート

ルーター

tunnel 1tunnle 2 それぞれ Online

rtx# show status tunnel 1
TUNNEL[1]: 
Description: 
  Interface type: IPsec
  Current status is Online.
  from 2021/01/02 20:38:10.
  15 hours 3 minutes 43 seconds  connection.
  Received:    (IPv4) 12378 packets [782025 octets]
               (IPv6) 0 packet [0 octet]
  Transmitted: (IPv4) 12091 packets [740159 octets]
               (IPv6) 0 packet [0 octet]
rtx# 
rtx# show status tunnel 2
TUNNEL[2]: 
Description: 
  Interface type: IPsec
  Current status is Online.
  from 2021/01/02 20:34:25.
  15 hours 7 minutes 38 seconds  connection.
  Received:    (IPv4) 14017 packets [942791 octets]
               (IPv6) 0 packet [0 octet]
  Transmitted: (IPv4) 16045 packets [1147258 octets]
               (IPv6) 0 packet [0 octet]

2つの BGP ネイバーは Established

rtx# show status bgp neighbor 
BGP neighbor is 169.254.140.1, remote AS 64512, local AS 65000, external link
  BGP version 4, remote router ID 169.254.140.1
  BGP state = Established, up for 00:46:42
  Last read 00:00:01, hold time is 30, keepalive interval is 10 seconds
  Received 283 messages, 0 notifications, 0 in queue
  Sent 285 messages, 0 notifications, 0 in queue
  Connection established 3; dropped 2
  Last reset 01:31:55
Local host: 169.254.140.2, Local port: 179
Foreign host: 169.254.140.1, Foreign port: 39273

BGP neighbor is 169.254.65.129, remote AS 64512, local AS 65000, external link
  BGP version 4, remote router ID 169.254.65.129
  BGP state = Established, up for 04:36:03
  Last read 00:00:03, hold time is 30, keepalive interval is 10 seconds
  Received 1658 messages, 0 notifications, 0 in queue
  Sent 1661 messages, 0 notifications, 0 in queue
  Connection established 2; dropped 1
  Last reset 05:21:17
Local host: 169.254.65.130, Local port: 179
Foreign host: 169.254.65.129, Foreign port: 42405

2つの VPC の分を受信し、オンプレから 2つの経路を広報。

rtx# show status bgp neighbor 169.254.140.1 received-routes 
Total routes: 2
*: valid route
  Network            Next Hop        Metric LocPrf Path
  10.0.0.0/16        169.254.140.1      100        64512 IGP
  10.2.0.0/16        169.254.140.1      100        64512 IGP
rtx# 
rtx# show status bgp neighbor 169.254.140.1 advertised-routes 
Total routes: 2
*: valid route
  Network            Next Hop        Metric LocPrf Path
* 192.168.1.0/24     169.254.140.2                 65000 IGP
* 192.168.100.0/24   169.254.140.2                 65000 IGP

rtx# show status bgp neighbor 169.254.65.129 received-routes 
Total routes: 2
*: valid route
  Network            Next Hop        Metric LocPrf Path
* 10.0.0.0/16        169.254.65.129     100        64512 IGP
* 10.2.0.0/16        169.254.65.129     100        64512 IGP
rtx# 
rtx# show status bgp neighbor 169.254.65.129 advertised-routes 
Total routes: 2
*: valid route
  Network            Next Hop        Metric LocPrf Path
* 192.168.1.0/24     169.254.65.130                65000 IGP
* 192.168.100.0/24   169.254.65.130                65000 IGP

ルーティングテーブルには tunnel 2 に向く経路が載っています。

rtx# show ip route 
Destination         Gateway          Interface       Kind  Additional Info.
default             -                    PP[01]    static  
10.0.0.0/16         169.254.65.129    TUNNEL[2]       BGP  path=64512
10.2.0.0/16         169.254.65.129    TUNNEL[2]       BGP  path=64512
169.254.65.128/30   -                 TUNNEL[2]  implicit  
169.254.140.0/30    -                 TUNNEL[1]  implicit  
...(略)...

エンドツーエンド

オンプレ側のマシン(192.168.100.2)から、各 VPC 内のインスタンスへの ping が無事通過。

[root@awx-try ~]# ping 10.0.1.10
PING 10.0.1.10 (10.0.1.10) 56(84) bytes of data.
64 bytes from 10.0.1.10: icmp_seq=1 ttl=252 time=9.76 ms
64 bytes from 10.0.1.10: icmp_seq=2 ttl=252 time=9.45 ms
64 bytes from 10.0.1.10: icmp_seq=3 ttl=252 time=9.45 ms
64 bytes from 10.0.1.10: icmp_seq=4 ttl=252 time=8.87 ms
[root@testsv ~]# 
[root@testsv ~]# ping 10.2.1.10
PING 10.2.1.10 (10.2.1.10) 56(84) bytes of data.
64 bytes from 10.2.1.10: icmp_seq=1 ttl=252 time=8.44 ms
64 bytes from 10.2.1.10: icmp_seq=2 ttl=252 time=10.1 ms
64 bytes from 10.2.1.10: icmp_seq=3 ttl=252 time=8.29 ms
64 bytes from 10.2.1.10: icmp_seq=4 ttl=252 time=8.16 ms


参考: awscli での設定手順

GUI であちこち設定画面を行き来するのが少しだけ手間だったので、 あとで、awscli でも同様のことができるか試しました。

Transit Gatetway の作成

まずは、Transit Gatetway を作成します。

aws ec2 create-transit-gateway --options="AmazonSideAsn=64512" --tag-specifications "ResourceType=transit-gateway,Tags=[{Key=Name,Value=tgw-test99}]"

戻り値の TransitGatewayId の値を控えておきます。

Customer Gateway の作成

GUI では、Create Transit Gateway Attachment 画面で、Customer Gateway の作成と Transit Gatetway との接続を同時に設定しました。

一方、awscli まず Customer Gateway を作成します。

aws ec2 create-customer-gateway --bgp-asn 65000 --public-ip ${カスタマーゲートウェイ側のIP}  --type ipsec.1 --tag-specifications "ResourceType=customer-gateway,Tags=[{Key=Name,Value=cgw-test99}]"

戻り値の CustomerGatewayId の値を控えておきます。

VPN 接続の作成

続いて VPN 接続を作成します。このとき、最初に作成した Transit Gateway の ID を --transit-gateway-id オプションで指定します。

aws ec2 create-vpn-connection  --type ipsec.1  --customer-gateway-id ${控えておいたCustomerGatewayId}  --transit-gateway-id ${控えておいたTransitGatewayId} --tag-specifications "ResourceType=vpn-connection,Tags=[{Key=Name,Value=vpn-test99}]"

これを実行したあと、VPN の設定画面の「設定のダウンロード」でダウンロードした、コンフィグをルーターに流し込みます。

(設定のダウンロードは自動化できるのでしょうか・・?戻り値の CustomerGatewayConfiguration 内の値と何かしらのテンプレートで生成できそうすが)

Transit Gatetway と VPC のアタッチ

Transit Gatetway と VPC にアタッチします。

aws ec2 create-transit-gateway-vpc-attachment  --vpc-id ${対象の VPC ID} --transit-gateway-id ${控えておいたTransitGatewayId} --subnet-ids ${対象のサブネットID} --tag-specifications "ResourceType=transit-gateway-attachment,Tags=[{Key=Name,Value=tgw-attach-vpc-test99}]"

ルートテーブルに Transit Gateway 追加

最後に、対象サブネットが利用するルートテーブルに、Transit Gateway をターゲットとするルートを追加します。ここではデフォゲとして設定します。

aws ec2 create-route --route-table-id ${対象のルートテーブルID} --destination-cidr-block  "0.0.0.0/0" --transit-gateway-id ${控えておいたTransitGatewayId}


おわりに

Transit Gateway を経由して、VPC とオンプレの間を VPN 接続で接続できることを試しました。

Transit Gateway をハブとした構成で接続できるのは便利なのだろうなと思いました。