AWSでVPCを用いて作成したプライベートサブネットとSoftLayerのプライベートサブネットを、vyattaを用いてIPsec VPN接続する。
AWSのネットワークに対してSNAT/DNATを用いたりVPCルートテーブルの書き換えをせずとも、プライベートサブネットのIPアドレス同士がPeer-to-Peerで接続できるようにする。
SoftLayerのvyattaの設定
シンガポールDCとサンノゼDCに、以下のスペックのVirtual Serverを立ち上げる。
- OS: Vyatta 6.6 Community Edision (64bi)
- CPU: 2.0GHz 1core
- RAM: 1GB RAM
DC | ホスト名 | パブリックIP | パブリックサブネット | プライベートIP | プライベートサブネット |
---|---|---|---|---|---|
シンガポール | vyatta-sl-sng | 119.81.4.122 | 119.81.4.120/29 | 10.67.3.168 | 10.67.3.128/26 |
サンノゼ | vyatta-sl-sjc | 198.11.204.45 | 198.11.204.32/28 | 10.88.63.157 | 10.88.63.128/26 |
シンガポールDCのvyattaの設定
vyattaにログインし、以下の設定を行う
IPsecを設定するNICの指定
SoftLayerはeth1がパブリック側のNICなので、eth1に対してIPsecの設定を行う。
vyatta@vyatta-sl-sng:~$ configure
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec ipsec-interfaces interface eth1
[edit]
NATトラバースの有効化
AWS VPCへのパケットはNATされるため、NATトラバースを有効にする。許可するネットワークは、AWSのプライベートサブネット。
vyatta@vyatta-sl-sng# set vpn ipsec nat-traversal enable
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec nat-networks allowed-network 192.168.0.0/16
[edit]
IKEとESPの設定
この設定は全てのvyattaで共通にする。
vyatta@vyatta-sl-sng# set vpn ipsec ike-group IKE lifetime 3600
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec ike-group IKE proposal 1 encryption aes256
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec ike-group IKE proposal 1 hash sha1
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec esp-group ESP lifetime 3600
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec esp-group ESP proposal 1 encryption aes256
[edit]
vyatta@vyatta-sl-sng# set vpn ipsec esp-group ESP proposal 1 hash sha1
[edit]
ピアリングの設定
SoftLayer側は任意のアドレスからの接続を受け入れる。pre-shared-secretは全てのvyattaで共通にする。
なおlocal-addressはvyattaインスタンスのパブリックIP、local prefixはvyattaインスタンスのプライベートサブネット、remote prefixはAWSのプライベートサブネットを設定する。
vyatta@vyatta-sl-sng# set vpn ipsec site-to-site peer 0.0.0.0
[edit]
vyatta@vyatta-sl-sng# edit vpn ipsec site-to-site peer 0.0.0.0
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set authentication mode pre-shared-secret
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set authentication pre-shared-secret <秘密のキーワード>
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set default-esp-group ESP
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set ike-group IKE
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set local-address 119.81.4.122
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set tunnel 1 local prefix 10.67.3.128/26
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# set tunnel 1 remote prefix 192.168.1.0/24
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# commit
[edit vpn ipsec site-to-site peer 0.0.0.0]
vyatta@vyatta-sl-sng# save
Saving configuration to '/config/config.boot'...
Done
[edit]
本来であれば、vyattaのfirewall機能でeth1側のセキュリティを高めるべきだが、今回は検証のため実施していない。
サンノゼDCのvyattaの設定
基本的にシンガポールDCと同一手順だが、local-addressとlocal prefixはサンノゼDCのvyattaのパブリックIPとプライベートサブネットを設定する。
AWS VPC作成
192.168.0.0/16というVPCから、パブリックサブネットとして192.168.0.0/24、プライベートサブネットとして192.168.1.0/24を切り出す。なおパブリックサブネットとプライベートサブネットは同じAvailability Zoneに所属していなければならない。
VPCウィザードからVPCとパブリックサブネット作成
192.168.0.0/24のサブネットを、ap-northeast-1cに作成する。
プライベートサブネット作成
192.168.1.0/24のサブネットをパブリックと同じap-northeast-1cに作成する。
AWSのvyatta設定
vyattaインスタンス起動
以下のスペックのインスタンスを東京リージョンのap-northeast-1cに立ち上げる。
- AMI: Vyatta Core 6.6 R1 x86_64 rev1 - ami-07f47b06
- type: t1.micro
ネットワーク設定
先ほど作成したVPCのパブリックサブネットでインスタンスを立ち上げる。この際eth0がパブリックサブネットに割り当てられるので、プライマリIPとして192.168.0.10を指定する。
またプライベートサブネットのeth1を追加して、プライマリIPとして192.168.1.10を指定する。
セキュリティグループの設定
今回は検証なのであまり細かく設定せず、IPsec用のプロトコルをSoftLayerから受け付ける設定と、SoftLayerとAWSのプライベートサブネットからの全てのプロトコルを受け付ける設定を行う。
ENIの設定変更
重要
EC2のENIは、デフォルト設定では送信元・送信先のどちらにも自分自身が含まれないパケットをドロップする。これではvyattaがルータとして動作できないため、vyattaがパケットを転送できるようにENIの「送信元/送信先の変更チェック」を無効化する。以下はパブリック側(eth0)の設定変更画面だが、同様にプライベート側(eth1)の設定も変更する。
ENIの設定確認
ENIの設定変更
Elastic IPの付与
vyattaインスタンスのパブリック側ENI(192.168.0.10)にElastic IPを割り当てる。
vyattaインスタンスの設定変更
追加NICの認識
AWS Management Consoleから追加したENIは、そのままではOSに認識されていないため、OSのネットワーク設定を変更して認識させる。
vyatta@vyatta:~$ sudo vi /etc/network/interfaces
vyatta@vyatta:~$ cat /etc/network/interfaces
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
auto eth1
iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
ホスト名変更
後々わかりやすいように、ホスト名も変更する。
vyatta@vyatta:~$ configure
[edit]
vyatta@vyatta# set system host-name vyatta-aws
[edit]
vyatta@vyatta# commit
[ system host-name vyatta-aws ]
Stopping enhanced syslogd: rsyslogd.
Starting enhanced syslogd: rsyslogd.
[edit]
vyatta@vyatta# save
Saving configuration to '/config/config.boot'...
Done
[edit]
vyatta@vyatta# exit
exit
再起動
再起動して変更を反映させる。
vyatta@vyatta:~$ sudo reboot
設定確認
ホスト名及びNICが認識されていることを確認する。
vyatta@vyatta-aws:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 0a:2a:10:85:6f:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.10/24 brd 192.168.0.255 scope global eth0
inet6 fe80::82a:10ff:fe85:6f55/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 0a:b1:de:fc:05:39 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
inet6 fe80::8b1:deff:fefc:539/64 scope link
valid_lft forever preferred_lft forever
AWSのvyattaの設定
vyattaにログインし、以下の設定を行う
IPsecを設定するNICの指定
SoftLayerとは逆に、設定したVPCではeth0がパブリック側のNICなので、eth0に対してIPsecの設定を行う。
vyatta@vyatta-aws:~$ configure
[edit]
vyatta@vyatta-aws# set vpn ipsec ipsec-interfaces interface eth0
[edit]
NATトラバースの有効化
SoftLayerでの場合と同様、NATトラバースを有効にする。シンガポールとサンノゼの個々のプライベートサブネットを許可しても良いが、10.0.0.0/8でSoftLayerの全てのプライベートサブネットを許可できる。
vyatta@vyatta-aws# set vpn ipsec nat-traversal enable
[edit]
vyatta@vyatta-aws# set vpn ipsec nat-networks allowed-network 10.0.0.0/8
[edit]
IKEとESPの設定
SoftLayerと同一の設定を行う。
vyatta@vyatta-aws# set vpn ipsec ike-group IKE lifetime 3600
[edit]
vyatta@vyatta-aws# set vpn ipsec ike-group IKE proposal 1 encryption aes256
[edit]
vyatta@vyatta-aws# set vpn ipsec ike-group IKE proposal 1 hash sha1
[edit]
vyatta@vyatta-aws# set vpn ipsec esp-group ESP lifetime 3600
[edit]
vyatta@vyatta-aws# set vpn ipsec esp-group ESP proposal 1 encryption aes256
[edit]
vyatta@vyatta-aws# set vpn ipsec esp-group ESP proposal 1 hash sha1
[edit]
ピアリングの設定
AWSからはシンガポールとサンノゼのパブリックIPをそれぞれ個別に設定する。pre-shared-secretは全てのvyattaで共通にする。
なおlocal-addressはパブリックサブネット側(eth0)のIP、local prefixはプライベートサブネット、remote prefixはシンガポール、サンノゼそれぞれのプライベートサブネットを設定する。
vyatta@vyatta-aws# set vpn ipsec site-to-site peer 119.81.4.122
[edit]
vyatta@vyatta-aws# edit vpn ipsec site-to-site peer 119.81.4.122
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set authentication mode pre-shared-secret
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set authentication pre-shared-secret <秘密のキーワード>
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set default-esp-group ESP
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set ike-group IKE
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set local-address 192.168.0.10
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set tunnel 1 local prefix 192.168.1.0/24
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# set tunnel 1 remote prefix 10.67.3.128/26
[edit vpn ipsec site-to-site peer 119.81.4.122]
vyatta@vyatta-aws# top
[edit]
vyatta@vyatta-aws# set vpn ipsec site-to-site peer 198.11.204.45
[edit]
vyatta@vyatta-aws# edit vpn ipsec site-to-site peer 198.11.204.45
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set authentication mode pre-shared-secret
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set authentication pre-shared-secret <秘密のキーワード>
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set default-esp-group ESP
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set ike-group IKE
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set local-address 192.168.0.10
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set tunnel 1 local prefix 192.168.1.0/24
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# set tunnel 1 remote prefix 10.88.63.128/26
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# commit
[edit vpn ipsec site-to-site peer 198.11.204.45]
vyatta@vyatta-aws# save
Saving configuration to '/config/config.boot'...
Done
[edit]
IPsec接続の状態確認
ここまでで、SoftLayerシンガポールDC ⇔ AWS東京リージョン ⇔ SoftLayerサンノゼDCのvyattaがIPsecで接続された。
show vpn ike sa
でStateがupになっていること、show vpn ipsec sa
で有効なTunnelがupしていることで、正しく設定されていることが確認できる。
vyatta@vyatta-sl-sng# run show vpn ike sa
Peer ID / IP Local ID / IP
------------ -------------
52.69.255.138 119.81.4.122
State Encrypt Hash D-H Grp NAT-T A-Time L-Time
----- ------- ---- ------- ----- ------ ------
up aes256 sha1 5 yes 144 3600
[edit]
vyatta@vyatta-sl-sng# run show vpn ipsec sa
Peer ID / IP Local ID / IP
------------ -------------
0.0.0.0 119.81.4.122
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1 down n/a n/a n/a no 0 3600 all
Peer ID / IP Local ID / IP
------------ -------------
52.69.255.138 119.81.4.122
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1[2] up 0.0/0.0 aes256 sha1 yes 150 3600 all
[edit]
vyatta@vyatta-sl-sjc# run show vpn ike sa
Peer ID / IP Local ID / IP
------------ -------------
52.69.255.138 198.11.204.45
State Encrypt Hash D-H Grp NAT-T A-Time L-Time
----- ------- ---- ------- ----- ------ ------
up aes256 sha1 5 yes 204 3600
[edit]
vyatta@vyatta-sl-sjc# run show vpn ipsec sa
Peer ID / IP Local ID / IP
------------ -------------
0.0.0.0 198.11.204.45
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1 down n/a n/a n/a no 0 3600 all
Peer ID / IP Local ID / IP
------------ -------------
52.69.255.138 198.11.204.45
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1[2] up 0.0/0.0 aes256 sha1 yes 211 3600 all
[edit]
vyatta@vyatta-aws# run show vpn ike sa
Peer ID / IP Local ID / IP
------------ -------------
119.81.4.122 192.168.0.10
State Encrypt Hash D-H Grp NAT-T A-Time L-Time
----- ------- ---- ------- ----- ------ ------
up aes256 sha1 5 yes 1290 3600
Peer ID / IP Local ID / IP
------------ -------------
198.11.204.45 192.168.0.10
State Encrypt Hash D-H Grp NAT-T A-Time L-Time
----- ------- ---- ------- ----- ------ ------
up aes256 sha1 5 yes 1048 3600
[edit]
vyatta@vyatta-aws# run show vpn ipsec sa
Peer ID / IP Local ID / IP
------------ -------------
119.81.4.122 192.168.0.10
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1 up 0.0/0.0 aes256 sha1 yes 1265 3600 all
Peer ID / IP Local ID / IP
------------ -------------
198.11.204.45 192.168.0.10
Tunnel State Bytes Out/In Encrypt Hash NAT-T A-Time L-Time Proto
------ ----- ------------- ------- ---- ----- ------ ------ -----
1 up 0.0/0.0 aes256 sha1 yes 1274 3600 all
[edit]
各vyattaのプライベートIPの接続
SoftLayerでVLAN SpanningをONにしていると、各DCのプライベートサブネット間はルーティングされる。
そのためここまでの状態で、東京、シンガポール、サンノゼの各vyattaインスタンスはプライベートIPで疎通できる。
以下はAWS東京リージョンのvyattaからの接続状態だが、全てのvyattaで疎通できていることが確認できる。
vyatta@vyatta-aws# ping -c3 10.67.3.168
PING 10.67.3.168 (10.67.3.168) 56(84) bytes of data.
64 bytes from 10.67.3.168: icmp_req=1 ttl=64 time=70.2 ms
64 bytes from 10.67.3.168: icmp_req=2 ttl=64 time=70.1 ms
64 bytes from 10.67.3.168: icmp_req=3 ttl=64 time=73.0 ms
--- 10.67.3.168 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 70.114/71.148/73.050/1.380 ms
[edit]
vyatta@vyatta-aws# ping -c3 10.88.63.157
PING 10.88.63.157 (10.88.63.157) 56(84) bytes of data.
64 bytes from 10.88.63.157: icmp_req=1 ttl=64 time=105 ms
64 bytes from 10.88.63.157: icmp_req=2 ttl=64 time=105 ms
64 bytes from 10.88.63.157: icmp_req=3 ttl=64 time=103 ms
--- 10.88.63.157 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 103.365/104.738/105.499/0.972 ms
[edit]
vyatta@vyatta-aws# ping -c3 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_req=1 ttl=64 time=0.044 ms
64 bytes from 192.168.1.10: icmp_req=2 ttl=64 time=0.061 ms
64 bytes from 192.168.1.10: icmp_req=3 ttl=64 time=0.060 ms
--- 192.168.1.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.044/0.055/0.061/0.007 ms
[edit]
SoftLayerで接続確認用インスタンスを起動
以下のスペックのVirtual Serverを、シンガポールDCとサンノゼDCに立ち上げる。
- OS: Ubuntu 14.04 LTS (64 bit)
- CPU: 2.0GHz 1core
- RAM: 1GB RAM
DC | ホスト名 | パブリックIP | プライベートIP |
---|---|---|---|
シンガポール | test-sl-sng-01 | 119.81.4.123 | 10.67.3.184 |
サンノゼ | test-sl-sjc-01 | 198.11.204.40 | 10.88.63.164 |
サンノゼ | test-sl-sjc-02 | 198.11.204.37 | 10.88.63.187 |
静的ルートの設定
AWSのプライベートIP宛のパケットは、vyattaのプライベートIPにルーティングする。
root@test-sl-sng-01:~# ip route add 192.168.0.0/16 via 10.67.3.168 dev eth0
root@test-sl-sjc-01:~# ip route add 192.168.0.0/16 via 10.88.63.157 dev eth0
AWSで接続確認用インスタンスを起動
以下のスペックのインスタンスを東京リージョンのap-northeast-1cに立ち上げる。
- AMI: ubuntu/images/ebs-ssd/ubuntu-trusty-14.04-amd64-server-20150325 - ami-8d6d9d8d
- type: t1.micro
ホスト名 | パブリックIP | プライベートIP |
---|---|---|
test-aws-01 | 192.168.0.21 | 192.168.1.21 |
test-aws-02 | 192.168.0.22 | 192.168.1.22 |
※ vyattaの場合と同様、eth0をパブリックサブネット、eth1をプライベートサブネットへ接続する
※「送信元/送信先の変更チェック」は有効のままで良い
※ セキュリティグループは、SoftLayerとAWSのプライベートアドレスからの全てのプロトコルを受け付けるようにする
接続確認用インスタンスの設定変更
追加NICの認識
vyattaの場合と同様、OSのネットワーク設定を変更して追加したNICを認識させる。
以下はtest-aws-01の例だが、test-aws-02でも同様。
ubuntu@ip-192-168-0-21:~$ sudo vi /etc/network/interfaces
ubuntu@ip-192-168-0-21:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# Source interfaces
# Please check /etc/network/interfaces.d before changing this file
# as interfaces may have been defined in /etc/network/interfaces.d
# NOTE: the primary ethernet device is defined in
# /etc/network/interfaces.d/eth0
# See LP: #1262951
#source /etc/network/interfaces.d/*.cfg
auto eth0
iface eth0 inet static
address 192.168.0.21
netmask 255.255.255.0
gateway 192.168.0.1
auto eth1
iface eth1 inet static
address 192.168.1.21
netmask 255.255.255.0
ホスト名変更
後々わかりやすいように、ホスト名も変更する。
ubuntu@ip-192-168-0-21:~$ sudo vi /etc/hostname
ubuntu@ip-192-168-0-21:~$ cat /etc/hostname
test-aws-01
再起動
ubuntu@ip-192-168-0-21:~$ sudo reboot
静的ルートの設定
SoftLayerのプライベートIP宛のパケットは、vyattaのプライベートIPにルーティングする。
ubuntu@test-aws-01:~$ sudo ip route add 10.0.0.0/8 via 192.168.1.10 dev eth1
接続確認
AWS test-aws-01でNetcatを起動し、各テストインスタンスからTCP接続を試みる。
ubuntu@test-aws-02:~$ echo 'from test-aws-02' | nc 192.168.1.21 7777
root@test-sl-sng-01:~# echo 'from test-sl-sng-01' | nc 192.168.1.21 7777
root@test-sl-sjc-01:~# echo 'from test-sl-sjc-01' | nc 192.168.1.21 7777
root@test-sl-sjc-02:~# echo 'from test-sl-sjc-02' | nc 192.168.1.21 7777
ubuntu@test-aws-01:~$ nc -l -k -p 7777
from test-aws-02
from test-sl-sng-01
from test-sl-sjc-01
from test-sl-sjc-02
同様の手順により、全てのテスト用インスタンスがお互いのプライベートIPで通信できることが確認できる。
まとめ
AWSでVPCを用いて作成したプライベートサブネットとSoftLayerのプライベートサブネットをVPN接続し、SNAT/DNATやVPCのルートテーブルの書き換えをしなくても適切にパケットを疎通させることができた。今後はAWSの複数リージョン対応や、Azure等の別クラウドへの対応などにも取り組みたい。