DHCP服务
1. DHCP简介
1.1 DHCP
- DHCP: Dynamic Host Configuration Protocol 动态主机地址配置协议
- 提供地址池
- C/S:Client/Server
1.2 DHCP的作用
- 把一个主机接入TCP/IP网络,并为其配置一些网络参数:
- IP/Netmask
- Gateway
- DNS Server
- 参数的配置方式:
- 静态指定
- 动态分配
- bootp:boot protocol 引导协议,早期时候使用
- dhcp:引入了“租约”的bootp,也可以实现为特定主机保留其固定地址
1.3 DHCP简要的工作流程
1) 要通信的主机要先在网络中广播发送一个rarp包(类似于客户主机广播说,我知道自己的MAC地址,谁提供一个IP地址给我)
- arp:address resolving protocol 地址解析协议
- IP --> MAC ,通过IP地址来找MAC地址
- rarp:reverse arp 反向地址解析协议
- MAC --> IP ,通过MAC地址来找IP地址
2) 服务器端(DHCP服务器)收到请求之后,就会看一看,自己有没有地址,如果有,就提供一个地址给客户
- 如果网络内有两台服务器都能为客户机提供IP地址,则谁响应快就由谁来提供
1.4 DHCP的工作流程的四个阶段
(这些过程都是使用广播的形式发送报文的)
1) Client:发一个dhcp discover报文
- 客户端发送请求报文,查找网络是否有DHCP服务器
2) Server:回应一个dhcp offer报文(主要提供IP/mask,gw等信息)
- 服务器收到报文后,发送一个offer报文给客户端主机
- least time 租约期限,服务端还会发一个租约期限给客户端
3) Client:再发送一个dhcp request报文
- 因为可能网络中有多个DHCP服务器,这时Client发送的这个报文就是明确告知自己选择哪个IP
- 客户端来确认到底使用哪一个DHCP服务提供的地址
4) Server:回应一个dhcp ack报文
- DHCP服务器来确认
1.5 DHCP的续租详解
- 续租:一般来说,租约期限到达整个期限一半的时候就要续组了
- 50% -> 75% -> 87.5% --> 93.75%
- 四次续租不成功,就要重新请求了
- 续租是单播给服务器的:
- 服务器端确认可以续租:
- dhcp request
- dhcp ack 同意续租
- 服务器端确认不可以继续使用:(可能是地址列表给改了)
- dhcp request
- dhcp nak 不同意续租
- dhcp discover :再以广播的形式发送探测报文
- 服务器端确认可以续租:
- 当客户端主机请求DHCP服务器请求失败时,自动随机分配的地址,这个地址只能在本地网络中使用
- 169.254.X.X
- 实现dhcp对两个不同的局域网之间(两个局域网用路由器隔开)的地址分配:
- 可以在其中一个局域网中的一台主机上做中继(其实就是类似于代理的功能),然后将报文单播给另一个网络中的DHCP服务器
- 也可以在路由器中开启dhcp的中继功能(一般路由器应该有提供)
2. DHCP服务程序说明
2.1 程序包
- dhcp:(由ISC提供的,named用于dns服务)整合起来了
- dnsmasq:既能提供dhcp又能提供dns(通常用于嵌入式环境中,小规模使用)
2.2 监听的端口
- 服务端:67/UDP
- 客户端:68/UDP
2.3 dhcp的主程序文件:
(dhcpd和dhcrelay只会启用其中的一个)
1) /usr/sbin/dhcpd:提供dhcp服务
- 配置文件:
- /etc/dhcp/dhcpd.conf --> /etc/rc.d/init.d/dhcpd
- 有一个默认配置示例,可以复制过来:
- cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
- /etc/dhcp/dhcpd6.conf --> /etc/rc.d/init.d/dhcpd6 这里是IPV6的配置文件,忽略它
2) /usr/sbin/dhcrelay:提供中继服务(一般不启用)
- 配置文件:/etc/rc.d/init.d/dhcrelay
3. DHCP配置详解
3.1 dhcp的配置文件/etc/dhcp/dhcp.conf
# 定义域名和DNS服务器地址 option domain-name "hgzero.com"; # 定义搜索域的域名 option domain-name-servers 172.18.0.1, 172.18.0.2; # 定义dns服务器 # 定义租约期限 default-lease-time 600; # 默认租约期限,单位为秒钟,可以定义为一天,43200 max-lease-time 7200; # 最长租约期限,可以定义为86400,24小时 # 定义记录日志的设备 log-facility local7; # 记录日志的facility # 定义一个子网和地址池,range表示地址池的范围 subnet 172.18.0.0 netmask 255.255.0.0 { range 172.18.100.101 172.18.100.120; } # 定义一个地址池,range就表示地址池的范围 subnet 10.254.239.0 netmask 255.255.255.224 { range 10.254.239.10 10.254.239.20; option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; } # 再定义一个子网和地址池,并对其做详细设定 subnet 10.5.5.0 netmask 255.255.255.224 { range 10.5.5.26 10.5.5.30; # 指明地址池的范围 option domain-name-servers ns1.internal.example.org; # 指定dns服务器地址,最多指定3个 option domain-name "internal.example.org"; # 指明所属的域,叫搜索后缀 option routers 10.5.5.1; # 指明默认网关 option broadcast-address 10.5.5.31; # 指定广播地址 default-lease-time 600; # 默认租约时间 max-lease-time 7200; # 最大租约时间 } # 指明一个主机名,这个主机名只是在DHCP服务器上用来区别不同主机的标识 # 这里指明的主机名是passacaglia host passacaglia { hardware ethernet 0:0:c0:5d:bd:95; # 指明这台主机的mac地址 filename "vmunix.passacaglia"; # 指明引导文件名称,就是获得地址之后要加载一个文件 # 类似于一种基于网络引导时使用的bootloader文件 server-name "toccata.fugue.com"; # 到这里指定的那个主机上去找那个文件,这里应该指定IP地址 } # 对特定的主机绑定绑定IP地址(MAC地址绑定) host fantasia { hardware ethernet 08:00:07:26:c0:a5; # 这里的mac是客户端的mac地址 fixed-address 10.0.10.51; # fixed-address表示固定一个主机的地址,这里应该填IP地址,不能使用地址池范围内的地址 }
3.2 配置后进行测试
- 客户端可以使用dhclient -d命令来测试dhcp服务器
- dhclient -d表示运行在前台
- 如果不加参数则表示运行在后台
- 可以在/var/lib/dhcpd/dhcpd.leases文件中查看dhcp的地址租约记录
3.3 其他的配置选项
- filename:指明引导文件名称,类似于一种基于网络引导时使用的bootloader文件
- next-server:指明引导文件所在的服务主机的IP地址
- 配置示例:
- filename "pxelinux.0";
- next-server 172.18.100.6;
- next-server所在的文件服务器一般是tftp服务器
- tftp:trivial ftp,通过udp协议提供服务
4. dhcp启动出错解决
4.1 没有监听接口
1)报错内容
Not configured to listen on any interfaces!
2)解决
vim /usr/lib/system/system/dhcpd.service # 修改ExecStart项,在最后面添加上dhcp所绑定的网卡接口 ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid ens37 # 然后重载 systemctl daemon-reload # 重启dhcp systemctl restart dhcpd