以前紹介した記事「1つEC2の2つのENIの4つのEIPと通信できるようにしてみた
件のENIルーティング問題です。

今回は、下図のように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にアクセスしても通信できることが確認できます。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら