VyattaでVPCを拠点間接続する

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


こんにちはこんばんは、テクニカルグループの山田です。

今回はソフトウェアルーターであるVyattaを使ってVPCを拠点間接続し、それぞれのVPCにあるPrivateSubnet内のインスタンス同士で通信するまでの手順をご紹介します。

※Vyattaについては下記を参照ください。
http://ja.wikipedia.org/wiki/Vyatta

構成図



 

  • VPCを2つ作成(192.168.100.0/24、192.168.200.0/24)
  • それぞれのVPCのPublicSubnetにVyattaインスタンスを作成
  • VyattaインスタンスにEIPを付与する
  • Vyattaと違うSubnet(PrivateSubnet)に疎通確認用のインスタンスを作成
  • 疎通確認用インスタンス同士で通信できればゴール

Vyattaインスタンスの構築

  • Vyattaのインスタンスは、東京リージョンにある Vyatta Core 6.6 R1 x86_64 rev1 (ami-07f47b06) のAMIを使用して作成しました
  • VyattaインスタンスにはEIPを割り当てておきます
  • インスタンスの起動後に Source/Dest Check を Disable にします
  • SecurityGroupで IKE(UDPポート番号500) と ESP(IPプロトコル番号50) を許可します

ENIをアタッチする

192.168.100.0/25 のSubnet(PrivateSubnet)用に新たに eth1 をVyattaインスタンスにアタッチします。
 

Network Interfacesをクリックします


Create Network Interfaceをクリックします

 


作成するENIの情報を入力します

  • Private IP、適用するSecurityGroupなどの情報を入力します
  • ENIに設定するIPは192.168.100.50とします


作成したENIをVyattaインスタンスにアタッチします


アタッチしたENIを認識させる

  • 新しくアタッチしたENIはインスタンスが自動的に認識しないため、手動で認識させてあげる必要があります

インスタンスにSSHでログインします。

ssh -i /Users/yamada/.ssh/xxx.pem vyatta@54.xxx.xx.xx

/etc/network/interfaces に先ほど作成した ENI の情報を追記します。
eth1として認識させます。

$ sudo nano /etc/network/interfaces

auto eth1
iface eth1 inet static
address 192.168.100.50
netmask 255.255.255.128

/etc/init.d/networking を再起動する。

$ sudo /etc/init.d/networking stop
$ sudo /etc/init.d/networking start

ENI を認識してくれたかどうかを確認します。

$ sudo ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.100.150  Bcast:192.168.100.255  Mask:255.255.255.128
          inet6 addr: fe80::480:b4ff:fed8:8ee2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:866 errors:0 dropped:0 overruns:0 frame:0
          TX packets:651 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:62336 (60.8 KiB)  TX bytes:74431 (72.6 KiB)
          Interrupt:25

eth1      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.100.50  Bcast:192.168.100.127  Mask:255.255.255.128
          inet6 addr: fe80::48d:26ff:fe28:1333/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3326 (3.2 KiB)  TX bytes:2914 (2.8 KiB)
          Interrupt:26

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7638 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7638 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:459376 (448.6 KiB)  TX bytes:459376 (448.6 KiB)

eth1 が追加した ENI になります。
※eth1 も忘れずにSource/Dest Check を Disable にします。

Vyattaの設定

つづいて、今回のメインであるVyattaに設定を流し込んでいきます。
 

設定モードに変更します。

$ configure

IPSec通信用のインターフェイスを eth0 に設定します。
※EIPをアタッチしているインターフェイスを指定します。

set vpn ipsec ipsec-interfaces interface eth0 

先ほどアタッチしたENI(eth1)をVyattaにも認識させます。

set interfaces ethernet eth1 address 192.168.100.50/25

つづいて、IKEの設定をします。
IPsecで通信するためには、大きく2つの段階(IKE フェーズ1、IKE フェーズ2)を経る必要があり、まずフェーズ1の設定をしていきます。
IKEフェーズ1の役割は大きく2つあります。

  • 1つ目は、そもそも接続を確立する通信相手が正しいのかを検証する
  • 2つ目はIKEフェーズ2でやりとりする「IPsecで暗号通信をするために必要な情報」を交換するための暗号化されたトンネルを作成する

