DHCP server
1 认识什么是DHCP
DHCP服务器是自动的将网络参数正确的分配给网域中的每部计算机,让客户端的计算机可以在开机的时候就立即自动的设定好网络的参数值,这些参数值可以包括了 IP
、netmask
、network
、gateway
与 DNS 的地址等等
2 dhcp协议的运作模式
参考dhcp协议图
DHCP
通常是用于局域网络内的一个通讯协议,他主要藉由客户端传送广播封包给整个物理网段内的所有主机, 若局域网络内有 DHCP 服务器时,才会响应客户端的 IP 参数要求
3 客户端获取IP参数的简化流程
- 客户端:利用广播封包发送搜索 DHCP 服务器的封包
- 服务器端:提供客户端网络相关的租约以供选择
- 到服务器的登录文件中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给客户端
- 若配置文件针对该 MAC 提供额外的固定 IP (static IP) 时,则提供该固定 IP 给客户端
- 若不符合上述两个条件,则随机取用目前没有被使用的 IP 参数给客户端,并记录下来
- 客户端:决定选择的 DHCP 服务器提供的网络参数租约并回报服务器
- 服务器端:记录该次租约行为并回报客户端已确认的响应封包信息
4 DHCP服务器给予客户端的 IP 参数主要有两种
4.1 固定IP
只要机器不换网卡,那么MAC肯定就是不会变化的,因为DHCP是基于MAC进行IP绑定的,所以每次开机都会获取一个固定的IP
查看MAC地址的方法
- ifconfig | grep ether
- arp -n
- 观察别人的MAC地址:
ping -c 3 {ip_addr}
4.2 动态IP
Client 端每次连上 DHCP 服务器所取得的 IP 都不是固定的!都直接经由 DHCP 所随机由尚未被使用的 IP 中提供
5 安装
yum install dhcp -y
mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
cp /usr/share/doc/{dhcp-version}/dhcp.conf.example /etc/dhcp/dhcpd.conf
5.1 dhcp的配置文件
/usr/share/doc/{dhcp-version}/dhcp.conf.example
:dhcp安装包自带的模板配置文件/var/lib/dhcpd/dhcpd.leases
:文件保存客户端租用数据库
5.2 dhcp配置文件语法
- 该配置文件可包含附加标签或空白行以方便格式化
- 『 # 』为批注符号
- 除了右括号 ")" 后面之外,其他的每一行设定最后都要以『 ; 』做为结尾!重要
- 设定项目语法主要为:『 <参数代号> <设定内容> 』,例如:
default-lease-time 259200
; - 某些设定项目必须以 option 来设定,基本方式为『 option <参数代码> <设定内容> 』例如:option range ***;
- 区分大小写
5.3 dhcp.conf设置的两大模块
5.3.1 整体设定global
- default-lease-time ""; 定义默认租约时间,默认是秒
- max-lease-time ""; 定义最大租约时间,默认是秒
- option domain-name "example.com"; 相当于你在/etc/resolv.conf中使用的search google.com
- option domain-name-servers IP1, IP2; 表示把客户端/etc/resolv.conf中nameserver后面的那个ip修改为ip1,ip2
- option routers IP;设定路由器的IP
5.3.2 IP设定模式
由于 dhcpd 主要是针对局域网络来给予 IP 参数的,因此在设定 IP 之前,我们得要指定一个区网才行
subnet NETWORK_IP netmask NETMASK_IP {
...
}
如上所示,NETWORK_IP
和NETMASK_IP
就是要设置你要设置的网络是什么样的,比如"192.168.10.0/255.255.255.0",而{}
中就是设定IP是固定的
还是动态的
range IP1,IP2
; 给予一个连续的 IP 群用来发放成动态 IP 的设定host 主机名 { ... }
; 主机名自己随意指定,但是{}
中要有指定的MAC以及固定的IPhardware ethernet 硬件地址
fixed-address IP地址
5.3.3 一个子网络范例
[root@www ~]# vim /etc/dhcp/dhcpd.conf
# 1. 整体的环境设定
ddns-update-style none; <==不要更新 DDNS 的设定
ignore client-updates; <==忽略客户端的 DNS 更新功能
default-lease-time 259200; <==预设租约为 3 天
max-lease-time 518400; <==最大租约为 6 天
option routers 192.168.100.254; <==这就是预设路由
option domain-name "centos.vbird"; <==给予一个领域名
option domain-name-servers 168.95.1.1, 139.175.10.20;
# 上面是 DNS的IP设定,这个设定值会修改客户端的 /etc/resolv.conf 档案内容
# 168.95.1.1是中华电信的DNS
# 139.175.10.20是seednet的DNS
# 2. 关于动态分配的 IP
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.101 192.168.100.200; <==分配的 IP 范围
# 3. 关于固定的 IP 啊!
host win7 {
hardware ethernet 08:00:27:11:EB:C2; <==客户端网卡 MAC
fixed-address 192.168.100.30; <==给予固定的 IP
}
}
# 相关的设定参数意义,请查询前一小节的介绍,或者 man dhcpd.conf
5.3.4 限定监听的网口
在某些早期的Linux distribution上面,当你的Linux主机具有多个接口时,你的一个设定可能会让多个接口同时来监听,那就可能会发生错误了。举例来说,我们现在的设定是 192.168.100.0/24 这个在eth1 上头的网域,假设你还有一个界面eth2在192.168.2.0/24 好了,那万一你的 DHCP 同时监听两块接口的话,想一想,如果 192.168.2.0/24 网域的客户端发送出 dhcp 封包的要求时, 他会取得什么 IP ?当然是 192.168.100.X !所以啰,我们就得要针对 dhcpd 这个执行文件设定他监听的接口,而不是针对所有的接口都监听啊!你说是吧!那如何处理呢?在 CentOS (Red Hat 系统) 可以这样做
[root@www ~]# vim /etc/sysconfig/dhcpd
DHCPDARGS="eth0"
以上的设定,在后期的版本中已经别放弃
修改配置文件后,一定要systemctl restart dhcpd
重启dhcp的守护进程后方可生效
6 dhcp实验出真知
准备在一台centos7的虚拟机上做这个实验,对于vmware来说,它内置的就含有一个dhcp的服务,因此我们在实验前做了这样的实验
- centos7采用的是NAT网络连接模式,关闭vmware内置的dhcp服务,设置centos7的静态IP为172.17.0.4/255.255.255.0,网关是172.17.0.2
- 添加一个新的网卡"ens33:1"在centos7,以centos7的ens33:1作为保留路由IP
ifconfig ens33:1 192.168.10.3 netmask 255.255.255.0 up
- 在centos7上搭建DHCP server
/etc/dhcp/dhcpd.conf
[root@webserver1 dhcp]# cat /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
default-lease-time 43200;
max-lease-time 86400;
option routers 192.168.10.3;
option domain-name "linuxedu.top";
option domain-name-servers 8.8.8.8,114.114.114.114;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.10 192.168.10.20;
filename "pxelinux.0";
next-server 172.17.0.4;
}
systemctl restart dhcpd.service #重启dhcpd服务
systemctl status dhcpd.service #查看当前dhcp服务的运行状态
[root@webserver1 dhcp]# 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 Wed 2017-10-04 22:27:42 CST; 26s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 1158 (dhcpd)
Status: "Dispatching packets..."
CGroup: /system.slice/dhcpd.service
└─1158 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
Oct 04 22:27:42 webserver1 dhcpd[1158]: Sending on LPF/ens33:1/00:0c:29:5e:ae:c0/192.168.10.0/24
Oct 04 22:27:42 webserver1 dhcpd[1158]:
Oct 04 22:27:42 webserver1 dhcpd[1158]: No subnet declaration for ens33 (172.17.0.4).
Oct 04 22:27:42 webserver1 dhcpd[1158]: ** Ignoring requests on ens33. If this is not what
Oct 04 22:27:42 webserver1 dhcpd[1158]: you want, please write a subnet declaration
Oct 04 22:27:42 webserver1 dhcpd[1158]: in your dhcpd.conf file for the network segment
Oct 04 22:27:42 webserver1 dhcpd[1158]: to which interface ens33 is attached. **
Oct 04 22:27:42 webserver1 dhcpd[1158]:
Oct 04 22:27:42 webserver1 dhcpd[1158]: Sending on Socket/fallback/fallback-net
Oct 04 22:27:42 webserver1 systemd[1]: Started DHCPv4 Server Daemon.