您的位置:首页 > 理论基础 > 计算机网络

DHCP原理及配置

2015-11-19 22:38 681 查看
DHCP全称为动态主机配置协议(Dynamic Host Configure Protocol)。从名字我们就可以看出来,这是一个动态的配置主机的协议。DHCP是用来实现给主机自动分配IP地址,从而来减轻网络管理员手动配置IP地址的繁琐。当我们面临几十台的主机还无法体现出这个“繁琐”,但当我们面临一个企业几百台或者是IDC机房上千台主机的时候,你就感受到痛苦了。
DHCP是一个C/S(C:客户端,S:服务器端)架构的协议,所以需要提供一个DHCP服务器,在Linux中,DHCP的服务器端软件是DHCPD。DHCP是UDP协议,与其他协议有所不同,DHCP协议可能是双向通信的,所以客户机和服务器端都需要各自监听一个端口,来完成协议通信:服务端为67,客户端为68。(注:DHCP是由bootp协议的升级版。)
客户机从DHCP获取IP地址的过程我们称为DHCP租约过程,分为四个步骤:



接下来我们通过抓包的方式详细谈一谈这四个步骤:
1.客户端请求IP地址:
客户机发起一个DHCP Discover包,用来请求IP地址:


继续进一步分析这个Discover包,可以看到:
1)目标MAC地址为广播地址(Destination:ff:ff:ff:ff:ff:ff),源MAC地址为客户机MAC地址(Source:00:0c:29:97:15:cb)
2)目标IP地址为广播地址(Destination:255.255.255.255),源IP地址为0.0.0.0
3)目标端口为67,源端口为68





2.服务器响应客户机请求:
服务器发送一个DHCP Offer包,响应客户机的请求:


继续进一步分析DHCP Offer包,可以看到:
1)源MAC地址为DHCP服务器的地址(08:10:78:20:99:20),目标MAC地址为广播地址(ff:ff:ff:ff:ff:ff)

2)源IP地址为DHCP服务器的地址(172.16.100.1),目标IP地址为广播地址(255.255.255.255)
3)源端口号为服务器端端口号(67),目标端口号为客户端端口号(68)
4)分配给客户机的IP地址是172.16.100.35/255.255.255.0
5)租约为1天



3.客户端回应(选择IP地址)
客户端回应一个DHCP Request包,选择IP地址:



进一步分析DHCP Request包:
1)源MAC地址为客户机地址,目标MAC为广播地址
2)源IP地址为0.0.0.0,目标IP为广播地址
3)源端口为68,目标端口为67
4)请租的IP地址为172.16.100.35



4.服务器确认
服务器响应一个ACK/NACK(如果IP可用,服务器就回应一个ACK包,其中包含租约等信息;如果IP不可用,服务器就回应一个NACK包,表明此IP不可用),这里为ACK包。


进一步分析ACK包:

1)源MAC地址为服务器地址,目标MAC为广播地址 2)源IP地址为0.0.0.0,目标IP为广播地址 3)源端口为67,目标端口为68 4)出租的IP地址为172.16.100.35/255.255.255.0 5)租约为1天



至此,客户机获取到了IP地址。
由于这个IP是“”来的,所以是有租期的,正如上面看到了,我这里的起始租约是1天。当租约达到50%的时候,客户机就会联系服务器续约,续约后服务器将此IP的使用期限重置为1天。如果在租约达到50%的时候,客户机无法联系到服务器,那么就会继续使用到当前时间的50%(也就是总体租约达到75%),以此类推,最后当租约已使用了87.5%还无法联系到服务器时候,客户机认为该DHCP服务器已经无效,重新发起Discover获取IP的请求。
上面提到中继。设想一个场景:一个公司有A和B两个网络,但是不想给每个网络都分配一个DHCP服务器,只想用一个DHCP服务器完成地址的分配,该怎么办呢?此时就可以用到中继了,将DHCP服务器放到A网络中,配置一个地址池,用于给A网络分配地址,然后配置一个中继地址池,用于给B网络分配地址。之后在路由器(直连A-B)上,配置一个中继,当B网络的客户机发起DHCP的请求时,路由器就将请求发给A网络的DHCP服务,DHCP服务器将请求响应给路由器,路由器再响应给B网络。(注意:此过程路由器和DHCP间是单播通信,路由器和B网络的主机为广播通信)。这个就是中继,这个我这里就不讲了,如果大家想了解的话,自行搜索。