特に2つ目の、暗号通信をするために必要な情報は第三者に知られては困るので、フェーズ1の段階で暗号化したトンネルを作成する必要があります。その暗号化されたトンネルを作成するための情報を指定します。 IKE フェーズ1の設定

set vpn ipsec ike-group ike lifetime 3600
set vpn ipsec ike-group ike proposal 1 encryption aes128
set vpn ipsec ike-group ike proposal 1 hash sha1

次はIKEフェーズ2の設定です。
フェーズ2では、フェーズ1 で作成された暗号化されたトンネルの中で通信をするのでやりとり自体が暗号化されます。

ここでは、実際のIPsec暗号通信で必要となる情報の設定をします。

set vpn ipsec esp-group esp lifetime 1800
set vpn ipsec esp-group esp proposal 1 encryption aes128
set vpn ipsec esp-group esp proposal 1 hash sha1

通信相手の認証に事前共有鍵を利用する方式を指定します。
対向のVyattaを認証する方式としてPre-Shared Key(事前共有鍵)を指定します。
当然ですが、この事前共有鍵は双方で一致している必要があります。

set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) authentication pre-shared-secret (事前共有鍵を設定)

自分自身のIDと対向のVyattaのIDを指定します。
※対向のVyattaを設定する際は、id と remote-id を入れ替えて設定します。

set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) authentication id @vyatta1
set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) authentication remote-id @vyatta2

VTI (VirtualTunnelInterface)の設定と、対向のVyattaとネゴシエーションする際のIKEグループとESPグループを指定します。

set interfaces vti vti0
set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) vti bind vti0
set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) ike-group ike
set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) vti esp-group esp

自分自身の eth0 のローカルアドレスを設定をします。

set vpn ipsec site-to-site peer 54.yyy.yy.yy(対になるVyattaのグローバルIP) local-address 192.168.100.150

スタティックルートの設定をします。
もう一方のネットワークへのネクストホップをvti0に指定します。

set protocols static interface-route 192.168.200.0/24 next-hop-interface vti0

設定を保存します。

commit
save

以上でVyattaの設定は終了です。
この設定をもう一方のVyattaにも行います。
 

もう一方のVyattaにも設定をすると、以下のコマンドでIKEとIPsecのトンネルが確立したことを確認できます。

vyatta@vyatta# run show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
54.193.17.84                            192.168.100.150

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     aes128   sha1  5        no     23      30

 

vyatta@vyatta# run show vpn ipsec sa
Peer ID / IP                            Local ID / IP
------------                            -------------
54.yyy.yy.yy                        192.168.100.150

    Tunnel  State  Bytes Out/In   Encrypt  Hash  NAT-T  A-Time  L-Time  Proto
   ------  -----  -------------      -------      ----    -----   ------    ------     -----
    vti     up     0.0/0.0        aes128   sha1  no     766     1800    all

※StateがupとなっていればOKです。
 

AWSのRouteTable設定

AWS側のSubnetのRouteTableを設定します。
疎通確認用のインスタンスがあるSubnetのRouteTableを以下のように設定します。

※もう一方のローカルネットワーク(192.168.200.0/25)への通信を、先ほど作成したENI(eth1)にルーティングします。

接続の確認

ひと通りの設定を終えたところで、実際に疎通の確認を行います。

疎通確認用のインスタンスにSSHでログインします。

ssh -i /Users/yamada/.ssh/xxx.pem ec2-user@192.168.100.10

対向の疎通確認用インスタンスに向けてpingを打ちます。

$ ping 192.168.200.10

PING 192.168.200.10 (192.168.200.10) 56(84) bytes of data.
64 bytes from 192.168.200.10: icmp_seq=1 ttl=62 time=5.59 ms
64 bytes from 192.168.200.10: icmp_seq=2 ttl=62 time=23.1 ms
64 bytes from 192.168.200.10: icmp_seq=3 ttl=62 time=4.42 ms
64 bytes from 192.168.200.10: icmp_seq=4 ttl=62 time=10.6 ms

疎通の確認が取れました。

まとめ

  • Vyattaを使って、すごく簡単にVPCの拠点間接続ができました
  • Vyatta同士のVPN接続ではハマるポイントは特にありませんが、接続するIPsec機器が違うとパラメータの設定に手こずります
  • 次回はVyattaでPPTPサーバを構築する手順をご紹介します