DHCP服务




1. DHCP服务

DHCP动态主机配置协议(Dynamic Host Configuration Protocol),允许计算机不必手工配置即可动态地被分配IP地址以及所需要的网络配置参数。

当网络规模大到一定程度,它是开始变得难以管理。特别是在手工分发IP地址的网络环境中最常见的问题是IP地址管理和IP地址冲突。处理这个问题的一个方法是为客户机动态分配IP地址。DHCP是为大量客户机提供快速、方便、有效地分配I P的方法。

DHCP允许赋给不可移动的服务器一个固定地址,该地址不会因为机器重启动而改变。

DHCP使用客户/服务器模式。当一台计算机启动时,就发送一个DHCP请求给DHCP服务器。管理员能够将一台DHCP服务器配置成两种地址类型:赋给固定地址类型和按需分配的地址缓冲池类型。当一台计算机启动并发送一个请求给DHCP,DHCP服务器查询其数据库找到配置信息。如果数据库包含该计算机的条目,服务器就返回该条目。如果没有该计算机的条目,服务器将从缓冲池中选择下一个IP地址并赋给该计算机。

DHCP使用UDP协议,客户端使用68端口,服务器使用67端口。

1.1 DHCP报文

1.1.1 DHCP报文格式

dhcp协议的报文格式如下:

image

其中各个字段意义如下:

  • OP:指明报文是请求(1)还是响应(2);

  • htype与hlen:指明网络硬件类型和硬件地址的长度,对于以太网类型为1,地址长度为6。

  • hops:客户机在字段HOPS设置为0,如果收到请求并决定将请求送到其他服务器(用作中继时,就增加HOPS计数)。

  • xid:事务标识符,它是一个随机数,用于匹配请求和响应的整数。

  • secs:延续时间,报告客户机开始启动后逝去的秒数,通常情况下设置为0。

  • flags:标志位,高位置为1,可请求服务器发送响应是使用硬件广播而不是硬件单播。

  • ciaddr:客户IP地址,如果客户机含有IP地址,则设置为客户的IP地址。

  • yiaddr:你的IP地址,如果客户机IP地址为零,则服务器设置你的IP地址字段以返回提供给客户机的IP地址。

  • siaddr:服务器IP地址,表明服务器的IP地址,在DHCPOFFER、DHCPACK中返回。

  • giaddr:路由器IP地址,它是中继的IP地址,当中继收到客户机的DHCP请求,将其转发到服务器之前,设置此字段为中继的IP地址。

  • chaddr:客户硬件地址。

  • sname:服务器主机名。

  • file:自举文件名。

  • options选项,长度是可变的。

dhcp的options字段是比较重要的,一些附带信息的下发均依靠这个字段,常用选项如下:

  • Subnet mask:子网掩码,选项1,在DHCP响应报文中使用,用以指定客户机的子网掩码。

  • Requested IP address:请求的IP地址,选项50,在DHCPDISCOVER报文中用于向服务器请求指定的IP地址。

  • IP address lease time:IP地址租用时间,选项51,在DHCPDISCOVER或DHCPREQUEST报文中,用于向服务器请求指定的租用时间;在DHCPOFFER中,则表明服务器向客户机提供的租用时间。

  • DHCP message type:DHCP消息类型,选项53,用以表示此报文的类型,BOOTP报文无此选项。报文的类型包括:DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPDECLINE、DHCPACK、DHCPNACK、DHCPRELEASE、DHCPINFORM。

  • Server identifier:服务器标识,选项54,用于DHCPOFFER、DHCPREQUEST报文中,也可选择地用于DHCPACK、DHCPNACK报文中。DHCP服务器在DHCPOFFER报文中使用此选项是为了让客户机区别不同的租用提供者。而客户机使用此选项则是为了标识其租用提供者。

  • Parameter request list:参数请求列表,选项55,客户机使用,用于请求特定的配置参数。

  • Maximum DHCP message size:最大DHCP报文长度,选项57,用于表明可以接收的DHCP报文的最大长度。

  • Renewal(T1) time value:更新时间值,选项58,用于指定更新时间。

  • Rebinding(T2) time value:重绑定时间值,选项59,用于指定重绑定时间值。

  • Client identifier:客户端标识,选项61,用于唯一标识客户端,CISCO用此作为服务器地址绑定表的索引。

