DHCP 协议简介

DHCP是Dynamic Host Configuration Protocol的缩写,它的前身是BOOTP。

DHCP可以说是BOOTP的增强版本,是基于C/S模式的,它提供了一种动态指定IP地址和配置参数的机制。服务器端监听UDP 67端口,客户端使用UDP 68端口

DHCP的过程:

Linux DHCP服务_第1张图片

1、发现阶段,即DHCP客户机寻找DHCP服务器的阶段。因为DHCP服务器的IP地址对于客

户机来说是未知的,所以DHCP客户机以广播方式发送DHCP DISCOVER发现信息来寻找DHCP服

务器,即向地址255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的

主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。


2、提供阶段,即DHCP服务器提供IP地址的阶段。在网络中接收到DHCP DISCOVER发现信

息的DHCP服务器都会做出响应,它从尚未出租的IP地址中挑选一个分配给DHCP客户机,向

DHCP客户机发送一个包含出租的IP地址和其他设置的DHCP OFFER提供信息。


3、选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址的阶段。如果有多台DHCP

服务器向DHCP客户机发来的DHCP OFFER提供信息,则DHCP客户机只接收第一个收到的

DHCP OFFER提供信息,然后它就以广播方式回答一个DHCP REQUEST请求信息,该信息中包含

向它所选定的DHCP服务器请求IP地址的内容。之所以要以广播方式回答,是为了通知所有的

DHCP服务器,他将选择某台DHCP服务器所提供的IP地址。


4、确认阶段,即DHCP服务器确认所提供的IP地址的阶段。当DHCP服务器收到DHCP客户

机回答的DHCP REQUEST请求信息之后,它便向DHCP客户机发送一个包含它所提供的IP地址和

其他设置的DHCP ACK确认信息,告诉DHCP客户机可以使用它所提供的IP地址。然后DHCP客户

机便将获取到的IP地址与网卡绑定,另外,除DHCP客户机选中的服务器外,其他的DHCP服务

器都将收回曾提供的IP地址。


5、更新租约。DHCP服务器向DHCP客户机出租的IP地址一般都有一个租借期限,期满后

DHCP服务器便会收回出租的IP地址。如果DHCP客户机要延长其IP租约,则必须更新其IP租约。

DHCP客户机启动时和IP租约期限过一半时,DHCP客户机都会自动向DHCP服务器发送更新其IP

租约的信息。


6、重新登录。以后DHCP客户机每次重新登录网络时,就不需要再发送DHCP DISCOVER

发现信息了,而是直接发送包含前一次所分配的IP地址的DHCP REQUEST请求信息。当DHCP

服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP地址,并回答一个

DHCP ACK确认信息。如果此IP地址已无法再分配给原来的DHCP客户机使用时(比如此IP地址

已分配给其它DHCP客户机使用),则DHCP服务器给DHCP客户机回答一个DHCP NAK否认信息。

当原来的DHCP客户机收到此DHCP NAK否认信息后,它就必须重新发送DHCP DISCOVER发现信

息来请求新的IP地址。


下面是Wireshark抓包情况,可以看到客户端获取IP的整个过程;

DHCP包内容:

Linux DHCP服务_第2张图片


常见的拓扑如下:

Linux DHCP服务_第3张图片

一、安装dhcp

[root@stu01 ~]# rpm -qa | grep dhc
dhcp-common-4.1.1-34.P1.el6.centos.x86_64
dhcp-4.1.1-34.P1.el6.centos.x86_64
dhclient-4.1.1-34.P1.el6.centos.x86_64


二、修改DHCP配置文件:

注:安装完成后dhcpd.conf文件是空的,可以复制dhcpd.conf.sample,也可以自己创建。


[root@stu01 ~]# cat /etc/dhcp/dhcpd.conf
# dhcpd.conf
#
option domain-name "test.com"; 所属域
option domain-name-servers 172.16.0.1,202.106.0.20; DNS服务器
default-lease-time 600; 默认租约时长
max-lease-time 7200; 最大租约时长
# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;
#给某个用户设置固定IP;
host Boss {
  hardware ethernet 00:0C:28:1F:28:29;
  fixed-address 192.168.20.88;
  option routers 192.168.20.128;
  option domain-name-servers 8.8.8.8;
}
#
#下面这个subnet为空,是因为没有分配这个段的IP,但必须要配置,因为如果DHCP服务器发现没有在任何一个接口上监听DHCP请求,就不会启动服务。
subnet 192.168.10.0 netmask 255.255.255.0 {
}
subnet 192.168.20.0 netmask 255.255.255.0 {
    class "vmware" {  ;设置CLASS,匹配MAC地址
        match if substring (hardware,1,3) = 00:0C:29;
    }
    class "Microsoft-clients" {  ;匹配option 60 ;
        match if substring (option vendor-class-identifier,0,4) = "MSFT";
        option domain-name-servers 202.106.0.20;
    }
    pool {    只允许vmware获取此段IP
      allow members of "vmware";
          deny members of "Microsoft-clients";
      range 192.168.20.13 192.168.20.20;
      option routers 192.168.20.1;
    }
    pool {    只允许微软客户端获取此段IP
      deny members of "vmware";
      allow members of "Microsoft-clients";
      range 192.168.20.100 192.168.20.110;
      option routers 192.168.20.1;
    }
    pool {    没有匹配CLASS的用此段IP;
      deny members of "vmware";
      deny members of "Microsoft-clients";
      range 192.168.20.220 192.168.20.250;
      option routers 192.168.20.1;
    }
}


   option 60 是一个DHCP报文中的选项,code为60,可以标示终端类型,DHCP服务器可以根据不同的终端类型分配不同的IP,不具备option60的DHCPserver将忽略该选项,否则Server在返回相应信息时采用option60选项。

   上图中用Cisco路由器和交换机做中继,配置是很简单的,只需在路由器和交换机的右侧接口配置上# ip helper-address 192.168.10.10 即可,前提是路由器和交换机上有192.168.20.0/24和192.168.10.0/24的路由;如果用Linux替代图中的R1做中继会有区别,Linux服务器会在左右2个接口同时监听DHCP消息。


Linux中继DHCP:

1、也要安装dhcp

yum install dhcp

chkconfig  dhcrelay on ;设置服务开机启动;

2、开启路由转发功能;

[root@root-server ~]# vi /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 1     1为开启转发,0为关闭
[root@root-server ~]#
[root@root-server ~]#
[root@root-server ~]# sysctl -p

3、修改dhcrelay配置文件,

[root@root-server ~]# cat /etc/sysconfig/dhcrelay
# Command line options here
DHCRELAYARGS=""
# DHCPv4 only
INTERFACES="eth0 eth1"   监听的网卡,连客户端和服务器的网卡
# DHCPv4 only
DHCPSERVERS="192.168.10.10" DHCP服务器IP;