DHCP(dynamic host configuration protocol)提供了一个给 TCP/IP 网络中的主机传递配置信息的框架。定义在 RFC 2131 中。通常用于局域网中动态分配 IP 地址。

DHCP 协议

DHCP 协议的操作过程分为四个步骤:

  1. discovery 客户端发送广播(全 1 地址的 IP 包),获取配置。 该行为发生在客户机启动、或者网卡重启时。
  2. offer DHCP 服务器响应该广播,通过单播发送配置。 若 DHCP 服务器发现该 MAC 曾用过某 IP,且该 IP 空闲则继续分给他;若存在该 MAC 的静态 IP 设置,则分配该静态 IP;上述都不满足时,分配新的 IP 并进行记录。
  3. request 客户端发送广播,通知选择的配置。 因为局域网中的 DHCP 服务器可能有多个,客户端做好选择后广播发出通知。未被采取的 DHCP 服务器将收回其 IP。
  4. acknowledge 服务器发送确认。 此时服务器开始租期计时。用户断线(ifdown, reboot, shutdown)或租约到期(未续租)则收回该配置。正常客户端会在 0.5T 时重新请求 IP,如果不成功则在 0.875T 时再请求一次。这一过程中客户端与服务器的端口分别为:68、67。

服务器配置

CentOS 中,DHCP 服务器配置文件为:/etc/dhcp/dhcpd.conf;守护进程为:/usr/sbin/dhcpd;地址租期记录在:/var/lib/dhcp/dhcpd.leases

拿来鸟哥的示例配置:

# file: /etc/dhcp/dhcpd.conf
# 1. 整體的環境設定
ddns-update-style            none;            <==不要更新 DDNS 的設定
ignore client-updates;                        <==忽略用戶端的 DNS 更新功能
default-lease-time           259200;          <==預設租約為 3 天
max-lease-time               518400;          <==最大租約為 6 天
option routers               192.168.100.254; <==這就是預設路由
option domain-name           "centos.vbird";  <==給予一個領域名稱
option domain-name-servers   168.95.1.1, 139.175.10.20;
# 上面是 DNS 的 IP 設定,這個設定值會修改用戶端的 /etc/resolv.conf 檔案內容

# 2. 關於動態分配的 IP
subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.101 192.168.100.200;  <==分配的 IP 範圍

    # 3. 關於固定的 IP 啊!
    host win7 {
        hardware ethernet    08:00:27:11:EB:C2; <==用戶端網卡 MAC
        fixed-address        192.168.100.30;    <==給予固定的 IP
    }
}
# 相關的設定參數意義,請查詢前一小節的介紹,或者 man dhcpd.conf

对于多网卡服务器,可以设置 dhcpd 监听其某个接口。在 /etc/sysconfig/dhcpd 中添加 DHCPDARGS="eth0" 即可。

然后启动并观察 dhcpd 服务:

/etc/init.d/dhcpd start
netstat -tlunp | grep dhcp
tail -n 30 /var/log/messages

客户端配置

在客户端,设置 /etc/sysconfig/network-scripts/ifcfg-eth0 为采用 DHCP 后,重启网络 /etc/init.d/network restart。观察域名解析文件的变化:

# file: /etc/resolv.conf
search centos.vbird      <==還記得設定過 domain-name 否?
domain centos.vbird      <==還記得設定過 domain-name 否?
nameserver 168.95.1.1    <==這就是我們在 dhcpd.conf內的設定值
nameserver 139.175.10.20

查看路由表:

$ route -n
Kernel IP routing table
Destination    Gateway         Genmask        Flags Metric Ref  Use Iface
192.168.100.0  0.0.0.0         255.255.255.0  U     0      0      0 eth0
0.0.0.0        192.168.100.254 0.0.0.0        UG    0      0      0 eth0
# 嗯!沒錯!路由也被正確的捉到了!OK的啦!

全零 IP 只能用于源地址,当源主机不知道自己 IP 时使用。

查看 68 端口的地址续租程序:

netstat -tlunp | grep dhc

参考:鸟哥的私房菜RFC 2131

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2014/10/02/dhcp.html。学识粗浅写作仓促,如有错误辛苦评论或 邮件 指出。