■大前提
・EC2では基本DHCP設定を用いる。
・DHCPサーバはサブネットの先頭 ※DHCPの各種パケット結果を見た結果
サブネットが172.17.10.0/24 であれば、172.17.10.1がDHCPサーバになる。
・DHCP使用時の動作の流れは、以下が参考になる。
1.DHCP Discover・・・クライアントからブロードキャスト(255.255.255.255)でネットワーク全体に問い合わせを行う。
2.DHCP Offer ・・・ サーバからクライアントに対して、割り当てるIPアドレス候補を送信
3.DHCP Request・・・クライアントがサーバに対して、候補のIPアドレスを使用したい旨を通知
4.DHCP ACK・・・サーバからクライアントに対して、IPアドレス使用の許可を通知
■DHCPクライアントの設定
基本、ifcfg-ethX に
BOOTPROTO=dhcp
を設定するのみでよい。
※DHCP_HOSTNAME は、DHCPクライアントがDHCPサーバに提示するDHCPクライアント側の短いホスト名を記載するため、不要。
DHCPサーバ側の設定でDHCPクライアントの短いホスト名が必要な場合には設定する必要があるが、EC2においては不要で問題ない。
理由は下記「■DHCPパケットキャプチャ」からわかる通り、
DHCPクライアントはDHCP Discoverを使ってブロードキャストでネットワーク全体に問い合わせを行っているため、基本、固有の設定ファイルは不要となる。
ただし、様々なケース(EC2の場合には、DHCPサーバから送付されたドメイン情報(/etc/resolv.confのsearch)を上書きしたくない場合等)を考慮し、
設定ファイル(/etc/dhcp/dhclient-デバイス名.conf)を用意することもできる。
# cat /etc/dhcp/dhclient.conf
supersede domain-search "ap-northeast-1.compute.internal itoprivate.local";
supersede domain-name "ap-northeast-1.compute.internal itoprivate.local";
※supersede は、どのような値がDHCPサーバから提供されても、常にローカルで設定された値を使わなければならない場合に定義する。
■DHCPパケットキャプチャ
# systemctl status network -l
● network.service - LSB: Bring up/down networking
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: active (running) since 木 2019-10-10 21:51:17 JST; 16min ago
Docs: man:systemd-sysv-generator(8)
Process: 584 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/network.service
mq801 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H rhel752 eth0
10月 10 21:51:14 rhel752 network[584]: ループバックインターフェイスを呼び込み中 [ OK ]
10月 10 21:51:14 rhel752 network[584]: インターフェース eth0 を活性化中:
10月 10 21:51:15 rhel752 dhclient[739]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 (xid=0x521faa23)
10月 10 21:51:15 rhel752 dhclient[739]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x521faa23)
10月 10 21:51:15 rhel752 dhclient[739]: DHCPOFFER from 172.17.10.1 ※DHCPサーバ
10月 10 21:51:15 rhel752 dhclient[739]: DHCPACK from 172.17.10.1 (xid=0x521faa23)
10月 10 21:51:17 rhel752 dhclient[739]: bound to 172.17.10.10 -- renewal in 1700 seconds. ※172.17.10.10を割り当て
10月 10 21:51:17 rhel752 network[584]: eth0 のIP情報を検出中... 完了。
10月 10 21:51:17 rhel752 network[584]: [ OK ]
10月 10 21:51:17 rhel752 systemd[1]: Started LSB: Bring up/down networking.
■DHCPのリース状況確認
# cat /var/lib/dhclient/dhclient--eth0.lease
lease {
interface "eth0";
fixed-address 172.17.10.10;
option subnet-mask 255.255.255.0;
option routers 172.17.10.1;
option dhcp-lease-time 3600;
option dhcp-message-type 5;
option domain-name-servers 172.17.0.2;
option dhcp-server-identifier 172.17.10.1;
option interface-mtu 9001;
option broadcast-address 172.17.10.255;
option host-name "ip-172-17-10-10";
option domain-name "ap-northeast-1.compute.internal";
renew 4 2019/10/10 13:19:37;
rebind 4 2019/10/10 13:43:45;
expire 4 2019/10/10 13:51:15;
}
■dhclientプロセスが起動するまでの流れについて
念のため、dhclientプロセスの親プロセスが何かを確認する。
下記プロセスツリーの通り、systemdから起動している。
# pstree -p ※tqは文字化け。。。
systemd(1)qwqagetty(1168)
tqagetty(1169)
tqauditd(385)qqq{auditd}(387)
tqchronyd(477)
tqcrond(1167)
tqdbus-daemon(493)
tqdhclient(801)
tqgssproxy(472)qwq{gssproxy}(479)
1./etc/init.d/network にて NIC分の./ifupが実行される。
action $"Bringing up interface $i: " ./ifup $i boot
2./etc/sysconfig/network-scripts/ifup 内で、ifup-eth が実行される。
if [ ! -x ${OTHERSCRIPT} ]; then
OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
fi
exec ${OTHERSCRIPT} ${CONFIG} $2
3./etc/sysconfig/network-scripts/ifup-eth 内で、dhclientプロセスを起動している。
※219行目あたり。
if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
echo $" done."
dhcpipv4="good"