1. DHCP服务
DHCP动态主机配置协议(Dynamic Host Configuration Protocol),允许计算机不必手工配置即可动态地被分配IP地址以及所需要的网络配置参数。
当网络规模大到一定程度,它是开始变得难以管理。特别是在手工分发IP地址的网络环境中最常见的问题是IP地址管理和IP地址冲突。处理这个问题的一个方法是为客户机动态分配IP地址。DHCP是为大量客户机提供快速、方便、有效地分配I P的方法。
DHCP允许赋给不可移动的服务器一个固定地址,该地址不会因为机器重启动而改变。
DHCP使用客户/服务器模式。当一台计算机启动时,就发送一个DHCP请求给DHCP服务器。管理员能够将一台DHCP服务器配置成两种地址类型:赋给固定地址类型和按需分配的地址缓冲池类型。当一台计算机启动并发送一个请求给DHCP,DHCP服务器查询其数据库找到配置信息。如果数据库包含该计算机的条目,服务器就返回该条目。如果没有该计算机的条目,服务器将从缓冲池中选择下一个IP地址并赋给该计算机。
DHCP使用UDP协议,客户端使用68端口,服务器使用67端口。
1.1 DHCP报文
1.1.1 DHCP报文格式
dhcp协议的报文格式如下:
其中各个字段意义如下:
-
OP:指明报文是请求(1)还是响应(2);
-
htype与hlen:指明网络硬件类型和硬件地址的长度,对于以太网类型为1,地址长度为6。
-
hops:客户机在字段HOPS设置为0,如果收到请求并决定将请求送到其他服务器(用作中继时,就增加HOPS计数)。
-
xid:事务标识符,它是一个随机数,用于匹配请求和响应的整数。
-
secs:延续时间,报告客户机开始启动后逝去的秒数,通常情况下设置为0。
-
flags:标志位,高位置为1,可请求服务器发送响应是使用硬件广播而不是硬件单播。
-
ciaddr:客户IP地址,如果客户机含有IP地址,则设置为客户的IP地址。
-
yiaddr:你的IP地址,如果客户机IP地址为零,则服务器设置你的IP地址字段以返回提供给客户机的IP地址。
-
siaddr:服务器IP地址,表明服务器的IP地址,在DHCPOFFER、DHCPACK中返回。
-
giaddr:路由器IP地址,它是中继的IP地址,当中继收到客户机的DHCP请求,将其转发到服务器之前,设置此字段为中继的IP地址。
-
chaddr:客户硬件地址。
-
sname:服务器主机名。
-
file:自举文件名。
-
options选项,长度是可变的。
dhcp的options字段是比较重要的,一些附带信息的下发均依靠这个字段,常用选项如下:
-
Subnet mask:子网掩码,选项1,在DHCP响应报文中使用,用以指定客户机的子网掩码。
-
Requested IP address:请求的IP地址,选项50,在DHCPDISCOVER报文中用于向服务器请求指定的IP地址。
-
IP address lease time:IP地址租用时间,选项51,在DHCPDISCOVER或DHCPREQUEST报文中,用于向服务器请求指定的租用时间;在DHCPOFFER中,则表明服务器向客户机提供的租用时间。
-
DHCP message type:DHCP消息类型,选项53,用以表示此报文的类型,BOOTP报文无此选项。报文的类型包括:DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPDECLINE、DHCPACK、DHCPNACK、DHCPRELEASE、DHCPINFORM。
-
Server identifier:服务器标识,选项54,用于DHCPOFFER、DHCPREQUEST报文中,也可选择地用于DHCPACK、DHCPNACK报文中。DHCP服务器在DHCPOFFER报文中使用此选项是为了让客户机区别不同的租用提供者。而客户机使用此选项则是为了标识其租用提供者。
-
Parameter request list:参数请求列表,选项55,客户机使用,用于请求特定的配置参数。
-
Maximum DHCP message size:最大DHCP报文长度,选项57,用于表明可以接收的DHCP报文的最大长度。
-
Renewal(T1) time value:更新时间值,选项58,用于指定更新时间。
-
Rebinding(T2) time value:重绑定时间值,选项59,用于指定重绑定时间值。
-
Client identifier:客户端标识,选项61,用于唯一标识客户端,CISCO用此作为服务器地址绑定表的索引。
1.1.2 DHCP报文类型
-
DHCPDISCOVER:客户端用于地址申请的广播报文。
-
DHCPOFFER:服务器端对客户端DHCPDISCOVER报文的回复,包含了所提供的IP地址和网络配置信息。
-
DHCPREQUEST:在不同的状态下,用途不同:
- (a) 在请求状态时,请求服务器同意开始使用所提供的IP地址。
- (b) 在更新状态,请求提供IP地址的服务器更新IP地址租用时间。
- (c) 在重绑定状态,广播请求子网中的服务器,是否允许继续使用当前的IP地址。
-
DHCPACK:服务器端对客户端请求的同意报文。
-
DHCPNAK:服务器端对客户端请求的否定报文。客户端必须重新开始申请。
-
DHCPRELEASE:客户端主动终止IP地址的使用,用于释放IP地址报文。
-
DHCPDECLINE:由于地址已经被使用,客户端对服务器提供的地址表示拒绝。
-
DHCPINFORM:客户端要求服务器提供最新的网络配置信息。
1.2 DHCP工作过程
dhcp的工作流程如下:
- 客户机通过DHCPDISCOVER广播提出请求,寻找局域网中的dhcp服务器。如果客户机有一个永久性的租用地址,它可以直接请求那个地址。
- 服务器一旦收到请求,会从地址池中取出一个地址并返回一个附有可用IP地址的DHCPOFFER报文。
- 如果客户机收到多个DHCPOFFER报文,它会选择第一个DHCPOFFER报文提供的IP地址或其所请求的那一个。
- 客户机广播含有服务器标识的DHCPREQUEST报文并等待。
- 每一个服务器检查收到的DHCPREQUEST报文,若发现不含它的标识,它会丢弃该报文。当被标识的服务器接收了报文后,它会返回一个DHCPACK报文,如果所请求的IP已被分配或者租期已满,会发回DHCPNAK报文;没有被标识的服务器收到报文后会返回DHCPNAK报文。
- 如果客户机收到DHCPACK报文,它可以开始使用IP地址。如果它收到DHCPNAK,它会重新开始整个过程。假如IP有问题,客户机会发送一个DHCPDECLINE报文给服务器并重新开始。
1.2.1 DHCP租期更新
- 当客户端ip的租期达到50%时,客户端会向服务器请求更新地址的租期,单播发送DHCPREQUEST报文请求更新租期,若服务器同意则回应DHCPACK消息,租期更新成功;如果该地址不可用,则服务器回复DHCPNAK消息。
- 若之前服务器没有回复ACK消息,当客户端ip的租期达到75%时,客户端会再次请求更新租期,这次客户端将以广播形式发送DHCPREQUEST报文,若服务器同意则回应DHCPACK消息,租期更新成功;如果该地址不可用,则服务器回复DHCPNAK消息。如客户端更新租期失败,之后客户端每隔5min会广播请求地址。
1.2.2 DHCP中继
中继代理能中继服务器和客户机之间的交互报文。这样可以使服务器能处理不在该服务器所在子网的DHCP报文。这意味着不必为每一个子网设置一个服务器,为每一个子网设置一个服务器开销很大,以下几步说明了中继代理如何工作:
- DHCP客户机广播一个REQUEST消息。
- 中继代理把收到报文的接口对应的IP地址放到消息的giaddr域中,然后单播至服务器。
- 服务器给中继代理返回应答(通过单播)。应答包括与客户机所请求相同的giaddr域。
- 中继代理会从giaddr域中I P地址对应的接口中广播应答。
1.4 DHCP服务配置
1.4.1 DHCP服务端配置
-
第一步:安装dhcp软件包,来自base仓库。
[root@xuzhichao ~]# yum install dhcp -y
查看dhcp包中提供的文件:
[root@xuzhichao ~]# rpm -ql dhcp /etc/NetworkManager /etc/NetworkManager/dispatcher.d /etc/NetworkManager/dispatcher.d/12-dhcpd /etc/dhcp/dhcpd.conf <==DHCP的配置文件 /etc/dhcp/dhcpd6.conf <==DHCP针对ipv6地址的配置文件 /etc/dhcp/scripts /etc/dhcp/scripts/README.scripts /etc/openldap/schema/dhcp.schema /etc/sysconfig/dhcpd /usr/bin/omshell /usr/lib/systemd/system/dhcpd.service <==dhcp的服务启用文件 /usr/lib/systemd/system/dhcpd6.service /usr/lib/systemd/system/dhcrelay.service /usr/sbin/dhcpd /usr/sbin/dhcrelay /usr/share/doc/dhcp-4.2.5 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example <==DHCP的配置文件的样例 /usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example /usr/share/doc/dhcp-4.2.5/ldap /usr/share/doc/dhcp-4.2.5/ldap/README.ldap /usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema /usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap /usr/share/man/man1/omshell.1.gz /usr/share/man/man5/dhcpd.conf.5.gz /usr/share/man/man5/dhcpd.leases.5.gz /usr/share/man/man8/dhcpd.8.gz /usr/share/man/man8/dhcrelay.8.gz /usr/share/systemtap/tapset/dhcpd.stp /var/lib/dhcpd /var/lib/dhcpd/dhcpd.leases <==记录服务器已经分配的地址情况 /var/lib/dhcpd/dhcpd6.leases
-
第二步:修改dhcp的配置文件
默认其配置文件/etc/dhcp/dhcpd.conf中没有内容,可以把样板文件复制过来进行修改
[root@xuzhichao ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
dhcp的配置文件格式如下:
[root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf #authoritative; <==若果此dhcp是正式的dhcp服务器,该字段应取消注释 log-facility local7; <==日志信息,默认存放在/var/log/bootlog文件中 subnet 192.168.50.0 netmask 255.255.255.0 { <==标题段,指明网络号和掩码 range 192.168.50.1 192.168.50.99; <==指定分配地址的范围 option domain-name-servers 192.168.50.1,8.8.8.8; <==指定分配的DNS地址 option domain-name "xu.com"; <==指定分配的域名 option routers 192.168.50.100; <==指定分配的网关地址 default-lease-time 6000; <==指定分配的默认租期,单位秒 max-lease-time 72000; <==指定分配的最大租期,单位秒 }
其中dns,网关,租期等信息可以在全局下定义,也可以在subnet中定义,若两者都有定义,以subnet中的为准。
可以指定服务器提供dhcp服务的接口,在/etc/sysconfig/dhcpd文件中定义
[root@xuzhichao ~]# cat /etc/sysconfig/dhcpd #DHCPDARGS="eth1"
-
第三步:启用dhcp服务
注意:启动dhcp服务前需要确保dhcp分配的网段在本机上存在同网段的可用地址。
[root@xuzhichao ~]# ip add show eth2 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2f:d0:e4 brd ff:ff:ff:ff:ff:ff inet 192.168.50.100/32 brd 192.168.50.100 scope global noprefixroute eth2 valid_lft forever preferred_lft forever inet6 fe80::80b9:b869:e531:3141/64 scope link noprefixroute valid_lft forever preferred_lft forever #启动dhcpd服务 [root@xuzhichao ~]# systemctl start dhcpd.service #开机自启dhcpd服务 [root@xuzhichao ~]# systemctl enable dhcpd.service #查看dhcp服务的状态 [root@xuzhichao ~]# 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 Mon 2021-06-07 05:08:44 EDT; 6s ago Docs: man:dhcpd(8) man:dhcpd.conf(5) Main PID: 15392 (dhcpd) Status: "Dispatching packets..." CGroup: /system.slice/dhcpd.service └─15392 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid #查看dhcp的监听端口是否启动 [root@xuzhichao ~]# ss -una State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 *:67 *:* <==此为dhcp服务端的端口 UNCONN 0 0 *:68 *:* UNCONN 0 0 [::1]:323 [::]:*
1.4.2 DHCP客户端配置
修改网卡和服务器位于同一网段,修改地址为自动获取方式:
[root@centos7_6 ~]# nmcli connection add con-name eth2-auto type ethernet ifname eth2 ipv4.method auto
Connection 'eth2-auto' (43205f88-3b6e-48a7-a93e-5e8138a1e18f) successfully added.
[root@centos7_6 ~]# nmcli connection up eth2-auto
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
#查看eth2接口获取的地址,网关,dns等信息
[root@centos7_6 ~]# ip add show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.50.1/24 brd 192.168.50.255 scope global noprefixroute dynamic eth2
valid_lft 5993sec preferred_lft 5993sec
inet6 fe80::da59:e2c9:e1eb:df70/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@centos7_6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 101 0 0 eth1
0.0.0.0 192.168.50.100 0.0.0.0 UG 104 0 0 eth2
172.20.125.0 0.0.0.0 255.255.255.0 U 103 0 0 eth3
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
192.168.20.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.50.0 0.0.0.0 255.255.255.0 U 104 0 0 eth2
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@centos7_6 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lan xu.com
nameserver 192.168.2.1
nameserver 192.168.50.1
nameserver 8.8.8.8
查看服务器端的日志:
[root@xuzhichao ~]# tail /var/log/boot.log
Jun 7 05:08:44 xuzhichao dhcpd: Sending on Socket/fallback/fallback-net
Jun 7 05:47:15 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPOFFER on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.1 (192.168.50.100) from 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPACK on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
1.4.2.1 dhclient工具
dhclient工具可以启动一个dhcp客户端去获取一个地址,默认所有网卡都会去自动获取地址。
默认后台执行,前台执行使用-d选项:
[root@centos7_6 ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0-nic/52:54:00:b9:1a:89
Sending on LPF/virbr0-nic/52:54:00:b9:1a:89
Listening on LPF/virbr0/52:54:00:b9:1a:89
Sending on LPF/virbr0/52:54:00:b9:1a:89
Listening on LPF/eth3/00:0c:29:16:20:dd
Sending on LPF/eth3/00:0c:29:16:20:dd
Listening on LPF/eth2/00:0c:29:16:20:d3
Sending on LPF/eth2/00:0c:29:16:20:d3
Listening on LPF/eth1/00:0c:29:16:20:c9
Sending on LPF/eth1/00:0c:29:16:20:c9
Listening on LPF/eth0/00:0c:29:16:20:bf
Sending on LPF/eth0/00:0c:29:16:20:bf
Sending on Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 8 (xid=0x52cd2021)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 5 (xid=0x3ec4ade1)
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 3 (xid=0x7e857e5e)
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 5 (xid=0x3e9927e7)
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 (xid=0x7a7a899f)
DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x3e9927e7)
DHCPOFFER from 192.168.2.1
DHCPACK from 192.168.2.1 (xid=0x3e9927e7)
bound to 192.168.2.157 -- renewal in 33243 seconds.
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7a7a899f)
DHCPOFFER from 192.168.20.254
DHCPACK from 192.168.20.254 (xid=0x7a7a899f)
bound to 192.168.20.16 -- renewal in 846 seconds.
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 6 (xid=0x7e857e5e)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 9 (xid=0x3ec4ade1)
DHCPREQUEST on eth2 to 255.255.255.255 port 67 (xid=0x7e857e5e)
DHCPOFFER from 192.168.50.100
DHCPACK from 192.168.50.100 (xid=0x7e857e5e)
bound to 192.168.50.3 -- renewal in 2920 seconds.
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 18 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 12 (xid=0x52cd2021)
dhclient -r会清空所有接口获取到的地址,包括配置的静态地址,重启网络服务才能恢复。慎用!
1.4.3 为终端分配固定地址
对于一些服务器需要获取固定的IP地址的情况,可以根据终端的MAC地址分配固定的ip地址:
-
在dhcp服务器的配置文件新增如下内容:
[root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf host server { hardware ethernet 00:0c:29:16:20:d3; <==指定客户端的MAC地址 fixed-address 192.168.50.10; <==指定客户端要分配的IP地址 option routers 192.168.50.100; <==指定网关,若不配置,会从subnet中分配 }
-
重启dhcp服务:
[root@xuzhichao ~]# systemctl restart dhcpd.service
-
客户端重新获取ip地址:
[root@centos7_6 ~]# dhclient -r eth2 [root@centos7_6 ~]# dhclient eth2 [root@centos7_6 ~]# ip add show eth2 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff inet 192.168.50.10/24 brd 192.168.50.255 scope global dynamic eth2 valid_lft 5995sec preferred_lft 5995sec inet6 fe80::639b:757c:18c4:4613/64 scope link noprefixroute valid_lft forever preferred_lft forever
-
查看服务器端的相关日志:
[root@xuzhichao ~]# cat /var/log/boot.log #客户端主动放弃地址,发送RELEASE Jun 7 05:55:05 xuzhichao dhcpd: DHCPRELEASE of 192.168.50.3 from 00:0c:29:16:20:d3 via eth2 (found) #静态分配地址过程 Jun 7 06:13:26 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: DHCPOFFER on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: Dynamic and static leases present for 192.168.50.10. Jun 7 06:13:26 xuzhichao dhcpd: Remove host declaration server or remove 192.168.50.10 Jun 7 06:13:26 xuzhichao dhcpd: from the dynamic address pool for 192.168.50.0/24 Jun 7 06:13:26 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.10 (192.168.50.100) from 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: DHCPACK on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2