Amazon EC2(Linux)のネットワーク設定でハマったときに見るメモ

アイキャッチ AWS EC2
432件のシェア(そこそこ話題の記事)

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

ども、大瀧です。
LinuxのEC2インスタンスでちょっと変わったネットワーク設定をしようとすると、思う通りに動かなかったり設定が見えなかったりと、オンプレミスとは雰囲気の異なる振る舞いをすることがあります(本質的にはオンプレミスとなんら変わらないのですが)。自身で経験したケースをメモ書きとして残しておきます。

  • 想定するLinux OS : Amazon Linux, CentOS 6.x, RHEL 6.xなどRed Hat系ディストリビューション

/etc/resolv.confを変更したのになぜか元に戻ってしまう

DHCPクライアントによるものです。DHCPクライアントは定期的にIPアドレス更新の問い合わせをDHCPサーバーに行いますが、そのときに付随するDNSの情報を元にデフォルトで/etc/resolv.confファイルを上書きします。これを無効にするためにNICの設定ファイル/etc/sysconfig/network-scripts/ifcfg-eth0PEERDNSオプションをnoに設定します。

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=no
IPV6INIT=no
PERSISTENT_DHCLIENT=yes

設定を反映するために、networkサービスを再起動しましょう。

[ec2-user@ip-172-31-XX-XXX ~]$ sudo service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:
Determining IP information for eth0... done.
                                                           [  OK  ]
[ec2-user@ip-172-31-XX-XXX ~]$

セカンダリIPアドレスを設定したのに見えない

Amazon Linuxでは、ENI(EC2の仮想NIC)にセカンダリIPアドレスを設定するとec2-net-utilsが自動でIPアドレスを付与してくれます。しかし、ec2-net-utilsによるアドレスの付与はiproute2ベースのため、ifconfigコマンドではアドレスが表示されません。ip addrコマンドを利用しましょう。

[ec2-user@ip-172-31-19-207 ~]$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 0A:C9:D2:45:A2:EE
          inet addr:172.31.19.207  Bcast:172.31.31.255  Mask:255.255.240.0
          inet6 addr: fe80::8c9:d2ff:fe45:a2ee/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:53935 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:65519252 (62.4 MiB)  TX bytes:2625041 (2.5 MiB)
          Interrupt:72
[ec2-user@ip-172-31-19-207 ~]$
[ec2-user@ip-172-31-19-207 ~]$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP qlen 1000
    link/ether 0a:c9:d2:45:a2:ee brd ff:ff:ff:ff:ff:ff
    inet 172.31.19.207/20 brd 172.31.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.31.26.80/20 brd 172.31.31.255 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::8c9:d2ff:fe45:a2ee/64 scope link
       valid_lft forever preferred_lft forever
[ec2-user@ip-172-31-19-207 ~]$

ENI(EC2の仮想NIC)を追加したのに通信できない

EC2インスタンスに2つ目のENIを追加したのにそのENIのIPアドレスにpingsshしても応答がない、というケースです。いろいろな原因がありますが、インスタンスとリモートホストとのルーティングが不適切な場合が多いです。Primary ENIとSecondary ENIで異なるサブネットをまたぐ場合、既定ではeth0のゲートウェイにデフォルトルートが向くため、eth1では他のサブネットやインターネットとの通信ができません。ifcfg-ethXファイルのDEFROUTE=noでデフォルトルート無しと選択できるので、ifcfg-eth0に追加(デフォルトルート無し)、ifcfg-eth1から削除(こちらにデフォルトルートを向ける)など、調節しましょう。

/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=no
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
HWADDR=0a:45:a7:69:b3:49
DEFROUTE=no
EC2SYNC=yes

設定の反映は、一度インスタンスを再起動するのが確実です。

デフォルトゲートウェイの選択だけでは対応できない場合、iproute2のポリシーベースルーティングという手も使えます。以下のURLを参考にしてください。

ただ、EC2のENI追加はハマりポイントのるつぼなので、まずは本当にENIが必要なのか?IPアドレスの追加ならeth0へのセカンダリIP追加で代用できないかなど見直していただくことをお奨めします。

まとめ

いずれもちょっとしたことですが、EC2のドキュメントでは触れていなかったところだと思うので、誰かのお役に立てれば嬉しいです。