VPC間でVPN接続してみた件

記事タイトルとURLをコピーする

こんにちは。技術5課の冨塚です。 最近寒さが続きなにもやる気がでない中ふとVPN接続ためしたので書き留めたいと思います。

AWS環境との通信するには以下の3つがあり、今回はVPN接続について記載します。

  • インターネットからアクセス
  • VPN接続してアクセス
  • DirectConnet接続してアクセス

VPN接続するにあたり、設定が必要なコンポーネントや対向装置への設定投入などやることを整理する意味でまとめていけたらと思います。

やりたいこと

AWSでサイト間VPN接続を実現したい

構成図

今回構築した環境の構成図が以下になります。

東京リージョンとバージニアリージョン間でVPN接続をしています。今回はバージニアリージョンをお客様データセンター設備などのオンプレミス環境と想定して構成してみました。単純にVPC間を接続したい場合はVPC ピアリング接続で実現可能です。 東京リージョンでは、VGW,CGWを利用して、バージニアリージョンではVyOSを利用してみました。 各リージョンのプライベートサブネットに配置したEC2同士が通信できればやりたいこと達成となります。

1.バージニアリージョン対応

この項ではバージニアリージョンでやったことを記載します。

すること

  • VyOS構築
  • 確認用EC2構築

VyOS構築

VyOSはVyattaがBrocadeに買収された時にフォークしてできたソフトウェアルータです。そのBrocadeも今は。。。 では実際に構築していきます。

  1. EC2コンソールへアクセスし、「インスタンスの作成」をクリック

  2. 検索エリアでvyosを入力し、AWS MarketplacesからVyOSの「選択」をクリック

  3. インスタンスタイプに応じた料金内容が表示されるので「Continue」をクリック

  4. インスタンスタイプを選択し、「確認と作成」をクリック

  5. 作成VPCやセキュリティグループを選択し「起動」をクリック

  6. 起動したVyOSを選択し右クリック > ネットワーキング > 送信元/送信先の変更チェックを無効化 EC2のデフォルト動作では自身のIPアドレス以外へのパケットは破棄されてしまうため、この設定をすることでVyOS配下のEC2へパケットを転送できるようになります。

これでVyOSの構築は完了になります。設定内容については後述します。確認用のEC2の作成手順は特記事項ないので割愛します。Amazon Linux 2で構築しました。

2.東京リージョン対応

この項では東京リージョンでやったことを記載します。

すること

  • カスタマーゲートウェイ(CGW)作成
  • 仮想プライベートゲートウェイ(VGW)作成
  • サイト間のVPN接続設定
  • ルートテーブルでルート伝播を有効化する
カスタマーゲートウェイについては拠点側のルータ装置(今回はVyOS)を想定しています。

カスタマーゲートウェイ作成

カスタマーゲートウェイを作成する上で対向装置のIPアドレス情報が必要になりますので、予め用意してください。今回はVyOSへ割り当てたグローバルIPアドレスを利用しました(EIPではないのですが、利用する際はEIPを推奨します)。
  1. VPCコンソール > カスタマーゲートウェイ へ移動し、「カスタマーゲートウェイ作成」をクリック

  2. カスタマーゲートウェイ名とルーティング方法、IPアドレスを入力し「カスタマーゲートウェイの作成」をクリック

カスタマーゲートウェイはこれだけになります。

仮想プライベートゲートウェイ作成

  1. VPCコンソール > 仮想プライベートゲートウェイ へ移動し、「仮想プライベートゲートウェイの作成」をクリック

  2. 仮想プライベートゲートウェイ名とASNを入力し「仮想プライベートゲートウェイ」をクリック

  3. 仮想プライベートゲートウェイをVPCと関連付け

仮想プライベートゲートウェイもこれだけになります。 今回はASNはAWS側指定のものを利用するように設定しています。対向ルータ装置もしくは拠点側で同一のASNが使わていない事を確認の上ご利用ください。

サイト間のVPN接続設定

  1. VPCコンソール > サイト間のVPN接続設定 へ移動し、「VPN接続の作成」をクリック

  2. VPN名と先に作成したCGW/VGWの情報を入力して「VPN接続の作成」をクリック

  3. 作成したVPN設定をクリックし、「設定のダウンロード」をクリック

  4. 拠点側で利用するルータに合致する選択肢をプルダウンから選び「ダウンロード」をクリック

ルートテーブルでルート伝搬を有効化する

  1. 拠点側のルート情報を受信するルートテーブルを選択し、「ルート伝達の編集」をクリック

  2. 作成したVGWの伝播にチェックを入れ「保存」をクリック

これで東京リージョンの準備は完了になります。