-------------------------------------------- 一条分割线-------------------------------------------------
配置部分:
1.安装dhcp包:
[root@localhost ~]# yum install -y dhcp
2.查看dchp包包含的内容
[root@ ~]# rpm -qpl dhcp
/etc/dhcp                  #dhcp的配置文件所在的目录
/etc/dhcp/dhcpd.conf       #dhcp的配置文件
/etc/dhcp/dhcpd6.conf      #ipv6的dhcp的配置文件,忽略掉即可
/etc/openldap/schema/dhcp.schema
/etc/portreserve/dhcpd
/etc/rc.d/init.d/dhcpd     #dhcp服务脚本
/etc/rc.d/init.d/dhcpd6
/etc/rc.d/init.d/dhcrelay  #dhcp中继的服务脚本
/etc/rc.d/init.d/dhcrelay6
/etc/sysconfig/dhcpd       #服务脚本的配置文件
/etc/sysconfig/dhcpd6
/etc/sysconfig/dhcrelay
/etc/sysconfig/dhcrelay6
/usr/bin/omshell
/usr/sbin/dhcpd       #dhcp程序
/usr/sbin/dhcrelay    #dhcp中继程序
..........    #还有很多,由于后面的都是一些文档,我这里就省略了
3.查看配置文件:
根据上面内容我们看到,dhcp的配置文件在/etc/dhcp这个目录中:
[root@ ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample   #他说配置文件的示例在/usr/share....里
#   see 'man 5 dhcpd.conf'
#
[root@ ~]#
按照要求复制配置dhcpd.conf文件到/etc/dhcp/并改名为dhcpd.conf:
[root@ ~]# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
cp: overwrite `/etc/dhcp/dhcpd.conf'? y               #询问是否覆盖之前存在的配置文件,y覆盖
[root@ ~]#
我们先来解释一下这个配置文件的格式:
1.总体分为四个部分:
option #定义全局参数
subnet Netaddress netmask NETMask{ #定义子网
}
host NAME { #主机配置
}
log-facility #定义dhcp自身运行参数
2.每个参数以分号(';')结尾。
3.全局参数对全局生效,局部参数高于全局参数;

4.DHCP常用参数详解:

domain-name为客户端指明DNS服务器的名称
domain-name-servers指定DNS服务器
routers网关地址
default-lease-time默认租约期限
max-lease-time最大租约期限
log-facility日志服务器级别
subnet定义子网
rangedhcp地址池
host定义单独主机
filename指定PXE文件
server-name通知客户端dhcp服务器名字
fixed-address定义主机的IP地址
为了方便起见,我这里是一个简化的dhcp的配置文件(包含了会用到的所有的信息):
[root@ ~]# sed -i '/^#/d' /etc/dhcp/dhcpd.conf
[root@ ~]# sed -i '/^$/d' /etc/dhcp/dhcpd.conf
[root@ ~]# cat /etc/dhcp/dhcpd.conf
#option domain-name "test.org"; #定义域名为test.org,这个没用,一般都注释掉
option domain-name-servers 172.16.0.1; #定义DNS服务器为172.16.0.1,多个空格分割
option routers 172.16.0.1; #定义网关为172.16.0.1
default-lease-time 600; #定义默认租约期限,这里为600秒
max-lease-time 7200; #定义最大租约期限,这里为7200秒
log-facility local7; #日志为faility local17;可以看/etc/rsyslog.conf,这里不解释
subnet 172.16.0.0 netmask 255.255.0.0 { #定义了一个子网172.16.0.0/24,注意,这个地址池要和你服务器的IP在同一网段,即使是中继,也要至少有一个本地子网段!
range 172.16.10.10 172.16.10.20; #地址池从172.16.10.10到172.16.10.20;以空格分割
option broadcast-address 172.16.255.255; #定义广播地址为172.16.255.255
default-lease-time 86400;
max-lease-time 86400;

}
host mandrava { #定义一个名为mandrava的主机
option routers 172.16.100.30; #定义网关
option domain-name-servers 172.16.100.30; #定义域名服务器
option broadcast-address 172.16.100.255; #定义广播地址
filename "vmunix.passacaglia"; #指向一个文件,用于PXE
server-name "toccata.fugue.com"; #通知客户端dhcp服务器名字
hardware ethernet 0:0:c0:5d:bd:95; #声明了mandrava这个主机的MAC地址
fixed-address 172.16.100.1; #定义这个主机的ip地址为172.16.100.1
}

没有写在subnet或host中的选项是全局选项,也就是默认值,当host或者subnet中没有定义的时候生效。当内部定义后,则匹配最精确的,也就是自身定义的。

5.启动dhcp:
[root@localhost ~]# service dhcpd start
Starting dhcpd:                                            [  OK  ]
[root@localhost ~]#
6.查看监听的端口:
[root@localhost ~]# ss -tunl
Netid  State      Recv-Q Send-Q                                                   Local Address:Port                                                     Peer Address:Port
udp    UNCONN     0      0                                                                    *:67                                                                  *:*
udp    UNCONN     0      0                                                                    *:68                                                                  *:*
udp    UNCONN     0      0                                                                    *:631                                                                 *:*
tcp    LISTEN     0      128                                                                 :::22                                                                 :::*
tcp    LISTEN     0      128                                                                  *:22                                                                  *:*
tcp    LISTEN     0      128                                                          127.0.0.1:631                                                                 *:*
tcp    LISTEN     0      128                                                                ::1:631                                                                :::*
tcp    LISTEN     0      100                                                                ::1:25                                                                 :::*
tcp    LISTEN     0      100                                                          127.0.0.1:25                                                                  *:*
tcp    LISTEN     0      128                                                          127.0.0.1:6010                                                                *:*
tcp    LISTEN     0      128                                                                ::1:6010                                                               :::*
tcp    LISTEN     0      128                                                          127.0.0.1:6011                                                                *:*
tcp    LISTEN     0      128                                                                ::1:6011                                                               :::*
可以看到监听了udp的67号端口。而68号监听的原因是因为这个服务器也有可能作为客户端,这个监听跟dhcpd服务没关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息