目次
はじめに
こんにちは、ディーネットの森です。
朝晩冷える季節となってきましたが体調いかがでしょうか。
私はまだまだ満員電車が暑くて仕方ないです(;^ω^)
冗談はこれまでとして、かねてからやってみたかったAWS Site-to-Site VPNをハンズオンに従って構築してみる回になります。
是非構築時の参考にしてください。
現環境は既に存在しませんので、IPアドレスの記載は公開しています。
ソフトウェアがインストールされたインスタンスを使用しますが、無料期間での使用になりますので問題ありません。また、AWS Marketplaceのサブスクを解除する方法も文末に記載しています。
ハンズオンでの完成図は次のとおりとなります。
※Cloud9はEC2に置き換えて構築します。
最初にピアリング接続を行います。
VPC作成
※VPCを作成する際は、「VPCなど」を選択します。
- 【mainVPC】
- パブリックサブネットx1
- IPv4 CIDR ブロック:10.0.0.0/16
- パブリックサブネット CIDR ブロック:10.0.0.0/24
- 【peeringVPC】
- パブリックサブネットx1
- IPv4 CIDR ブロック:10.1.0.0/16
- パブリックサブネット CIDR ブロック:10.1.0.0/24
ピアリング接続
mainVPCとpeeringVPCを接続します。
ピアリングはアカウントやリージョンを跨いだ接続が可能。
ピアリングの設定をすると次の画面となり、承諾が必要となります。
ポップアップに従い、ルートテーブルを変更することで、ピアリング先にアクセスすることが可能。
各パブリックルートテーブルにおいて、通信先のVPCサイダー範囲と、ソースをピアリングに設定する。
mainVPC(パブリックルートテーブル)
peeringVPC(パブリックルートテーブル)
peeringVPCにEC2構築
セキュリティグループは、10.0.0.0/16からの接続は全て許可する設定とします。
プライマリプライベートIPアドレスは、10.1.0.100で指定します。
キーペアなしで進めます。
mainVPCにEC2構築
セキュリティグループは、10.1.0.0/16からの接続は全て許可、SSH,0.0.0.0を開けて進めましょう。
キーペア指定。
起動!
mainEC2⇒peeringEC2疎通確認
SSH接続でmainEC2にログインします。
そして割り当てIPアドレスの確認
eth0
ip addr
mainVPCに存在することを確認する。
peeringEC2にping疎通確認します。
ping 10.1.0.100
例:
AWS Site-to-Site VPN
AWS Site-to-Site VPNは冗長として2本作る。
CGW(お客様オンプレミス)
VGW(VPC)
特徴は次のとおりです。
簡単にまとめると、専用線を使用せずインターネットを介して少量の通信をVPC(VGW)からオンプレミスのお客様環境(CGW)と繋ぐ場合に使用するサービスです。多数のVPCと接続する場合はTransit Gatewayを使用するといった使い分けを行うと良いでしょう。
- インターネットに繋がずすぐに繋ぎたい、ピアリング接続
- インターネットを介さずIPアドレスの重複関係なく接続したい、PrivateLink
- インターネットを介して少量の暗号化通信、Site-to-Site VPN
- 安定した帯域幅で専用線を使用した通信、Direct Connect
こんな感じでしょうか。
多くのVPCと接続する場合など。TransitGateway
仮想ルータ構築
新たなVPC(仮想オンプレ)を作成
- 【OnP】
- パブリックサブネットx1
- IPv4 CIDR ブロック:192.168.0.0/16
- パブリックサブネット CIDR ブロック:192.168.0.0/24
VyOSという仮想ルータを使用(無料期間あり。)
※ハンズオンに合わせて少し古いバージョンを使用します。
バージョン 1.3.5
一番小さいサイズを選ぶ(^^;
t3.medium
※推奨はデフォルトのインスタンスタイプのようです。
OnPVPCに配置して、プライマリプライベートIPアドレスを「192.168.0.200」とします。
キーペア指定。
セキュリティグループは、SSH,0.0.0.0で進めます。
EIPを割り当てましょう。
mainEC2からOnPEC2に接続するので、mainEC2にキーペアの鍵を渡します。私の場合はTera Termを使用します。
/home/ec2-user/〇〇.pem ここに配置しちゃいましょう。
そして権限を適切に設定します。
※400は所有者のみ読み取り可
chmod 400 /home/ec2-user/○○○.pem
そして接続
ssh -i ○○○.pem vyos@{IPアドレス}
VGW設定
仮想プライベートゲートウェイ作成
名前を決める。
「main」VPCに関連付ける。
CGW設定
AWS側にどういった接続があるか先行的に設定する役割。
- カスタマーゲートウェイの作成
- 名前を付ける。
- BGP(動的)を選択
- BGP ASN:
65000
- IP アドレス:「OnPのEIP」
※BGP(Border Gateway Protocol)
ネットワークを繋ぐプロトコルでEGPの一種
リージョン毎に予約があるようです。
後はデフォルトで作成
AWS Site-to-Site VPN接続
- 名前を付ける。
- VGWとCGWを選択
- 後はデフォルトで作成
- 設定、Vyattaを選択してダウンロードする。
編集をしていきます。バージョンによって記載内容は違います。
VSCodeで編集すると見やすいです。
これはオンプレ側に適用するための設定となります。
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 site-to-site peer 3.232.50.186 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer 3.232.50.186 authentication pre-shared-secret 'PSDoRWt6bAlr9w6uFJP_TMzUhNnliYJy'
set vpn ipsec site-to-site peer 3.232.50.186 description 'VPC tunnel 1'
set vpn ipsec site-to-site peer 3.232.50.186 ike-group 'AWS'
set vpn ipsec site-to-site peer 3.232.50.186 local-address '192.168.0.200'
set vpn ipsec site-to-site peer 3.232.50.186 vti bind 'vti0'
set vpn ipsec site-to-site peer 3.232.50.186 vti esp-group 'AWS'
set vpn ipsec ipsec-interfaces interface 'eth0'
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 interfaces vti vti0 address '169.254.78.202/30'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1436'
set protocols bgp 65000 neighbor 169.254.78.201 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.78.201 address-family ipv4-unicast soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.78.201 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.78.201 timers keepalive '10'
set protocols bgp 65000 address-family ipv4-unicast network 192.168.0.0/16
set vpn ipsec site-to-site peer 52.72.226.199 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer 52.72.226.199 authentication pre-shared-secret '4cLMAjWD88lZ3Pe_Liv9SBya8BNNpcpE'
set vpn ipsec site-to-site peer 52.72.226.199 description 'VPC tunnel 2'
set vpn ipsec site-to-site peer 52.72.226.199 ike-group 'AWS'
set vpn ipsec site-to-site peer 52.72.226.199 local-address '192.168.0.200'
set vpn ipsec site-to-site peer 52.72.226.199 vti bind 'vti1'
set vpn ipsec site-to-site peer 52.72.226.199 vti esp-group 'AWS'
set interfaces vti vti1 address '169.254.194.210/30'
set interfaces vti vti1 description 'VPC tunnel 2'
set interfaces vti vti1 mtu '1436'
set protocols bgp 65000 neighbor 169.254.194.209 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.194.209 address-family ipv4-unicast soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.194.209 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.194.209 timers keepalive '10'
現在mainEC2経由で、OnPEC2にログインした状態から、設定モードに以降します。
configure
(conf)でも設定モードに以降できます。
プロンプトが変わりました。
先程の設定コマンドを一気に貼り付けます。
「[edit]」このような表示である場合、正常に設定できています。
設定を保存します。
commit
save
vyos@ip-192-168-0-200# save
Saving configuration to '/config/config.boot'...
Done
[edit]
※設定が上手くいかない場合は、公式のドキュメントなどを確認しながら設定を投入して進める必要があります。なお、私が最新バージョンVyattaの1.4だと、この設定コマンドは通りません。
設定作成時、参考サイト(Vyatta公式サイト(Ver1.3,Ver1.4):
参考までに設定ファイルの編集箇所は次のとおりです。
「修正/削除箇所」
【修正箇所】
! IPSec Tunnel #1
〜〜
修正前:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '<Elastic IP>'
修正後:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '192.168.0.200'
修正前:
set protocols bgp 65000 neighbor 169.254.XX.XX soft-reconfiguration 'inbound'
修正後:
set protocols bgp 65000 neighbor 169.254.XX.XX address-family ipv4-unicast soft-reconfiguration 'inbound'
修正前:
set protocols bgp 65000 network 0.0.0.0/0
修正後:
set protocols bgp 65000 address-family ipv4-unicast network 192.168.0.0/16
~~
! IPSec Tunnel #2
〜〜
修正前:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '<Elastic IP>'
修正後:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '192.168.0.200'
修正前:
set protocols bgp 65000 neighbor 169.254.XX.XX soft-reconfiguration 'inbound'
修正後:
set protocols bgp 65000 neighbor 169.254.XX.XX address-family ipv4-unicast soft-reconfiguration 'inbound'
【削除箇所】
→全ての「!」で始まる行に加え、以下の箇所
! IPSec Tunnel #2
〜〜
set protocols bgp 65000 network 0.0.0.0/0
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 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’
インターフェイスの状態を確認してみます。
show interfaces
vyos@ip-192-168-0-200# show interfaces
ethernet eth0 {
address dhcp
hw-id 02:9f:d4:f8:5a:a5
offload {
gro
gso
sg
}
}
loopback lo {
}
vti vti0 {
address 169.254.78.202/30
description "VPC tunnel 1"
mtu 1436
}
vti vti1 {
address 169.254.194.210/30
description "VPC tunnel 2"
mtu 1436
}
[edit]
AWS VPCとのIPsec VPNトンネルが確立できているようです。
公式が示すBGPが作成したmainVPCを認識しているか確認するコマンドを実行します。
次のコマンドでモードを変更します。
今のモードを出ます。
exit
BGP設定を一度リセットします。
reset ip bgp all
ルートテーブルを確認してVPCのアドレスを覚えいるか確認します。
show ip route
vyos@ip-192-168-0-200:~$ 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, r - rejected, b - backup
S>* 0.0.0.0/0 [210/0] via 192.168.0.1, eth0, weight 1, 01:46:33
B>* 10.0.0.0/16 [20/100] via 169.254.194.209, vti1, weight 1, 00:01:01
C>* 169.254.78.200/30 is directly connected, vti0, 00:19:08
C>* 169.254.194.208/30 is directly connected, vti1, 00:19:08
C>* 192.168.0.0/24 is directly connected, eth0, 01:46:33
Bの箇所に10.0.0.0/16 VPCを記憶してくれていますね。
次にBGPの細部を確認
show ip bgp
vyos@ip-192-168-0-200:~$ show ip bgp
BGP table version is 4, local router ID is 192.168.0.200, vrf id 0
Default local pref 100, local AS 65000
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.0.0.0/16 169.254.78.201 200 0 64512 i
*> 169.254.194.209 100 0 64512 i
*> 192.168.0.0/16 0.0.0.0 0 32768 i
Displayed 2 routes and 3 total paths
ちゃんとネットワークを見つけてくれています。
コンソールで確認してみます。
OK
今の構成はこの状態
mainVPCのルートテーブル編集
-
ルート伝搬のタブ
-
ルート伝搬の編集
-
学習したルートを伝搬するか:有効にチェック
-
伝搬:「はい」を確認
-
OnPVPCのルートテーブル編集
- OnPルートテーブルのルートタブから編集
- ルート追加で、mainの10.0.0.0/16,インスタンスを選択,CGWを選択
※送信先宛先チェックを無効化する。
経由する役割のEC2である場合、これを解除しないと機能しません。
想定オンプレのOnPEC2を選択し、アクション⇒ネットワーキング⇒ソース宛先チェック。停止にチェックを付けて、保存します。
疎通確認の儀
OnPVPCにEC2を立てて、mainEC2から接続することで、疎通確認を行ってまいります。
-
OnPEC2
- 名前を付ける。
- OnPVPCに配置
- プライマリプライベートIP「192.168.0.100」
- セキュリティグループ:すべて,ソース10.0.0.0/16,mainVPCからの接続に限定して進めます。
- キーペアなし。
-
mainVPCのmainEC2にログイン
-
mainEC2のIPアドレスを再確認
ip addr
-
pingしていきます。。。。。
ping 192.168.0.100
成功です。
後片付け
EIPの関連付けを解除するのは最後でも良いかもですね。
誤って消してしまう可能性もありますので(^^;
サブスクの削除
サービス検索で、AWS Marketplace
を検索
- サブスクリプションの管理
- 該当のサブスクリプションをクリックしてスクロールします。
- 契約:アクションをクリック
プルダウンから、サブスクリプションをキャンセルをクリックします。
サブスクリプションが正常にキャンセルされたことを確認します。
おわりに
AWS Site-to-Site VPNにおいて私的に肝だなと感じたところは、設定ファイルをダウンロードして、編集するところが別途勉強が必要だと思いました。オンプレ側にどの設定をいれるのかというところです。
ハンズオンによって簡単にではありますが、理解を深めることができました!
1つずつ誠実に取り組み、技術を身に着けて発信も併せて行っていきます!