1.DHCP概述
DHCP:动态主机配置协议,避免了IP地址的冲突,简化了IP地址管理的工作量。
客户端除了从DHCP服务器得到IP地址信息外,还可以得到子网掩码、网关、DNS等其他的TCP/IP信息,这些信息并不是永久使用的,而是有一个时间限制,这个时间限制称为租约。
DHCP租约产生的过程:
1.客户端请求IP地址。客户端通过广播的方式发送一个源IP为0.0.0.0,目标IP为255.255.255.255,源端口为67,目标端口为68的DHCP Discovery消息的数据包,该数据包还包含客户端的MAC地址和主机名,以便服务器端可要知道是哪个客户端发过来的请求。
2.服务器响应。当DHCP服务器收到客户端发来的DHCP Discovery消息时,就会在自己的租约文件中查看该客户端以前是否有使用过某一个地址,如果有且该地址目前可用,则将该地址发送给客户端。如果没有的话,则查看是否有针对客户端所设置的固定IP信息,如果有的话,则分配该固定IP地址。如果以上都没有,则从DHCP地址池中选择一个没有使用的地址分配给客户端,并以DHCP Offer消息发送。源IP地址为DHCP服务器的IP地址,源端口为68端口,目标地址为255.255.255.255,目标端口为67端口。该DHCP Offer消息中还包含以下信息:
客户端的MAC地址(可以标识正确的客户端)。
分配给客户端的IP地址。
子网掩码、网关、DNS等信息。
租约期限
服务器的IP地址
3.客户端选择。在一个网段中,如果有多台DHCP服务器的话,则DHCP客户端可能会收到多个服务器发来的DHCP Offer消息,通常情况下,客户端会选择最先到达的DHCP Offer消息所提供的IP地址。这时,客户端发送的是DHCP Request消息,源IP为0.0.0.0,源端口为67,目标IP为255.255.255.255,目标端口为68。
4.服务器确认。服务器收到DHCP客户端发来的DHCP Request消息后,会使用DHCP ACK消息向客户端进行确认,租约正式生效。源IP为DHCP服务区的IP地址,源端口68,目标IP为255.255.255.255,目标端口为67.
整个过程中所有的数据包都是通过广播的形式发送的。
对于windows客户端来说,如果在发出DHCP Discovery消息后,没有收到服务器的响应的话,则会自动分配一个169.254.0.0/16的地址,这个过程叫做APIPA,以保证在没有获取IP地址的windows客户端之间也可以正常的通信。
租约更新:
当客户端重启或者是租约达到50%的时候,就需要重新更新租约。客户端会向提供租约的DHCP服务器直接发送DHCP Request消息请求租约的更新。如果服务器收到请求,则发送DHCP ACK消息给客户端,更新租约。如果客户端无法与提供租约的服务器进行通信的话,则客户端会在租约达到87.5%的时候,重新进行租约的更新,这时采用的是DHCP Discovery消息以广播的形式向所有的DHCP服务器发送请求,如果DHCP服务器响应,则客户端会使用该服务器提供的地址更新现有的租约。如果没有收到DHCP服务器的响应的话,则无法使用现有的地址。
中继代理:
由于DHCP服务器和DHCP客户端之间的通信都是通过广播的形式,因此客户端和服务器之间不能必须在同一网段,如果不再同一网段的话,则必须要通过DHCP中继代理将DHCP客户端广播发送的数据包以单播的形式发送到DHCP服务器,同时将DHCP服务器产生的数据包以单播的形式转发给DHCP客户端。
2.DHCP服务安装
安装指令:
yum install –y dhcp-*
查看是否已经正确安装:
rpm -qa | grep dhcp
或
yum list dhcp-*
[root@server1~]# rpm -qa | grep dhcp
dhcp-devel-3.0.5-31.el5
dhcpv6-client-1.0.10-20.el5
dhcp-devel-3.0.5-31.el5
dhcp-3.0.5-31.el5
[root@server1~]# yum list dhcp-*
Loaded plugins:fastestmirror, security
Loading mirrorspeeds from cached hostfile
Installed Packages
dhcp.x86_64 12:3.0.5-31.el5 installed
dhcp-devel.i386 12:3.0.5-31.el5 installed
dhcp-devel.x86_64 12:3.0.5-31.el5 installed
[root@server1 ~]#
dhcp:服务器端软件
dhcp-devel:DHCP服务器开发工具,为DHCP开发提供库文件支持。
3.DHCP服务器配置
查询配置文件的位置:rpm -qc dhcp
[root@server1 ~]#rpm -qc dhcp
/etc/dhcpd.conf #这个为DHCP的配置文件
/etc/rc.d/init.d/dhcpd #这个为DHCPD的启动文件
/etc/rc.d/init.d/dhcrelay #这个为dhcp relay的启动文件
/etc/sysconfig/dhcpd
/etc/sysconfig/dhcrelay
/var/lib/dhcpd/dhcpd.leases #这个为dhcp服务器存放租约的地方
[root@server1 ~]#
配置文件的位置:/etc/dhcpd.conf或者是/etc/dhcpd/dhcpd.conf
不同的发行版本有点区别。
服务的开机自动启动:
[root@server1 ~]#chkconfig --list | grep dhcp
dhcpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@server1 ~]#chkconfig dhcpd --level 35 on
[root@server1 ~]#chkconfig --list | grep dhcp
dhcpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
[root@server1 ~]#
服务器的启动、停止、重新启动:
/etc/init.d/dhcpdstart
/etc/init.d/dhcpdstop
/etc/init.d/dhcpdrestart
配置文件结构:
A.以#开始的表示注释
B.对大小写不敏感
C.每一行必须以分号(;)结束
D.选项必须用options关键字
默认情况下,在安装完DHCP服务以后,配置文件的内容为空,如果对DHCP的配置比较熟悉的话,可以直接对其进行编辑,如果不熟悉其配置,也没有关系,因为DHCP为我们提供了一个配置文件的模版,可以直接将模版拷贝过来。
查看模版文件的位置:
rpm –ql |grep sample
[root@server1 ~]#rpm -ql dhcp | grep sample
/usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample
[root@server1 ~]#
将该文件复制为/etc/dhcpd.conf:
[root@server1 ~]#cp -a /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
cp: overwrite`/etc/dhcpd.conf'? y
[root@server1 ~]#
该配置文件分为两部分:全局配置文件和部分配置文件。
全局配置文件:对所有的客户端都有效。
局部配置文件:对部分客户端有效。
全局优先于局部。
声明格式为:
声明 {
参数或选项;
}
常用声明:
A.shared-network { }:定义超级作用域
B.subnet <网络号>netmask <子网掩码> { }:定义作用域
C.range
D.host <名称>:分配固定IP
E.group { }:为特定范围指定参数。
常用参数:
lease-file-name <文件名>:该参数必须出现在配置文件的最顶部。指定DHCP服务器存放租约文件的文件名。默认为/var/lib/dhcp/dhcpd.leases。
allow bootp:允许bootp的查询
allow booting:允许booting的查询
ddns-update-stylenone|interim|ad-hoc:指定支持的DNS动态更新类型。
none:不支持
interim:DNS互动更新模式
ad-hoc:特殊DNS更新模式
default-lease-time:指定默认租约时间,单位为s
max-lease-time:最大租约时间,单位为s
hardware <网卡类型>
fixed-address
local-port
filename <”filename”>:指定客户端启动要载入的初始启动文件名。
next-server:指定提供初始启动文件的主机地址,如果没有指定,则默认为DHCP服务器的地址。
ping-check true|false:如果设置为true时,则客户端在分配一个IP地址之前,先发送icmpecho request(ping请求)给这个地址,等待1s,如果收到回应,则不分配该地址,如果没有收到回应,则分配该地址。
ping-timeout 时间:设置ping的等待时间,默认为1s
常用选项:
option subnet-mask <子网掩码>:指定客户端子网掩码
option routers
option broadcast-address
option nis-domain “domain”:指定nis域名
option ntp-servers:指定ntp服务器的IP地址。
option domain-name “域名” :指定客户端的DNS后缀
option domain-name-servers
option time-offset:指定时间偏移值。客户端与格林威治时间偏移量,单位为秒。
注意:DHCP服务器的地址必须为固定IP地址。
3.1 单作用域配置
单作用域环境:是指DHCP服务器只需要为一个网段的DHCP客户端分配IP地址。
配置如下:
ddns-update-styleinterim; #指定DNS动态更新类型
ignoreclient-updates; #忽略客户端的更新
subnet 172.17.100.0netmask 255.255.255.0 { #定义作用域
option routers 172.17.100.1; #指定网关
option subnet-mask 255.255.255.0; #指定子网掩码
option nis-domain "frame.com"; #指定nis域
option domain-name "frame.com"; #指定客户端的搜索域
option domain-name-servers 172.17.100.253; #指定DNS服务器地址
option ntp-servers 172.17.100.253; #指定NTP服务器地址
range 172.17.100.100 172.17.100.120; #指定地址池范围
default-lease-time 21600; #指定默认租约
max-lease-time 43200; #指定最大租约
}
启动DHCP服务:
[root@server1 ~]#/etc/init.d/dhcpd restart
Starting dhcpd:[ OK ]
[root@server1 ~]#
如果服务启动失败,可以通过tail –f /var/log/messages查看错误原因。
客户端获取地址测试:
Linux作为DHCP服务器分配IP地址时是从后往前,windows是后前往后。
可以看到,在该文件中记录了客户端的MAC地址和主机名,以及为客户端分配的IP地址和租约开始时间和结束时间。
为客户端分配一个固定的IP地址:
配置如下:
ddns-update-styleinterim;
ignoreclient-updates;
subnet 172.17.100.0netmask 255.255.255.0 {
option routers 172.17.100.1;
option subnet-mask 255.255.255.0;
option nis-domain "frame.com";
option domain-name "frame.com";
option domain-name-servers 172.17.100.253;
option ntp-servers 172.17.100.253;
range dynamic-bootp 172.17.100.100172.17.100.120;
default-lease-time 21600;
max-lease-time 43200;
host test {
hardware ethernet 00:0c:29:31:05:a5;
fixed-address 172.17.100.100;
}
}
[root@server1 ~]#
红色部分为增加的内容,指定了客户端的MAC地址以及分配的固定IP地址。
DHCP语法测试:
[root@server1 ~]# /etc/init.d/dhcpdconfigtest
Syntax:OK
[root@server1 ~]#
重启服务:
[root@server1 ~]#/etc/init.d/dhcpd restart
Shutting downdhcpd: [ OK ]
Starting dhcpd:[ OK ]
[root@server1 ~]#
客户端测试:
修改DHCP服务器启动的接口:
[root@server1 ~]#cat /etc/sysconfig/dhcpd
# Command lineoptions here
DHCPDARGS=eth0 指定监听的接口
[root@server1 ~]#
修改DCHP服务监听客户端的请求的端口:
local-port 167;
[root@server1 ~]#/etc/init.d/dhcpd configtest
Syntax: OK
[root@server1 ~]#/etc/init.d/dhcpd restart
Shutting downdhcpd: [ OK ]
Starting dhcpd:[ OK ]
[root@server1 ~]#netstat -tunlp | grep dhcp
udp 0 0 0.0.0.0:167 0.0.0.0:* 6589/dhcpd
[root@server1 ~]#
最好不要修改这个端口。
3.2多作用域配置
所谓的多作用域:就是DHCP服务器需要为一个以上的网段分配IP地址,多作用域分为2种,一个是DHCP服务器只有一个网卡,另一个是DHCP服务器有为连接的每一个作用域都有一块网卡,DHCP服务器为多网卡配置。如下图:
第二种方法就比较简单,就是配置多个单作用域结合在一起就可以了。
对于第一种情况,在DHCP单网卡的时候,需要为多个网段分配IP地址,需要使用DHCP中继,比并且需要定义超级作用域shared-network。
示例配置:
DHCP服务器端的配置:
ddns-update-styleinterim;
ignoreclient-updates;
shared-network frame {
subnet172.17.100.0 netmask 255.255.255.0 {
option routers 172.17.100.1;
option subnet-mask 255.255.255.0;
option nis-domain "frame.com";
option domain-name "frame.com";
option domain-name-servers 172.17.100.253;
option ntp-servers 172.17.100.253;
range dynamic-bootp172.17.100.100 172.17.100.120;
default-lease-time 21600;
max-lease-time 43200;
host test {
hardware ethernet00:0c:29:31:05:a5;
fixed-address 172.17.100.100;
}
}
subnet 172.17.200.0 netmask 255.255.255.0 {
range 172.17.200.100172.17.200.120;
option routers 172.17.200.1;
option domain-name "frame.com";
option domain-name-servers172.17.200.253;
option nis-domain"frame.com";
default-lease-time 7200;
max-lease-time 14400;
}
}
开启数据包转发功能:
临时开启:
echo "1"> /proc/sys/net/ipv4/ip_forward
永久开启:
修改配置文件:/etc/sysctl.conf
net.ipv4.ip_forward= 1
保存退出。使用sysctl –p使配置生效
DHCP中继的配置:
配置文件:/etc/sysconfig/dhcrelay
INTERFACES="eth0" #接收DHCP客户端发送DHCPDiscovery数据包的接口。
DHCPSERVERS="172.17.100.253" #DHCP服务器的地址。
启动服务:
/etc/init.d/dhcpdrestart #启动DHCPD服务
/etc/init.d/dhcrelayrestart #启动DHCP中继服务
设置开机自动启动:
[root@server1 ~]#chkconfig dhcpd --level 35 on
[root@server1 ~]#chkconfig dhcrelay --level 35 on
4.客户端配置
4.1Windows客户端设置
4.2Linux客户端设置
编辑网卡配置文件:/etc/sysconfig/network-scripts/ifconfig-eth0
BOOTPROTO=dhcp
PREEDNS=yes
BOOTPROTO:设置引导协议为DHCP。手动指定IP地址为none或者是static
PREEDNS:yes或者是no。yes表示优先使用/etc/resolve.conf里面定义的DNS。no表示使用DHCP服务器分配的DNS地址。
网卡配置文件说明:/etc/sysconfig/network-scripts/ifconfig-eth0
DEVICE:指定设备名称。
BOOTPROTO:指定引导协议
BROADCAST:指定广播地址
HWADDR:指定网卡MAC地址
IPADDR:指定IP地址
NETMASK:指定子网掩码
NETWORK:指定网络号
ONBOOT:是否开机自动启动
USERCTL:是否允许普通用户控制网卡
IPV6INIT:是否启动IPV6
TYPE:指定网卡类型,通常为Ethernet
DNS1:设置第一个DNS地址
DNS2:设置第二个DNS地址
DNS3:设置第三个DNS地址