まめ畑

ゆるゆると書いていきます

Amazon VPCにVyattaを使ってVPN接続をしてみた

Amazon AWSで提供されている、VPCというサービスがあります。VPCは公開用のPublic SubnetとPrivate Subnetの2つを作成することが出来、VPN接続もサポートしているため、AWS上に簡易的なDCの様なものを作成でき、VPNを使って会社やDCと繋ぐことが可能になっています。実際には、VPCには4つの種類があり、Private Subnetだけ、VPN接続点無しなどが選べます。VPNの接続には1時間毎に課金されます。


今回は、VPC with Public and Private Subnetsを使って、VPC上にVyattaでVPNサーバとNATインスタンスを作成しました。NATインスタンスはAmazonから提供されているのですが、NATしか出来ないので、Vyattaを使うことで様々な機能を実現することができます。また、VPN接続点を使用しないので、VPN接続料金もかかりません。今回はSSHとHTTPをNATするようにしました。


まず、VPCを作ります。

今回サブネットは

  • Public Subnet: 10.0.0.0/24
  • Private Subnet: 10.0.1.0/24

を設定しました。
Routingテーブルは、Private Subnet用の物のデフォルトルート(0.0.0.0)は既存のNATインスタンスではなく、Vyattaインスタンスの追加したeth1のENIに向けて下さい。


VPCを作成したら今度は、Vyattaインスタンスを作成します。今回は東京リージョンで以下のAMIを使用しました。
ami-0079c901 407613804811/Vyatta Core 6.4 rev.5 Vyatta Core6.4はコマンド体系が一部変わっているため、6.3以下のコマンドと異なっているところがあるので注意が必要です。
VyattaインスタンスはPublic Subnetに作成します。作成時に固定IPを割り当てます。今回は 10.0.0.100をeth0に割り当てています。


インスタンスの作成が完了したら、Private Subnetに所属させるENIを作成して、Vyattaインスタンスにアタッチします。eth1としてアタッチされるので、VyattaインスタンスのSource/Dest. checkを無効にします。

VyattaインスタンスにアタッチしたENIも同様に無効にします。


今回は以下の様な簡易的なセキュリティグループを作成し、それぞれのインスタンスに適用しています。本来であればもう少しきつく制御するべきだと思います。

  • Private SubnetのHTTPサーバ用


今回の構成は、VyattaインスタンスのPublic IPアドレスvpn.conma.meとドメインを振りました。

を設定しています。


VyattaインスタンスにNATの設定をします。

#Vyattaにログイン
ssh vyatta@VyattaのEIP -i key.pem


設定を流し込みます。
まずは、基本設定

configure
set system name-server 8.8.8.8
set system name-server 8.8.4.4

set system host-name vyatta-gw
set system time-zone Asia/Tokyo
set system ntp server ntp.nict.jp

#このネットワークアドレスは、環境にあわせて設定して下さい
set interfaces ethernet eth1 address 10.0.1.100/24 duplex auto speed auto


NATの設定

configure
set nat source rule 10
set nat source rule 10 outbound-interface eth0
set nat source rule 10 source address 10.0.1.0/24
set nat source rule 10 translation address masquerade 


set nat destination rule 20
set nat destination rule 20 inbound-interface eth0
set nat destination rule 20 destination address 10.0.0.100
set nat destination rule 20 destination port 80
set nat destination rule 20 protocol tcp
set nat destination rule 20 translation address 10.0.1.10

set nat destination rule 30
set nat destination rule 30 inbound-interface eth0
set nat destination rule 30 destination address 10.0.0.100
set nat destination rule 30 destination port 2222
set nat destination rule 30 protocol tcp
set nat destination rule 30 translation address 10.0.1.10
set nat destination rule 30 translation port 22

commit
save

#確認
vyatta@vyatta-gw# show nat
 destination {
     rule 20 {
         destination {
             address 10.0.0.100
             port 80
         }
         inbound-interface eth0
         protocol tcp
         translation {
             address 10.0.1.10
         }
     }
     rule 30 {
         destination {
             address 10.0.0.100
             port 2222
         }
         inbound-interface eth0
         protocol tcp
         source {
         }
         translation {
             address 10.0.1.10
             port 22
         }
     }
 }
 source {
     rule 10 {
         outbound-interface eth0
         source {
             address 10.0.1.0/24
         }
         translation {
             address masquerade
         }
     }
 }


これで、Private Subnetのインスタンスに接続してみます。

ssh ec2user@vpn.conma.me -p 2222 -i hoge.pem


接続が成功したら、VPN用にRouteを追加します。

sudo route add -net 10.0.0.0/24 gw 10.0.1.100

[ec2-user@ip-10-0-1-10 ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.1.1        0.0.0.0         UG    0      0        0 eth0
10.0.0.0        10.0.1.100      255.255.255.0   UG    0      0        0 eth0
10.0.1.0        *               255.255.255.0   U     0      0        0 eth0


これで、apacheをインストールしてコンテンツを置いてみました。

表示されましたね。


では、VPNの設定をします。今回はPPTPで接続します。
Vyattaに接続して以下の設定を流し込みます。IDやパスワードなどは適時変更して下さい。今回は、VPNクライアントに、10.0.0.200 - 10.0.0.210までのIPアドレスを払い出すようにしました。

configure

set vpn pptp remote-access outside-address 10.0.0.100
set vpn pptp remote-access client-ip-pool start 10.0.0.200
set vpn pptp remote-access client-ip-pool stop 10.0.0.210
set vpn pptp remote-access dns-servers server-1 8.8.8.8
set vpn pptp remote-access dns-servers server-2 8.8.4.4
set vpn pptp remote-access authentication mode local
set vpn pptp remote-access authentication local-users username con_mame password *********

commit
save


後はクライアントの設定をします。
Macの場合は以下の様にします。

  • ネットワークの設定を開いて

  • 先程設定した情報を入力します。パスワードは認証設定のボタンをクリックして開いたメニューから設定します。


あとは、接続するだけです。認証が成功すると、Private SubnetのIPアドレスでアクセス出来る様になります。


iPhoneからも繋いでみます。

  • 設定をします

  • 接続します

 

  • 設定したIPアドレスプールから払い出されています



今回は簡単に設定してみましたが、実際はセキュリティ強度を上げるためにSGの接続元IPアドレスを絞ったり、Vyattaの設定ももう少しする必要がありますが、簡単に出来ますね。
Source/Dest CheckをDisableに設定するところを注意して下さい。


VPCで、VPN接続点とNATインスタンスが無いタイプもあって欲しいですね。。NATインスタンスの料金もかかってしまうので。
Vyattaは高機能なソフトウェアルータなので、是非触ってみてはいかがでしょうか?
うまくいかない時は、tcpdumpでパケットの流れを見るとわかりやすいと思います。Vyattaも

sudo tcpdump -n -i eth1 dst port 80

のように使うことができます。