拠点ルータ(VyOS)設定投入

サイト間のVPN接続設定の際にダウンロードした拠点側ルータ用のConfigファイルの設定情報を投入していきます。当環境ではVyOSへ設定を投入していきますが、利用環境に応じて読み替えて頂けると幸いです。 ※グローバルIPアドレスはマスクしています

VyOS設定

VyOSはデフォルトユーザがvyosとなりますので、以下のコマンドでログインします。

ssh -i "<秘密鍵名>" vyos@<vyosグローバルIPアドレス>

成功すると以下出力されます。

Welcome to VyOS

The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. vyos@ip-172-31-80-194:~$

VyOSはsetコマンドで設定変更が可能です。ダウンロードしたConfigファイルのsetから始まる行を何も考えずにコピー&ペーストしていきます。 設定モードへ移動してペーストします。投入後は設定反映のためcommitコマンドを実行します。

vyos@ip-172-31-80-194:~$ config
[edit]
vyos@ip-172-31-80-194# set vpn ipsec ike-group AWS lifetime '28800'
thentication mode 'pre-shared-secret'
---- snip ----
[edit]
vyos@ip-172-31-80-194# commit
[edit]
vyos@ip-172-31-80-194#

設定内容を確認します。section形式だと長いのでset形式で出力してみます。

vyos@ip-172-31-80-194:~$ show configuration commands
set interfaces ethernet eth0 address 'dhcp'
set interfaces ethernet eth0 duplex 'auto'
set interfaces ethernet eth0 hw-id '12:af:ed:21:68:d7'
set interfaces ethernet eth0 smp-affinity 'auto'
set interfaces ethernet eth0 speed 'auto'
set interfaces loopback lo
set interfaces vti vti0 address '169.254.132.114/30'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1436'
set interfaces vti vti1 address '169.254.148.14/30'
set interfaces vti vti1 description 'VPC tunnel 2'
set interfaces vti vti1 mtu '1436'
set protocols bgp 65001 address-family ipv4-unicast network 0.0.0.0/0
set protocols bgp 65001 neighbor 169.254.132.113 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp 65001 neighbor 169.254.132.113 remote-as '64512'
set protocols bgp 65001 neighbor 169.254.132.113 timers holdtime '30'
set protocols bgp 65001 neighbor 169.254.132.113 timers keepalive '10'
set protocols bgp 65001 neighbor 169.254.148.13 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp 65001 neighbor 169.254.148.13 remote-as '64512'
set protocols bgp 65001 neighbor 169.254.148.13 timers holdtime '30'
set protocols bgp 65001 neighbor 169.254.148.13 timers keepalive '10'
set service ssh client-keepalive-interval '180'
set service ssh disable-password-authentication
set service ssh port '22'
set system config-management commit-revisions '100'
set system console device ttyS0 speed '9600'
set system host-name 'ip-172-31-80-194'
set system login user vyos authentication encrypted-password '*'
set system login user vyos authentication plaintext-password ''
set system login user vyos authentication public-keys deploy-st key 'AAAAB3NzaC1yc2EAAAADAQABAAABAQCfME/IO8ytCTvATXlNezTVMI28ekRd4eK81Dne8iPLzOnv2ByJABXYNX+kkWIfF8RM+1dPATnoURqmWwjp9xD3mlLHarjqj6Wbg4Rsnkh/oRUDfoyAjrIbNkihz8VZpf3XrPHRCn+FJybQ40k7CWs90eAlfsjhr6Ecds7pbP9iA48b26R
09YGbb4tUHZzpluRlAzAjy3M+1sbUQwM0ZOpDk4h3XojZJL0TFp/NcDLPdV5hVbyhyDo1Q+dr2tUFLL0Td3/NjcV7gfK0MhK/yoVasPu+nfNocbC/aulLIvN7GVCec5Q72KDsRuvWok0R+Y2uUa1tkEuJJwP+SkpfJ0cb'
set system login user vyos authentication public-keys deploy-st type 'ssh-rsa'
set system login user vyos level 'admin'
set system ntp server 0.pool.ntp.org
set system ntp server 1.pool.ntp.org
set system ntp server 2.pool.ntp.org
set system syslog global facility all level 'notice'
set system syslog global facility protocols level 'debug'
set system time-zone 'UTC'
set vpn ipsec esp-group AWS compression 'disable'
set vpn ipsec esp-group AWS lifetime '3600'
set vpn ipsec esp-group AWS mode 'tunnel'
set vpn ipsec esp-group AWS pfs 'enable'
set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'
set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
set vpn ipsec ike-group AWS dead-peer-detection interval '15'
set vpn ipsec ike-group AWS dead-peer-detection timeout '30'
set vpn ipsec ike-group AWS ikev2-reauth 'no'
set vpn ipsec ike-group AWS key-exchange 'ikev1'
set vpn ipsec ike-group AWS lifetime '28800'
set vpn ipsec ike-group AWS proposal 1 dh-group '2'
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'
set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec site-to-site peer XX.XX.151.165 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer XX.XX.151.165 authentication pre-shared-secret 'd_LrgFOxLRQ5dc99sgpUQkXhp.zhviy1'
set vpn ipsec site-to-site peer XX.XX.151.165 connection-type 'initiate'
set vpn ipsec site-to-site peer XX.XX.151.165 description 'VPC tunnel 1'
set vpn ipsec site-to-site peer XX.XX.151.165 ike-group 'AWS'
set vpn ipsec site-to-site peer XX.XX.151.165 ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer XX.XX.151.165 local-address '172.31.80.194'
set vpn ipsec site-to-site peer XX.XX.151.165 vti bind 'vti0'
set vpn ipsec site-to-site peer XX.XX.151.165 vti esp-group 'AWS'
set vpn ipsec site-to-site peer XX.XX.119.98 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer XX.XX.119.98 authentication pre-shared-secret 'gwrdNZbCfNt8WrmyhWlPNjgO59I411rs'
set vpn ipsec site-to-site peer XX.XX.119.98 connection-type 'initiate'
set vpn ipsec site-to-site peer XX.XX.119.98 description 'VPC tunnel 2'
set vpn ipsec site-to-site peer XX.XX.119.98 ike-group 'AWS'
set vpn ipsec site-to-site peer XX.XX.119.98 ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer XX.XX.119.98 local-address '172.31.80.194'
set vpn ipsec site-to-site peer XX.XX.119.98 vti bind 'vti1'
set vpn ipsec site-to-site peer XX.XX.119.98 vti esp-group 'AWS'

