okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

Vyattaを使ってElastic Network Interfaceの動作確認をしてみる

先日、AWSから新しいサービスElastic Network Interfaceがリリースされました。
簡単に言うとAmazon VPC内のインスタンスにNICの二枚差しが可能になるサービスなようです。
今までAWSのインスタンスはeth0しか使えなかったので、これは便利になりそうです。
VPC内のネットワーク構成の幅が大きく広がるようなサービスなので、少しだけ触ってみました。
二枚差しって事はVPC内のルーティングテーブルを使わずにVyattaとかでルーティングしたりNATしたり出来るので、それを試します。
※ちなみにこちらにあるように、今までもNAT Addressingを使ってNATをする事は出来ました。
今回テストをした構成は以下のようなイメージとなります。

Vyattaは@j3tm0t0さんが作成されたAMIを使用させて頂きました。
※ENIはManagement Consoleからも作成可能で、インスタンス起動時/起動後どちらでも追加する事が出来ます。
インスタンス起動後にChange Source/Dest CheckをDisableにする事をお忘れなく。

■割り当てたローカルIPと同じ設定をVyatta側に設定します

$ configure 
# set interfaces ethernet eth1 address 10.2.2.200/24
# set interfaces ethernet eth1 smp_affinity auto 
# set interfaces ethernet eth1 speed auto 
# commit
# run show interfaces ethernet 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                        S/L  Description                 
---------    ----------                        ---  -----------                 
eth0         10.2.1.200/24                     u/u                              
eth1         10.2.2.200/24                     u/u                              
[edit]
# save

■Vyattaで行うNATの設定を行います

# set service nat rule 10 type masquerade
# set service nat rule 10 source address 10.2.2.0/24
# set service nat rule 10 outbound-interface eth0
# commit
# save

■確認用インスタンスAの起動直後のルーティングテーブルは以下のようになっています

# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.2.2.0        *               255.255.255.0   U     0      0        0 eth0
default         10.2.2.1        0.0.0.0         UG    0      0        0 eth0

■確認用インスタンスAに以下のようなルーティングを追加してみます

# route add -net 10.2.1.0 netmask 255.255.255.0 gw 10.2.2.200

■設定後のルーティングテーブルは以下のようになります

# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.2.1.0        10.2.2.200      255.255.255.0   UG    0      0        0 eth0
10.2.2.0        *               255.255.255.0   U     0      0        0 eth0
default         10.2.2.1        0.0.0.0         UG    0      0        0 eth0

インスタンスBへの疎通テストを行ってみます

# ping -c 3 10.2.1.201
PING 10.2.1.201 (10.2.1.201) 56(84) bytes of data.
64 bytes from 10.2.1.201: icmp_seq=1 ttl=63 time=31.2 ms
64 bytes from 10.2.1.201: icmp_seq=2 ttl=63 time=0.849 ms
64 bytes from 10.2.1.201: icmp_seq=3 ttl=63 time=0.863 ms

--- 10.2.1.201 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.849/10.995/31.275/14.340 ms

インスタンスBへの経路を確認するとVyattaを経由している事がわかります

# traceroute 10.2.1.201
traceroute to 10.2.1.201 (10.2.1.201), 30 hops max, 60 byte packets
 1  10.2.2.200 (10.2.2.200)  0.785 ms  0.769 ms  0.751 ms
 2  10.2.1.201 (10.2.1.201)  1.088 ms  1.232 ms  1.213 ms

インスタンスAからインスタスBにアクセスしてNATが動作しているかApacheのアクセスログを見て確認してみました

# tail -f /var/log/httpd/access_log
10.2.1.200 - - [25/Dec/2011:12:00:43 +0000] "GET /index.html HTTP/1.1" 200 12 "-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.12.9.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2"

今回はインスタスAからインスタンスBでNATされていますが、NATせずルーティングのみさせた場合はNetwork ACLsも動作します。
まだ触り始めたばかりですが、ENIはVPCで色々なネットワークを構成出来るのでインフラエンジニア的にはとてもワクワクしますね!