Red Hat Linux7.5のネットワーク設定でちょっとハマった話

2018.04.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、坂巻です。

Red Hat Linux7.5(以下、RHEL)にセカンダリプライベートIPを付与したのですが、
OSがIPアドレスを認識せず、応答がない事象でちょっとハマりました。
自身で経験したケースをメモとして残しておきます。

やりたい事

ENI(EC2の仮想NIC)にセカンダリプライベートIPを設定したい。

ハマった事

以下のように、ENIにセカンダリプライベートIPを追加しました。

Web ACL

プライベートIPに関連付けしたEIPは応答するのに対し、
セカンダリプライベートIPに関連付けしたEIPが応答しませんでした。

$ ping 13.230.74.42
PING 13.230.74.42 (13.230.74.42): 56 data bytes
64 bytes from 13.230.74.42: icmp_seq=0 ttl=48 time=12.332 ms
64 bytes from 13.230.74.42: icmp_seq=1 ttl=48 time=9.719 ms
64 bytes from 13.230.74.42: icmp_seq=2 ttl=48 time=10.338 ms
(略)
$ ping 13.114.35.61
PING 13.114.35.61 (13.114.35.61): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2

OSにログインしネットワークの設定を確認してみると、
セカンダリプライベートIPがOSから認識されていませんでした。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:98:78:6c:86:88 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.151/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
       valid_lft 2874sec preferred_lft 2874sec
    inet6 fe80::498:78ff:fe6c:8688/64 scope link
       valid_lft forever preferred_lft forever

原因

結論からいうと、Amazon Linux以外のディストリビューションの場合、
セカンダリプライベートIPを認識させるにはOS側で設定が必要でした。

Amazon LinuxでセカンダリプライベートIPを使用している時は、
ec2-net-utilsが自動でIPアドレスを付与してくれています。

セカンダリプライベート IPv4 アドレスを認識するようにインスタンスのオペレーティングシステムを設定する

解決策

RHELのマニュアルより、OS側での設定方法を確認しました。

ネットワーク設定ファイルの編集

インターフェース設定ファイル

たとえば、ifcfg ファイルを使って eth0 という名前のインターフェースを静的ネットワークで設定するには、/etc/sysconfig/network-scripts/ ディレクトリー内に以下のような内容で ifcfg-eth0 という名前のファイルを作成します。

セカンダリプライベートIPを認識させるために、
/etc/sysconfig/network-scripts/eth0:0ファイルを作成しました。
こんな感じです。  

DEVICE=eth0:0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
IPADDR=172.16.0.57
NETMASK=255.255.255.0

IPADDRにはセカンダリプライベートIPを設定しています。
ファイルを作成したら、ネットワークサービスを再起動します。

$ sudo service network restart
Restarting network (via systemctl):                        [  OK  ]

再度ネットワークの状態を確認すると、OSから認識していることがわかります。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:98:78:6c:86:88 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.151/24 brd 172.16.0.255 scope global noprefixroute dynamic eth0
       valid_lft 3599sec preferred_lft 3599sec
    inet 172.16.0.57/16 brd 172.16.255.255 scope global noprefixroute eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::498:78ff:fe6c:8688/64 scope link tentative
       valid_lft forever preferred_lft forever

ちゃんと応答もします。

$ ping 13.114.35.61
PING 13.114.35.61 (13.114.35.61): 56 data bytes
64 bytes from 13.114.35.61: icmp_seq=0 ttl=47 time=10.037 ms
64 bytes from 13.114.35.61: icmp_seq=1 ttl=47 time=9.530 ms
64 bytes from 13.114.35.61: icmp_seq=2 ttl=47 time=8.019 ms

まとめ

Amazon Linux以外のディストリビューションで、セカンダリプライベートIPを利用する際は、
OS側での設定が必要なことを覚えておくと良さそうです。

ちなみに、各インスタンスタイプによって、ENIに付与できるIPアドレス数も限られているので、
こちらも頭の片隅に入れておくと良いかもしれません。

各インスタンスタイプのネットワークインターフェイスあたりの IP アドレス数