AWSからダウンロードできる設定ファイルと動作するVyOSのバージョンの差異だと思うのですが、いくつかのコマンドがそのままでは実行できませんでした。試してみる際にはバージョンを確認してからご利用ください。 また、AWS側ルートテーブルへデフォルルート(0.0.0.0/0)を伝搬させたくない場合は、network <Network CIDR>で伝搬するネットワークを絞ってみてください。

前:set protocols bgp 65001 neighbor 169.254.132.113 soft-reconfiguration 'inbound'
後:set protocols bgp 65001 neighbor 169.254.132.113 address-family ipv4-unicast soft-reconfiguration inbound

前:set protocols bgp 65001 network 0.0.0.0/0 後:set protocols bgp 65001 address-family ipv4-unicast network 0.0.0.0/0

VyOSのセキュリティグループへ以下を追加

タイプ プロトコル ポート範囲 ソース
カスタムプロトコル ESP(50) すべて <VPNトンネル1 外部IPアドレス>
カスタムプロトコル ESP(50) すべて <VPNトンネル2 外部IPアドレス>
カスタムUDPルール UDP 500 <VPNトンネル1 外部IPアドレス>
カスタムUDPルール UDP 500 <VPNトンネル2 外部IPアドレス>

動作確認

ここまできたらあとは接続確認をするだけです。Pingの通信確認ができれば問題ありません。

AWS側状態確認

まずはAWS側のVPNトンネルの状態を確認していきます。設定に問題がなければ下記画像のようにAWS側でトンネルステータスがアップしていることが確認できますね。

ルート伝搬有効化したルートテーブルの状態を確認してみます。VyOS側で設定したデフォルトルート(0.0.0.0/0)が追記されていることが確認できます。

VyOS動作確認

次にVyOS側の状態を確認していきます。まずはike/ipsecのステータスを確認します。 問題なくike/ipsec共にステータスがupしていますね。

vyos@ip-172-31-80-194:~$ show vpn ipsec sa
Connection                      State    Up          Bytes In/Out    Remote address    Remote ID    Proposal


peer-XX.XX.119.98-tunnel-vti up 17 minutes 9K/13K XX.XX.119.98 N/A AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024 peer-XX.XX.151.165-tunnel-vti up 23 minutes 7K/12K XX.XX.151.165 N/A AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024

vyos@ip-172-31-80-194:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP


XX.XX.151.165 172.31.80.194

Description: VPC tunnel 1

State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
-----  ------  -------  ----    ---------      -----  ------  ------
up     IKEv1   aes128   sha1_96 2(MODP_1024)   no     3600    28800  

Peer ID / IP Local ID / IP


XX.XX.119.98 172.31.80.194

Description: VPC tunnel 2

State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
-----  ------  -------  ----    ---------      -----  ------  ------
up     IKEv1   aes128   sha1_96 2(MODP_1024)   no     3600    28800  

次にルーティングテーブルを確認してみます。 VGWをアタッチしたVPCNのCIDR(10.200.0.0/16)が表示されていれば、VyOSとVGW間でルート情報のやりとりができていることになります。

vyos@ip-172-31-80-194:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S> 0.0.0.0/0 [210/0] via 172.31.80.1, eth0, 01:18:49 B> 10.200.0.0/16 [20/100] via 169.254.148.13, vti1, 00:20:04 C> 169.254.132.112/30 is directly connected, vti0, 00:26:26 C> 169.254.148.12/30 is directly connected, vti1, 00:20:36 C>* 172.31.80.0/20 is directly connected, eth0, 01:18:51 vyos@ip-172-31-80-194:~$

次にBGPで送信/受信しているルート情報をみてみましょう。 まず送信しているルート情報から確認します。

vyos@ip-172-31-80-194:~$ show ip bgp neighbors 169.254.132.113 advertised-routes
BGP table version is 9, local router ID is 172.31.80.194, vrf id 0
Default local pref 100, local AS 65001
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path > 0.0.0.0/0 0.0.0.0 0 32768 i > 10.200.0.0/16 169.254.148.13 0 64512 i

Total number of prefixes 2

次に受信しているルート情報を確認します

vyos@ip-172-31-80-194:~$ show ip bgp neighbors 169.254.132.113 received-routes
BGP table version is 0, local router ID is 172.31.80.194, vrf id 0
Default local pref 100, local AS 65001
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path *> 10.200.0.0/16 169.254.132.113 200 0 64512 i

Total number of prefixes 1

VyOS側のBGPテーブルを確認します 東京リージョンのルート情報である 10.200.0.0/16 が表示されていれば相互通信の準備が完了です。

vyos@ip-172-31-80-194:~$ show ip bgp
BGP table version is 9, local router ID is 172.31.80.194, vrf id 0
Default local pref 100, local AS 65001
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path > 0.0.0.0/0 0.0.0.0 0 32768 i > 10.200.0.0/16 169.254.148.13 100 0 64512 i * 169.254.132.113 200 0 64512 i

Displayed 2 routes and 3 total paths

疎通確認用EC2

[ec2-user@10-200-21-14 ~]$ ping 172.31.80.194
PING 172.31.21.169 (172.31.21.169) 56(84) bytes of data.
64 bytes from 172.31.21.169: icmp_seq=1 ttl=254 time=165 ms
64 bytes from 172.31.21.169: icmp_seq=2 ttl=254 time=166 ms
64 bytes from 172.31.21.169: icmp_seq=3 ttl=254 time=165 ms
64 bytes from 172.31.21.169: icmp_seq=4 ttl=254 time=165 ms
^C
--- 172.31.21.169 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 165.761/166.031/166.730/0.496 ms

通信できましたー!!

ついでにVyOSでパケットキャプチャしてみます。

vyos@ip-172-31-80-194:~$ sudo tcpdump -i any -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
12:47:07.483590 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 1, length 64
12:47:07.484346 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 1, length 64
12:47:07.484359 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 1, length 64
12:47:08.484346 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 2, length 64
12:47:08.484479 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 2, length 64
12:47:08.485105 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 2, length 64
12:47:08.485117 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 2, length 64
12:47:09.486258 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 3, length 64
12:47:09.486373 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 3, length 64
12:47:09.486965 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 3, length 64
12:47:09.486977 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 3, length 64
12:47:10.488162 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 4, length 64
12:47:10.488294 IP 10.200.21.14 > 172.31.21.169: ICMP echo request, id 4890, seq 4, length 64
12:47:10.488924 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 4, length 64
12:47:10.488936 IP 172.31.21.169 > 10.200.21.14: ICMP echo reply, id 4890, seq 4, length 64

上記結果から東京リージョンにあるEC2(Tokyo-1)とバージニアリージョンになるEC2(Virginia-1)間で通信できていることが確認できました。

まとめ

  • VyOSを利用することでVPN接続の確認ができました。
  • 本ブログではVyOSからデフォルトルート(0.0.0.0/0)を伝搬していますが、複数のVPN接続構成を実現する際はバージニアリージョンから伝搬するルートはVPCのCIDR(172.31.0.0/16)に絞るなど考慮が必要です。
  • 余裕があればStaticなVPN構成にもチャレンジしたい。

それではよいAWSライフをお送りください。

swx-tomitsuka (執筆記事の一覧)