この記事は公開されてから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-eth0のPEERDNSオプションを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アドレスにpingやsshしても応答がない、というケースです。いろいろな原因がありますが、インスタンスとリモートホストとのルーティングが不適切な場合が多いです。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のドキュメントでは触れていなかったところだと思うので、誰かのお役に立てれば嬉しいです。