VPC上にAmazon LinuxでPPTPサーバを構築する手順について。

【ニーズ】
・動的IPからVPC上の検証用webサーバに対してアクセスさせたいけど、検証用なので、第三者から丸見えにはしたくない!
・Windows、Mac、iphone、AndroidなどOS問わず使えるようにしたい!!
・専用のクライアントソフトを導入しなくても使えるようにしたい!!!
・監視設定や、chefのレシピなど、運用時にAmazon Linux用の既存ノウハウを活用したい!!!!

といった要望を簡単に満たせる方法はないかと模索してみました。

【実現案】
・Amazon Linux上でpptpdを動かす。
・クライアントとPPP認証し、PPTPトンネル接続する。
・EIPを使ってPPTPサーバのIPを固定する。
・クライアントのIPをNAT変換し、EIPが送信元IPとして他のサーバから見えるようにする。
・既存VPC環境のSecurity Groupにて、上記で作成したEIPからのインバウンドトラフィックを許可する。

1.Security Groupの作成
今回作成するPPTPサーバに付与するSecurity Groupを作成します。仮にtestPPTPとします。
Inboundのみ以下とおり設定します。

Screenshot-from-2015-06-14-162424

PPTPで使用するポートはTCP 1723(PPTP)とIP 47(GRE)です。
SSHで許可しているのは自分のIPです。

2.アクセス対象のSecurity Groupにて、1.で作成したSecurity Groupからのインバウンドトラフィックを許可します。

3.EC2インスタンスの作成。
PPTPDしか動かさないので、サーバー自体にはそれほど負荷はかからないと思いますが、
複数人で同時接続した場合、t2だと帯域が足りなくなる可能性があるので、m3.mediumを使います。

4.インスタンスにEIPを付与します。

5.ソースIPのチェックを外します。

SDcheck

※ちなみに、外さなくても通信出来ました。

5.pptpdのインストール

sudo su -
yum -y localinstall http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm

6./etc/pptpd.confの編集
localipとremoteipを編集します。
localipにはEC2インスタンスのプライベートIPを入力します。
インスタンス上ではEIPを認識しませんが、外部に出る時はEIPに変換されます。
remoteipにはPPTPクライアントに割り振るIPアドレス帯を設定します。
PPTPサーバ〜クライアント間のNWでしか使わないので、IPの重複などはあまり考えなくても良さそうです。

vim /etc/pptpd.conf
#logwtmp
localip     10.0.4.3
remoteip    192.168.0.11-30

7./etc/ppp/options.pptpdの編集
参照先DNSのアドレスとMTU、MRU値を追記してください。

vim /etc/ppp/options.pptpd
ms-dns    8.8.8.8
ms-dns    8.8.4.4
MTU 1350
MRU 1350

8./etc/ppp/chap-secretsの編集
PPTP接続時のユーザ名、パスワードを設定してください。

 pptpd  *

9./etc/sysctl.confの編集

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
/sbin/sysctl -p

10.iptablesの編集
NATを有効にします。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

※/etc/rc.localに上記コマンドを入力しておくと、再起動後も有効となります。

11.pptpdの起動設定

chkconfig pptpd on

12.サーバ再起動

shutdown -r now

13.クライアント側の設定

以下サイトが参考になりました。
http://www.seil.jp/support/tech/doc/users-guide/pppac-client/ios5_pptp.html
http://www.seil.jp/support/tech/doc/users-guide/pppac-client/win7_pptp.html

※特別編
・PPTPサーバからのアクセス制限

上記の設定だとPPTPサーバからインターネットに接続し放題なので、利便性は高いです。
しかし、利用者がVPN接続を切断し忘れて動画サイトなどを見てしまうと、VPCを経由することになるので、その分のインフラコストを負担しなければなりません。
利用者にとっても、どんなサイトを見ていたか管理者にバレてしまうので、お互いにとって不幸な結果になってしまいます。

そこで、PPTPサーバからのアクセス制限の方法を紹介します。

1.Security Groupにてアウトバウンドトラフィックを制御する。
【長所】
設定が簡単。
【短所】
セキュリティグループで指定できるのは、CIDRもしくはSGのみ。
ドメイン指定不可。
外部向けELBをホワイトリストに登録できない。
→ELBのセキュリティグループ向けのアウトバウンド通信のみ許可する設定にすれば良いかと思いましたが、できませんでした。
 どうやらELBの外部向けIPはセキュリティグループの範疇外のようです。
 例えば54.0.0.0/8のようなデカいCIDRを許可する荒業で対応するか、内部ELBを作成するといったことで回避可能です。

2.iptablesのにて転送設定を制限する。
【長所】
iptablesのオプションを使って、細かい条件を指定できる。
【短所】
設定が難しい。
設定を間違えるとインスタンスにログインできなくなる。(2回もやらかした。)
【設定例】
一応載せては置きますが、
私のiptableスキルはひのきのぼう勇者レベルなので、
詳しい方フィードバックください。

iptables -P FORWARD DROP
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp --sport 53 -j ACCEPT
iptables -A FORWARD -m tcp -p tcp --dst hogehogehoge.net --dport 80 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

参考サイト
http://www.yzhang.net/blog/2013-03-07-pptp-vpn-ec2.html

元記事はこちら

【備忘録】AWS VPC上にAmzon LinuxでPPTPサーバを構築