Vyatta(VyOS)で、AWSとのsite-to-site VPN(サイト間のVPN接続)を実装する方法を説明します。多くの場合は、ネットワーク機器がグローバルIPアドレスを持つ場合が紹介されていますが、実はグローバルIPアドレスを持たないLAN内に配置されたネットワーク機器でもsite-to-site VPNは実装できます。
プライベートIPアドレスを使用する場合は、AWSが自動生成するconfigに対して、id, remote-id, 送信元IPアドレス, イニシエータなどの設定に配慮すれば接続可能になります。状況によりけりで画一的な手順を示す事はできませんが、注意点の勘所を抑えて頂ければと思います。
設定まとめ
AWS固有の概念は一切登場しません。具体的な設定値の意味は「Vyatta(VyOS) IPsec設定 基礎編」と「Vyatta(VyOS) IPsec設定 NAT併用編」を参照ください。
動作確認
動作確認の構成
以下の環境で動作確認を行います。NEC IXは1:Nのsource NATを設定しておきます。つまり、LAN内のVyattaからAWSへ通信を実現する事はできますが、AWSからLAN内へのVyattaへの接続はできない状態とします。
+-----------------------+ | AWS | | 172.31.0.0/16 | | (default VPC) | +-----------+-----------+ | | | +-----------+-----------+ | | | JCOM Internet | | | +-----------+-----------+ | | 203.165.200.0/22 | g0.0 | .XXX +-----------+-----------+ | | | NEC IX | | | +-----------+-----------+ g1.0 | .1 | | 192.168.1.1/24 | eth0 | .30 +-----------+-----------+ | | | vy030 | | | +-----------+-----------+ eth1 | .30 | | 192.168.30.0/24 |
初期設定
NEC IXは1:Nのsource NATを設定しておきます。
動作確認 AWSとの接続
サンプル設定のダウンロード
AWSではIPsecを確立するためのサンプル設定を公開しています。有名なネットワーク機器ならばコピペで動作する事もありますが、複雑な環境やマイナー機器ならばサンプル設定のアレンジが必要です。
何もサンプルがない状況から設定を作成するのは非常に手間なので、AWSが提供するサンプル設定を修正する方法で構築しましょう。サンプル設定は以下の画面からダウンロードできます。
AWS側の設定は非常に多くの情報が出回っており苦戦する方も少ないと思います。AWS側の設定は後述の補足説明とします。
IPsec設定
サンプル設定のIPsecに関わる部分を確認します。すると、いくつかはコピペで動かない設定が散見されます。以下コピペで動かない部分を順に説明します。
インターフェース指定が旧コマンド体系になっているので、これを修正するか削除します。必須の設定ではないので、省略しても差し支えございません。また、明示指定する場合は、eth0ではなく環境に応じてインターフェース番号を変更ください。
[サンプル設定] set vpn ipsec ipsec-interfaces interface 'eth0' [サンプル修正例] set vpn ipsec interface 'eth0'
NAT環境下でグローバルIPアドレスを持たないネットワーク機器ならば、送信元IPアドレスやid, remote-idの修正が必要です。修正例を以下に示します。
[サンプル設定] set vpn ipsec site-to-site peer 34.208.51.148 local-address '203.165.200.XXX' [サンプル修正例] set vpn ipsec site-to-site peer 34.208.51.148 authentication id '203.165.200.XXX' set vpn ipsec site-to-site peer 34.208.51.148 authentication remote-id '34.208.51.148' set vpn ipsec site-to-site peer 34.208.51.148 local-address '192.168.1.30'
最終的には以下のようなconfigを投入します。
AWSとは2本のIPsecを確立します。以下は1本のみの設定例です。
set interfaces vti vti0 address '169.254.60.98/30' set interfaces vti vti0 description 'VPC tunnel 1' set interfaces vti vti0 mtu '1436' 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 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 34.208.51.148 authentication id '203.165.200.XXX' set vpn ipsec site-to-site peer 34.208.51.148 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 34.208.51.148 authentication pre-shared-secret 'PGIenMtTm_hiLoR.i0OanVus86pq7nG7' set vpn ipsec site-to-site peer 34.208.51.148 authentication remote-id '34.208.51.148' set vpn ipsec site-to-site peer 34.208.51.148 description 'VPC tunnel 1' set vpn ipsec site-to-site peer 34.208.51.148 ike-group 'AWS' set vpn ipsec site-to-site peer 34.208.51.148 local-address '192.168.1.30' set vpn ipsec site-to-site peer 34.208.51.148 vti bind 'vti0' set vpn ipsec site-to-site peer 34.208.51.148 vti esp-group 'AWS'
ikeおよびipsecが確立している事を確認します。
vyos@vy030:~$ show vpn ike sa Peer ID / IP Local ID / IP ------------ ------------- 34.208.51.148 34.208.51.148 192.168.1.30 203.165.200.XXX State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time ----- ------ ------- ---- --------- ----- ------ ------ up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_1024 yes 128 0 vyos@vy030:~$ vyos@vy030:~$ vyos@vy030:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal ---------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ peer_34-208-51-148_vti up 2m15s 12K/13K 178/141 34.208.51.148 N/A AES_CBC_128/HMAC_SHA1_96 vyos@vy030:~$
VTIは/30のIPアドレスが付与されています。必然と対向AWS側のIPアドレスは推定できますので、AWS側のVTIに対してping応答があるかを確認します。
vyos@vy030:~$ show interfaces Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down Interface IP Address S/L Description --------- ---------- --- ----------- eth0 192.168.1.30/24 u/u eth1 192.168.30.30/24 u/u lo 127.0.0.1/8 u/u ::1/128 vti0 169.254.60.98/30 u/u VPC tunnel 1 vyos@vy030:~$ vyos@vy030:~$ vyos@vy030:~$ ping 169.254.60.97 count 3 PING 169.254.60.97 (169.254.60.97) 56(84) bytes of data. 64 bytes from 169.254.60.97: icmp_seq=1 ttl=254 time=137 ms 64 bytes from 169.254.60.97: icmp_seq=2 ttl=254 time=138 ms 64 bytes from 169.254.60.97: icmp_seq=3 ttl=254 time=135 ms --- 169.254.60.97 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 134.662/136.457/137.564/1.280 ms vyos@vy030:~$
BGP設定
AWSから提示されたサンプル設定は旧体系のものですので、BGPに関してはほぼ全文の修正が必要です。また、サンプルでは0.0.0.0/0をadvertiseしていますが、何をadvertiseするかは環境に応じて適宜の変更をお願いします。
AWSとは2本のBGP neighborを確立します。以下は1本のみの設定例です。
[サンプル設定] set protocols bgp 65000 neighbor 169.254.60.97 remote-as '64512' set protocols bgp 65000 neighbor 169.254.60.97 soft-reconfiguration 'inbound' set protocols bgp 65000 neighbor 169.254.60.97 timers holdtime '30' set protocols bgp 65000 neighbor 169.254.60.97 timers keepalive '10' set protocols bgp 65000 network 0.0.0.0/0 [サンプル修正例] set protocols bgp local-as '65000' set protocols bgp neighbor 169.254.60.97 remote-as '64512' set protocols bgp neighbor 169.254.60.97 address-family ipv4-unicast soft-reconfiguration set protocols bgp timers holdtime '30' set protocols bgp timers keepalive '10 set protocols bgp address-family ipv4-unicast network 192.168.30.0/24
設定投入後、BGP neighborが確立された事を確認します。
vyos@vy030:~$ show ip bgp summary IPv4 Unicast Summary: BGP router identifier 192.168.30.30, local AS number 65000 vrf-id 0 BGP table version 6 RIB entries 3, using 576 bytes of memory Peers 1, using 21 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 169.254.60.97 4 64512 154 157 0 0 0 00:04:47 1 2 Total number of neighbors 1 vyos@vy030:~$
AWSからrecieveしているprefix、AWSへadvertiseしているprefixを確認します。
vyos@vy030:~$ show ip bgp neighbors 169.254.60.97 routes BGP table version is 6, local router ID is 192.168.30.30, 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 *> 172.31.0.0/16 169.254.60.97 100 0 64512 i Displayed 1 routes and 2 total paths vyos@vy030:~$ vyos@vy030:~$ vyos@vy030:~$ show ip bgp neighbors 169.254.60.97 advertised-routes BGP table version is 6, local router ID is 192.168.30.30, 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 *> 172.31.0.0/16 0.0.0.0 0 64512 i *> 192.168.30.0/24 0.0.0.0 0 32768 i Total number of prefixes 2 vyos@vy030:~$
疎通確認
以上の設定により、AWS private gatewayまで疎通可能になりました。ですが、AWS側のルートテーブルが未設定のため、VPC配下のEC2やECSとは疎通不能の状況です。
オンプレミス側(この設定例の場合 192.168.30.0/24)をAWS private gatewaに向けるようなルートテーブルの設定をします。
疎通確認のため、適当なEC2インスタンスなどを構築し、ping疎通を確認します。
[ec2-user@ip-172-31-23-131 ~]$ ping -c 3 192.168.30.30 PING 192.168.30.30 (192.168.30.30) 56(84) bytes of data. 64 bytes from 192.168.30.30: icmp_seq=1 ttl=64 time=135 ms 64 bytes from 192.168.30.30: icmp_seq=2 ttl=64 time=137 ms 64 bytes from 192.168.30.30: icmp_seq=3 ttl=64 time=135 ms --- 192.168.30.30 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 135.242/136.185/137.956/1.323 ms [ec2-user@ip-172-31-23-131 ~]$
VyattaからAWSへの疎通を確認します。この時、interfaceを明示指定しなければ疎通不能になる事に注意してください。
interfaceを明示指定しない場合はVTIからicmpが送付されますが、VTIに付与された169.254.0.0/16のIPアドレスはAWSへadvertiseされていませんので、戻りの通信経路が疎通不能になります。
169.254.0.0/16はリンクローカルと呼ばれるアドレス帯でローカルで完結する処理を目的として使用します。従って、169.254.0.0/16をadvertiseするのは技術上は可能ですがマナー違反です。
vyos@vy030:~$ ping 172.31.23.131 count 3 PING 172.31.23.131 (172.31.23.131) 56(84) bytes of data. --- 172.31.23.131 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 2076ms vyos@vy030:~$ vyos@vy030:~$ vyos@vy030:~$ ping 172.31.23.131 interface 192.168.30.30 count 3 PING 172.31.23.131 (172.31.23.131) from 192.168.30.30 : 56(84) bytes of data. 64 bytes from 172.31.23.131: icmp_seq=1 ttl=254 time=147 ms 64 bytes from 172.31.23.131: icmp_seq=2 ttl=254 time=135 ms 64 bytes from 172.31.23.131: icmp_seq=3 ttl=254 time=136 ms --- 172.31.23.131 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 134.616/139.083/146.644/5.375 ms vyos@vy030:~$
補足 AWS側の操作
グローバルIPアドレスの確認
IPと接続する時のグローバルIPアドレスを確認します。この値はAWS側での操作に必要となります。
カスタマーゲートウェイ
「仮想プライベートネットワーク(VPN)」「カスタマーゲートウェイ」の順に画面遷移し、「カスタマーゲートウェイの作成」を押下します。
「名前」は何か分かりやすい名称を、「IPアドレス」は先ほど調査したグローバルIPアドレスを入力します。Vyattaに付与されるプライベートIPアドレスではなく、AWS側から見た時のグローバルIPアドレスを入力します。
仮想プライベートゲートウェイ
「仮想プライベートネットワーク(VPN)」「仮想プライベートゲートウェイ」の順に画面遷移し、「仮想プライベートゲートウェイの作成」を押下します。
「名前タグ」は何か分かりやすい名称を入力します
作成した仮想プライベートゲートウェイの「アクション」で「VPCにアタッチ」を選びます。
接続したいVPCを選びます。
サイト間VPN接続
「仮想プライベートネットワーク(VPN)」「サイト間VPN接続」の順に画面遷移し、「VPN接続の作成」を押下します。
「名前タグ」は何か分かりやすい名称を、「仮想プライベートゲートウェイ」と「カスタマーゲートウェイID」は先ほど作成したものを紐付けます。
画面を下の方へスクロールし、「VPNの作成」を押下します。
サンプル設定のダウンロード
対象の「サイト間VPN接続」を選んだ状態で「設定のダウンロード」を押下します。その後、ベンダーを「Vyatta」にして、「ダウンロード」を押下します。