Friday, February 15, 2013

Amazon EC2 NAT インスタンスを作成する

Amazon VPC の Private Subnet 内から外部ネットワークに接続する場合、Public Subnet に NAT 用のインスタンスを立てることで解決できます。

Amazon Public AMI で NAT 用のインスタンスが ami-vpc-nat で提供されています。このインスタンスでは、rc.local から設定スクリプトを叩いて、起動時にIPマスカレードを設定していました。スクリプトの内容を抜粋すると以下の通りです。

eth0 の MAC アドレスを調べます。

ETH0_MAC=`/sbin/ifconfig | grep eth0 | awk '{print tolower($5)}' | grep '^[0-9a-f]\{2\}\(:[0-9a-f]\{2\}\)\{5\}$'`

MAC アドレスから、Amazon 提供の Instance Metadata を利用して CIDR を取得します。

VPC_CIDR_URI="http://169.254.169.254/latest/meta-data/network/interfaces/macs/${ETH0_MAC}/vpc-ipv4-cidr-block"
....
VPC_CIDR_RANGE=`curl --retry 3 --retry-delay 0 --silent --fail ${VPC_CIDR_URI}`

取得した CIDR を送信元にして、IPマスカレードを設定します。

echo 1 > /proc/sys/net/ipv4/ip_forward && \
   echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects && \
   /sbin/iptables -t nat -A POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE

自前の NAT インスタンスを立てる時には、同じスクリプトをコピーして起動時設定するなり、iptables で設定すればよいでしょう。