1.1.2 DHCP报文类型

  • DHCPDISCOVER:客户端用于地址申请的广播报文。

  • DHCPOFFER:服务器端对客户端DHCPDISCOVER报文的回复,包含了所提供的IP地址和网络配置信息。

  • DHCPREQUEST:在不同的状态下,用途不同:

    • (a) 在请求状态时,请求服务器同意开始使用所提供的IP地址。
    • (b) 在更新状态,请求提供IP地址的服务器更新IP地址租用时间。
    • (c) 在重绑定状态,广播请求子网中的服务器,是否允许继续使用当前的IP地址。
  • DHCPACK:服务器端对客户端请求的同意报文。

  • DHCPNAK:服务器端对客户端请求的否定报文。客户端必须重新开始申请。

  • DHCPRELEASE:客户端主动终止IP地址的使用,用于释放IP地址报文。

  • DHCPDECLINE:由于地址已经被使用,客户端对服务器提供的地址表示拒绝。

  • DHCPINFORM:客户端要求服务器提供最新的网络配置信息。

1.2 DHCP工作过程

dhcp的工作流程如下:

image

  1. 客户机通过DHCPDISCOVER广播提出请求,寻找局域网中的dhcp服务器。如果客户机有一个永久性的租用地址,它可以直接请求那个地址。
  2. 服务器一旦收到请求,会从地址池中取出一个地址并返回一个附有可用IP地址的DHCPOFFER报文。
  3. 如果客户机收到多个DHCPOFFER报文,它会选择第一个DHCPOFFER报文提供的IP地址或其所请求的那一个。
  4. 客户机广播含有服务器标识的DHCPREQUEST报文并等待。
  5. 每一个服务器检查收到的DHCPREQUEST报文,若发现不含它的标识,它会丢弃该报文。当被标识的服务器接收了报文后,它会返回一个DHCPACK报文,如果所请求的IP已被分配或者租期已满,会发回DHCPNAK报文;没有被标识的服务器收到报文后会返回DHCPNAK报文。
  6. 如果客户机收到DHCPACK报文,它可以开始使用IP地址。如果它收到DHCPNAK,它会重新开始整个过程。假如IP有问题,客户机会发送一个DHCPDECLINE报文给服务器并重新开始。

1.2.1 DHCP租期更新

  • 当客户端ip的租期达到50%时,客户端会向服务器请求更新地址的租期,单播发送DHCPREQUEST报文请求更新租期,若服务器同意则回应DHCPACK消息,租期更新成功;如果该地址不可用,则服务器回复DHCPNAK消息。
  • 若之前服务器没有回复ACK消息,当客户端ip的租期达到75%时,客户端会再次请求更新租期,这次客户端将以广播形式发送DHCPREQUEST报文,若服务器同意则回应DHCPACK消息,租期更新成功;如果该地址不可用,则服务器回复DHCPNAK消息。如客户端更新租期失败,之后客户端每隔5min会广播请求地址。

image

1.2.2 DHCP中继

中继代理能中继服务器和客户机之间的交互报文。这样可以使服务器能处理不在该服务器所在子网的DHCP报文。这意味着不必为每一个子网设置一个服务器,为每一个子网设置一个服务器开销很大,以下几步说明了中继代理如何工作:

  1. DHCP客户机广播一个REQUEST消息。
  2. 中继代理把收到报文的接口对应的IP地址放到消息的giaddr域中,然后单播至服务器。
  3. 服务器给中继代理返回应答(通过单播)。应答包括与客户机所请求相同的giaddr域。
  4. 中继代理会从giaddr域中I P地址对应的接口中广播应答。

1.4 DHCP服务配置

