2013年7月4日木曜日

EC2(CentOS6)起動時に2つの別々サブネットのENIと通信できるようにしてみた

スズキです。

下記でも紹介した、件のENIルーティング問題です。
1つEC2の2つのENIの4つのEIPと通信できるようにしてみた
今回は、下図のようにENIが別々にサブネットに所属した状態です。


そして、それぞれのENI(プライベートIP)に対して疎通できるようにするのですが、
ようは、以前、@j3tm0t0さんがブログに書いた下記のお話です。
もう一度ENIについて考えてみた(Linux編)
この実装を、EC2が起動したら自動で設定されるようにしてみました。
(ENIは二つに固定で一つのENIに対して一つのプライベートIPのみ付与されてる前提です)

ネットワークの設定は下記の通りです。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=on
# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=on

EC2を起動すると下記のように設定されます。
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:10.0.0.4  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:401 errors:0 dropped:0 overruns:0 frame:0
          TX packets:373 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:29345 (28.6 KiB)  TX bytes:29602 (28.9 KiB)
          Interrupt:247

eth1      Link encap:Ethernet  HWaddr YY:YY:YY:YY:YY:YY
          inet addr:10.0.1.4  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:898 errors:0 dropped:0 overruns:0 frame:0
          TX packets:671 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:66037 (64.4 KiB)  TX bytes:70461 (68.8 KiB)
          Interrupt:246
...

ポリシーベースのルーティングは下記のスクリプトで行っています。
# cat /var/lib/cloud/scripts/per-boot/route-interface
#!/bin/sh

MACS=`curl -s 169.254.169.254/latest/meta-data/network/interfaces/macs/`

for MAC in $MACS; do

    DEVICE_NUMBER=`curl -s 169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}device-number`
    LOCAL_IPV4S=`curl -s 169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}local-ipv4s`
    SUBNET_IPV4_CIDR_BLOCK=`curl -s 169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}subnet-ipv4-cidr-block`
    export `ipcalc -n $SUBNET_IPV4_CIDR_BLOCK`

    TEMP1=`echo $NETWORK | cut -d"." -f1-3`
    TEMP2=`echo $NETWORK | cut -d"." -f4`
    GATEWAY=${TEMP1}.`expr $TEMP2 + 1`

    ip rule add from $LOCAL_IPV4S table 100${DEVICE_NUMBER} prio 100${DEVICE_NUMBER}
    ip route add table 100${DEVICE_NUMBER} default via $GATEWAY dev eth${DEVICE_NUMBER}

done

上記のスクリプトは起動時に毎回実行される用に、下記で紹介した"cloud-init"を
利用しています。
"cloud-init"でスクリプトが実行されるタイミングを調べてみた
そして、起動すると下記のように設定され、
# ip rule show
0: from all lookup local
1000: from 10.0.0.4 lookup 1000
1001: from 10.0.1.4 lookup 1001
32766: from all lookup main
32767: from all lookup default
# ip route show
10.0.0.0/24 dev eth0  proto kernel  scope link  src 10.0.0.4
10.0.1.0/24 dev eth1  proto kernel  scope link  src 10.0.1.4
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003
default via 10.0.1.1 dev eth1
どちらのENIのプライベートIPにアクセスしても通信できることが確認できます。

時間があったら、もっと汎用的に作ってみよう...
--------
http://www.suz-lab.com

0 コメント: