DHCP:Dynamic Host Configuration Protocol 动态主机配置协议,对客户机动态分配TCP/IP信息 :包括IP地址、子网掩码、默认网关、首选DNS服务器等信息。
服务器端监听端口:UDP 67
客户端监听端口:UDP 68
DHCP服务器是以地址租约的方式为DCHP客户端提供服务的,有两种方式:
限定租期:当租约快到期时,客户端必须向DHCP服务器提出续约请求,请求成功后可以继续使用该IP地址。如果客户端没有续约或者续约不成功,服务器就会将该IP地址回收,分配给其他DHCP客户端使用。
永久租用:当DHCP客户端向DHCP服务器租用到IP地址后,这个地址就永久地分配给这个DHCP客户端使用。
工作原理:
当DHCP客户端IP地址使用时间达到租期的一半时,它就会向DHCP服务器发送一个新的DHCPREQUEST,服务器在接收到请求时,没有拒绝理由便会发送一个DHCPACK信息,当DHCP收到DHCPACK的请求后,就重新开始一个租用周期。
当DHCP客户端重新启动时,不管IP地址租约是否到期,都会以广播的方式,给网络中的DHCP服务器发送一个DHCPREQUEST信息,若没有收到应答且租期还没过期,那么DHCP客户端将继续使用该IP地址。
当IP地址的租期超过一半但续约失败时,该DHCP客户端仍可使用该IP,但是将在租期达到87.5%时候再次利用广播信息发送一个DHCPREQUEST信息,以便找到一台可以继续提供租期的DHCP服务器。如果DHCP服务器返回DHCPNACK信息,说明租约失败,此时客户端需重新开始DHCPDISCOVER四个过程。
进程名称dhcpd
主配置文件 /etc/dhcpd.conf /etc/sysconfig/dhcpd(参数性配置文件)
启动脚本 /etc/init.d/dhcpd
下面我们就在来在linux上配置DHCP服务。
首先必须确保自己的主机为静态IP。如果网卡使用host-only连接方式则一定要把虚拟机的DHCP服务停掉,不然会影响实验效果。
[root@station39 ~]# yum install dhcp -y
[root@station39 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
主配置文件需要手动创建,这里我们将系统提供给我们的模板拷贝到/etc/下,稍加修改即可使用:
[root@station39 ~]# cd /usr/share/doc/dhcp-3.0.5/
[root@station39 dhcp-3.0.5]# cp dhcpd.conf.sample /etc/dhcpd.conf
主配置文件的相关参数:
ddns-update-style interim; //** 指定DDNS的更新方式,DNS和DHCP服务器双方协同
工作提供动态DNS的时候的工作方式
ignore client-updates; //** 忽略客户端更新请求
PS:当全局参数和局部参数出现冲突时,以局部参数为准。作用范围越小,优先级越高
[root@station39 ~]# vim /etc/sysconfig/dhcpd
DHCPDARGS=eth0 //** 指定监听的网卡
启动之后查看一下监听端口:
[root@station39 ~]# netstat -ntulp | grep 67
udp 0 0 0.0.0.0:67 0.0.0.0:* 16653/dhcpd
PS:dhclient 客户端所使用的进程
dhclient -d eth0 //** 在前台运行,默认运行在后台
使用客户端获得一下IP来验证一下效果:
看,已经获得了一个我们所定义的地址池内的IP。
PS:linux上DHCP服务器分配IP的方式是从大到小,而windows 上DHCP服务器分配IP的方式是从小到大,这里你应该明白客户端为什么获得的是150的IP了。
为客户端分配一个固定的地址:
修改dhcpd.conf文件
host web {
hardware ethernet 00:0C:29:84:22:C1;
fixed-address 192.168.10.119;
}
重启服务。
客户端重新获得一下IP试试:
OK!完全没问题!
为固定IP定义参数:
# we want the nameserver to appear at a fixed address
host web {
option routers 192.168.10.10;
option domain-name-servers 192.168.0.110;
hardware ethernet 00:0C:29:84:22:C1;
fixed-address 192.168.10.119;
}
PS:在网卡的配置参数里添加PEERDNS=no,使用自己配置的DNS地址,无论DHCP服务参数如何改变,都不改变/etc/resolv.conf 中的定义。
/var/lib/dhcpd/dhcpd.leases保留当前已经租出去的IP的客户端所获得的地址租约的信息。
根据客户端的类型给予其特定的IP:
class "virtual" {
match if substring (hardware, 1,3) = 00:16:3e or
substring (hardware,1,3) = 00:16:36;
}
class "vmware" {
match if substring (hardware, 1,3) = 00:0c:29
}
class "microsoft-clients"
match if substring (option vendor-class-identifier,0,4) = "MSFT"; //** 根据供应商类
别标识
option routers 192.168.0.254;
option domain-nameservers 192.168.0.90
}
pool {
allow members of "virtual"; //**允许哪一类客户端来获得此地址
range 192.168.0.90 192.168.0.110
}
pool {
deny members of "virtual"; //** 拒绝哪一类客户端来获得此地址
deny members of "microsoft-clients";
range 192.168.0.2 192.168.0.90;
}
pool {
deny members of "virtual";
allow members of "microsoft-clients";
range 192.168.0.202 192.168.0.252;
}
DHCP 中继 relay
我们在虚拟机上来模拟DHCP中继代理的功能:
实验环境配置:DHCP server IP :192.168.10.1 网络连接:Vmnet2
Router: eth0:192.168.10.11 网络连接:Vmnet2
eth1:192.168.20.10 网络连接:桥接
DHCP Relay :192.168.20.11 网络连接:桥接
物理机做客户端
修改DHCPServer 的主配置文件/etc/dhcpd.cconf ,添加一个地址池:
subnet 192.168.20.0 netmask 255.255.255.0 {
option routers 192.168.20.1;
option domain-name "linna.com";
option subnet-mask 255.255.255.0;
range 192.168.20.11 192.168.20.50;
}
重启服务
为DHCP server添加网关
[root@station39 etc]# route add default gw 192.168.10.11
为DHCP relay server添加网关
[root@station26 ~]# route add default gw 192.168.20.10
修改/etc/sysconfig/dhcrelay文件
[root@station26 ~]# vim /etc/sysconfig/dhcrelay
INTERFACES="eth0"
DHCPSERVERS="192.168.10.1"
启动中继服务:
[root@station26 ~]# service dhcrelay start
为做router的这台主机打开内核路由功能
[root@server27 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
OK!已经配置完成,我们使用物理机来验证一下效果:
看!获得的是20网段的地址,说明我们的DHCP中继已经起作用了。