1.4.1 DHCP服务端配置

  • 第一步:安装dhcp软件包,来自base仓库。

    [root@xuzhichao ~]# yum install dhcp -y
    

    查看dhcp包中提供的文件:

    [root@xuzhichao ~]# rpm -ql dhcp
    /etc/NetworkManager
    /etc/NetworkManager/dispatcher.d
    /etc/NetworkManager/dispatcher.d/12-dhcpd
    /etc/dhcp/dhcpd.conf        <==DHCP的配置文件
    /etc/dhcp/dhcpd6.conf       <==DHCP针对ipv6地址的配置文件
    /etc/dhcp/scripts
    /etc/dhcp/scripts/README.scripts
    /etc/openldap/schema/dhcp.schema
    /etc/sysconfig/dhcpd        
    /usr/bin/omshell
    /usr/lib/systemd/system/dhcpd.service   <==dhcp的服务启用文件
    /usr/lib/systemd/system/dhcpd6.service
    /usr/lib/systemd/system/dhcrelay.service
    /usr/sbin/dhcpd
    /usr/sbin/dhcrelay
    /usr/share/doc/dhcp-4.2.5
    /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example    <==DHCP的配置文件的样例 
    /usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
    /usr/share/doc/dhcp-4.2.5/ldap
    /usr/share/doc/dhcp-4.2.5/ldap/README.ldap
    /usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema
    /usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap
    /usr/share/man/man1/omshell.1.gz
    /usr/share/man/man5/dhcpd.conf.5.gz
    /usr/share/man/man5/dhcpd.leases.5.gz
    /usr/share/man/man8/dhcpd.8.gz
    /usr/share/man/man8/dhcrelay.8.gz
    /usr/share/systemtap/tapset/dhcpd.stp
    /var/lib/dhcpd
    /var/lib/dhcpd/dhcpd.leases          <==记录服务器已经分配的地址情况
    /var/lib/dhcpd/dhcpd6.leases
    
  • 第二步:修改dhcp的配置文件

    默认其配置文件/etc/dhcp/dhcpd.conf中没有内容,可以把样板文件复制过来进行修改

    [root@xuzhichao ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
    

    dhcp的配置文件格式如下:

    [root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf
    #authoritative;                                           <==若果此dhcp是正式的dhcp服务器,该字段应取消注释
    log-facility local7;                                      <==日志信息,默认存放在/var/log/bootlog文件中
    
    subnet 192.168.50.0 netmask 255.255.255.0 {               <==标题段,指明网络号和掩码
      range 192.168.50.1 192.168.50.99;                       <==指定分配地址的范围
      option domain-name-servers 192.168.50.1,8.8.8.8;        <==指定分配的DNS地址
      option domain-name "xu.com";                            <==指定分配的域名
      option routers 192.168.50.100;						  <==指定分配的网关地址	
      default-lease-time 6000;								  <==指定分配的默认租期,单位秒
      max-lease-time 72000;                                   <==指定分配的最大租期,单位秒                                           
    }
    

    其中dns,网关,租期等信息可以在全局下定义,也可以在subnet中定义,若两者都有定义,以subnet中的为准。

    可以指定服务器提供dhcp服务的接口,在/etc/sysconfig/dhcpd文件中定义

    [root@xuzhichao ~]# cat /etc/sysconfig/dhcpd
    #DHCPDARGS="eth1"
    
  • 第三步:启用dhcp服务

    注意:启动dhcp服务前需要确保dhcp分配的网段在本机上存在同网段的可用地址。

    [root@xuzhichao ~]# ip add show eth2
    4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:2f:d0:e4 brd ff:ff:ff:ff:ff:ff
        inet 192.168.50.100/32 brd 192.168.50.100 scope global noprefixroute eth2
           valid_lft forever preferred_lft forever
        inet6 fe80::80b9:b869:e531:3141/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
    #启动dhcpd服务
    [root@xuzhichao ~]# systemctl start dhcpd.service
    
    #开机自启dhcpd服务
    [root@xuzhichao ~]# systemctl enable dhcpd.service
    
    #查看dhcp服务的状态
    [root@xuzhichao ~]# systemctl status dhcpd.service
    ● dhcpd.service - DHCPv4 Server Daemon
       Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
       Active: active (running) since Mon 2021-06-07 05:08:44 EDT; 6s ago
         Docs: man:dhcpd(8)
               man:dhcpd.conf(5)
     Main PID: 15392 (dhcpd)
       Status: "Dispatching packets..."
       CGroup: /system.slice/dhcpd.service
               └─15392 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
    
    #查看dhcp的监听端口是否启动
    [root@xuzhichao ~]# ss -una
    State       Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
    UNCONN      0      0           127.0.0.1:323                             *:*                  
    UNCONN      0      0                   *:67                              *:*       <==此为dhcp服务端的端口               
    UNCONN      0      0                   *:68                              *:*                  
    UNCONN      0      0               [::1]:323                          [::]:*            
    

1.4.2 DHCP客户端配置

修改网卡和服务器位于同一网段,修改地址为自动获取方式:

[root@centos7_6 ~]# nmcli connection add con-name eth2-auto type ethernet ifname eth2 ipv4.method auto 
Connection 'eth2-auto' (43205f88-3b6e-48a7-a93e-5e8138a1e18f) successfully added.
[root@centos7_6 ~]# nmcli connection up eth2-auto 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)

#查看eth2接口获取的地址,网关,dns等信息
[root@centos7_6 ~]# ip add show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.1/24 brd 192.168.50.255 scope global noprefixroute dynamic eth2
       valid_lft 5993sec preferred_lft 5993sec
    inet6 fe80::da59:e2c9:e1eb:df70/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@centos7_6 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    101    0        0 eth1
0.0.0.0         192.168.50.100  0.0.0.0         UG    104    0        0 eth2
172.20.125.0    0.0.0.0         255.255.255.0   U     103    0        0 eth3
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.20.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.50.0    0.0.0.0         255.255.255.0   U     104    0        0 eth2
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@centos7_6 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lan xu.com
nameserver 192.168.2.1
nameserver 192.168.50.1
nameserver 8.8.8.8       

查看服务器端的日志:

[root@xuzhichao ~]# tail /var/log/boot.log
Jun  7 05:08:44 xuzhichao dhcpd: Sending on   Socket/fallback/fallback-net
Jun  7 05:47:15 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPOFFER on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.1 (192.168.50.100) from 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPACK on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2

1.4.2.1 dhclient工具

dhclient工具可以启动一个dhcp客户端去获取一个地址,默认所有网卡都会去自动获取地址。

默认后台执行,前台执行使用-d选项:

[root@centos7_6 ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/virbr0-nic/52:54:00:b9:1a:89
Sending on   LPF/virbr0-nic/52:54:00:b9:1a:89
Listening on LPF/virbr0/52:54:00:b9:1a:89
Sending on   LPF/virbr0/52:54:00:b9:1a:89
Listening on LPF/eth3/00:0c:29:16:20:dd
Sending on   LPF/eth3/00:0c:29:16:20:dd
Listening on LPF/eth2/00:0c:29:16:20:d3
Sending on   LPF/eth2/00:0c:29:16:20:d3
Listening on LPF/eth1/00:0c:29:16:20:c9
Sending on   LPF/eth1/00:0c:29:16:20:c9
Listening on LPF/eth0/00:0c:29:16:20:bf
Sending on   LPF/eth0/00:0c:29:16:20:bf
Sending on   Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 8 (xid=0x52cd2021)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 5 (xid=0x3ec4ade1)
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 3 (xid=0x7e857e5e)
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 5 (xid=0x3e9927e7)
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 (xid=0x7a7a899f)
DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x3e9927e7)
DHCPOFFER from 192.168.2.1
DHCPACK from 192.168.2.1 (xid=0x3e9927e7)
bound to 192.168.2.157 -- renewal in 33243 seconds.
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7a7a899f)
DHCPOFFER from 192.168.20.254
DHCPACK from 192.168.20.254 (xid=0x7a7a899f)
bound to 192.168.20.16 -- renewal in 846 seconds.
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 6 (xid=0x7e857e5e)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 9 (xid=0x3ec4ade1)
DHCPREQUEST on eth2 to 255.255.255.255 port 67 (xid=0x7e857e5e)
DHCPOFFER from 192.168.50.100
DHCPACK from 192.168.50.100 (xid=0x7e857e5e)
bound to 192.168.50.3 -- renewal in 2920 seconds.
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 18 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 12 (xid=0x52cd2021)

dhclient -r会清空所有接口获取到的地址,包括配置的静态地址,重启网络服务才能恢复。慎用!

1.4.3 为终端分配固定地址

对于一些服务器需要获取固定的IP地址的情况,可以根据终端的MAC地址分配固定的ip地址:

  • 在dhcp服务器的配置文件新增如下内容:

    [root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf
    host server {
      hardware ethernet 00:0c:29:16:20:d3;    <==指定客户端的MAC地址
      fixed-address 192.168.50.10;            <==指定客户端要分配的IP地址
      option routers 192.168.50.100;          <==指定网关,若不配置,会从subnet中分配                                                   
    }
    
  • 重启dhcp服务:

    [root@xuzhichao ~]# systemctl restart dhcpd.service
    
  • 客户端重新获取ip地址:

    [root@centos7_6 ~]# dhclient -r eth2
    [root@centos7_6 ~]# dhclient  eth2
    [root@centos7_6 ~]# ip add show eth2
    4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.50.10/24 brd 192.168.50.255 scope global dynamic eth2
           valid_lft 5995sec preferred_lft 5995sec
        inet6 fe80::639b:757c:18c4:4613/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
  • 查看服务器端的相关日志:

    [root@xuzhichao ~]# cat /var/log/boot.log
    #客户端主动放弃地址,发送RELEASE
    Jun  7 05:55:05 xuzhichao dhcpd: DHCPRELEASE of 192.168.50.3 from 00:0c:29:16:20:d3 via eth2 (found)
    #静态分配地址过程
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPOFFER on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: Dynamic and static leases present for 192.168.50.10.
    Jun  7 06:13:26 xuzhichao dhcpd: Remove host declaration server or remove 192.168.50.10
    Jun  7 06:13:26 xuzhichao dhcpd: from the dynamic address pool for 192.168.50.0/24
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.10 (192.168.50.100) from 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPACK on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2
    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM