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 インスタンス
- Public(eth0): 10.0.0.100
- Private(eth1): 10.0.1.100
- HTTPサーバインスタンス
- Private(eth0): 10.0.1.10
を設定しています。
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アドレスプールから払い出されています
- Private IPアドレスで接続出来ました
今回は簡単に設定してみましたが、実際はセキュリティ強度を上げるためにSGの接続元IPアドレスを絞ったり、Vyattaの設定ももう少しする必要がありますが、簡単に出来ますね。
Source/Dest CheckをDisableに設定するところを注意して下さい。
VPCで、VPN接続点とNATインスタンスが無いタイプもあって欲しいですね。。NATインスタンスの料金もかかってしまうので。
Vyattaは高機能なソフトウェアルータなので、是非触ってみてはいかがでしょうか?
うまくいかない時は、tcpdumpでパケットの流れを見るとわかりやすいと思います。Vyattaも
sudo tcpdump -n -i eth1 dst port 80
のように使うことができます。