DHCP以及部署DHCP
linux dhcp client配置
linux dhcp client配置 [root@clientlinux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NM_CONTROLLED=no ONBOOT=yes #自动启用该网卡 BOOTPROTO=dhcp #使用dhcp
dchp 原理
基于UDP,端口号67、68
服务器监听67 端口,客户端监听68 端口
DHCP 获取地址的过程: (1)发现阶段: DHCP客户端通过发送DHCP DISCOVER报文来寻找DHCP服务器。 由于DHCP服务器的IP地址对于客户端来说是未知的,所以DHCP客户端以广播方式(三层广播)发送DHCP DISCOVER报文。 所有收到DHCP DISCOVER报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。 说明: 1、DHCP报文源IP:0.0.0.0 ,目的IP:255.255.255.255。 2、RFC2131中定义了DHCP报文的广播标志字段(flags),当标志字段的最高位为0时,表示客户端希望服务器以单播方式发送DHCPOFFER/DHCP ACK报文;当标志字段的最高位为1时,表示客户端希望服务器以广播方式发送DHCP OFFER/DHCP ACK报文。 (2)提供阶段: 网络中接收到DHCP DISCOVER 报文的DHCP 服务器,会从地址池选择一个合适的IP 地址,连同IP 地址租约期限和其他配置信息(如网关地址、域名服务器地址等)通过DHCP OFFER 报文发送给DHCP 客户端 说明: 1、DHCP报文源IP:server的IP地址,目的IP:即将要分配给client的IP地址。 2、此阶段DHCP服务器分配给客户端的IP地址不一定是最终确定使用的IP地址,因为DHCP OFFER报文发送给客户端等待16秒后如果没有收到客户端的响应,此地址就可以继续分配给其他客户端。通过下面的选择阶段和确认阶段后才能最终确定客户端可以使用的IP地址。 (3)选择阶段: 如果有多台DHCP 服务器向DHCP 客户端回应DHCP OFFER 报文,则DHCP 客户端只接收第一个收到的DHCP OFFER 报文。然后以广播方式发送DHCP REQUEST 请求报文,该报文中包含服务器标识选项(Option54),即它选择的DHCP 服务器的IP 地址信息。 说明: 以广播方式发送DHCP REQUEST报文,是为了通知所有的DHCP服务器,它将选择某个DHCP服务器提供的IP地址,其他DHCP服务器可以重新将曾经分配给客户端的IP地址分配给其他客户端。 (4)确认阶段: 当DHCP 服务器收到DHCP 客户端回答的DHCP REQUEST 报文后,DHCP 服务器会根据DHCP REQUEST 报文中携带的MAC 地址来查找有没有相应的租约记录。 如果有,则向客户端发送包含它所提供的IP 地址和其它设置的DHCP ACK 确认报文。 DHCP 客户端收到该确认报文后,会以广播的方式发送免费ARP 报文,探测是否有主机使用服务器分配的IP 地址,如果在规定的时间内没有收到回应,客户端才使用此地址。 说明: 当DHCP 服务器收到DHCP 客户端发送的DHCP REQUEST 报文后,如果DHCP 服务器由于某些原因(例如协商出错或者由于发送REQUEST 过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP REQUEST报文中Opton50 填充的IP 地址,则发送DHCP NAK 报文作为应答,通知DHCP 客户端无法分配此IP 地址。DHCP 客户端需要重新发送DHCPDISCOVER 报文来申请新的IP 地址。
DHCP续约的过程: 1. 当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。 如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算); 如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。 2. 当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。 如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算); 如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。 3. 如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。
DHCP 中继和Option82 =============================================================================================================== DHCP 中继: (1)定义:DHCP Relay 即DHCP 中继,它实现了不同网段间的DHCP 服务器和客户端之间的报文交互。 (2)作用:DHCP 中继承担处于不同网段间的DHCP 客户端和服务器之间中继服务,将DHCP 协议报文跨网段透传到目的DHCP 服务器,最终使网络上的DHCP 客户端可以共同使用一个DHCP 服务器。 (3)工作原理:DHCP 客户端发送请求报文给DHCP 服务器, DHCP 中继收到该报文并适当处理后,以单播形式发送给指定的位于其它网段上的DHCP 服务器。服务器根据请求报文中提供的必要信息,通过DHCP中继将配置信息返回给客户端,完成对客户端的动态配置。 --------------------------------------------------------------------------------------------------------------- Option82: 称为中继代理信息选项,该选项记录了DHCP 客户端的位置信息。DHCP 中继或DHCP Snooping 设备接收到DHCP 客户端发送给DHCP 服务器的请求报文后,在该报文中添加Option82,并转发给DHCP 服务器。 管理员可以从Option82 中获得DHCP 客户端的位置信息,以便定位DHCP 客户端,实现对客户端的安全和计费等控制。支持Option82 的服务器还可以根据该选项的信息制定IP 地址和其他参数的分配策略,提供更加灵活的地址分配方案。 Option82 最多可以包含255 个子选项。若定义了Option82,则至少要定义一个子选项。目前设备只支持两个子选项:sub-option1(Circuit ID,电路ID 子选项)和sub-option2(Remote ID,远程ID 子选项)。
防止DHCP Server 仿冒者攻击
DHCP 报文泛洪攻击
DHCP Server 服务拒绝攻击(饿死)
仿冒DHCP 报文攻击
结合IPSG、DAI 技术进行防护
配置dhcp服务端
安装dhcp rpm -q dhcp rpm -ql dhcp yum install -y dhcp systemctl status dhcpd ------------------------------------------------------------- [root@centos7 ~]# which dhcpd /usr/sbin/dhcpd [root@centos7 ~]# rpm -q dhcp dhcp-4.2.5-83.el7.centos.1.x86_64 [root@centos7 ~]# rpm -ql dhcp /etc/NetworkManager /etc/NetworkManager/dispatcher.d /etc/NetworkManager/dispatcher.d/12-dhcpd /etc/dhcp/dhcpd.conf #dhcp配置文件 /etc/dhcp/dhcpd6.conf /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 /usr/lib/systemd/system/dhcpd6.service /usr/lib/systemd/system/dhcrelay.service /usr/sbin/dhcpd #dhcp的执行文件 /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 #储存了各个dhcp client的租约信息 /var/lib/dhcpd/dhcpd6.leases [root@centos7 ~]# cat /var/lib/dhcpd/dhcpd.leases #储存了各个dhcp client的租约信息 [root@centos7 ~]#
/etc/dhcp/dhcpd.conf文件中参数详解 规范: 『 # 』为批注符号; 除了右括号 ")" 后面之外,其他的每一行设定最后都要以『 ; 』做为结尾!重要! 设定项目语法主要为:『 <参数代号> <设定内容> 』,例如:default-lease-time 259200; 某些设定项目必须以 option 来设定,基本方式为『 option <参数代码> <设定内容> 』例如:option domain-name "your.domain.name"; 1、设置默认搜索域:option domain-name option domain-name配置项用来为客户机指定解析主机名时的默认搜索域,该配置项将体现在客户机的“/etc/resolv.conf”配置文件中(如 “search benet.com”)。配置文件中默认的搜索域是example.org,配置信息如下: option domain-name "example.org"; 2、设置DNS服务器地址:option domain-name-servers option domain-name-servers配置项用来为客户机指定解析域名时使用的DNS服务器地址,该配置项同样将体现在客户机的/etc /resolv.conf配置文件中(如“nameserver 202.106.0.20”)。若需要设置多个DNS服务器地址,可以使用逗号“,”进行分割。配置文件中默认设置如下: option domain-name-servers ns1.example.org, ns2.example.org; 3、默认租约时间:default-lease-time default-lease-time配置项用来设置默认租约时间,它的单位为秒,表示客户端可以从DHCP服务器租约某个IP地址的默认时间。默认配置如下: default-lease-time 600; 4、设置最大租约时间:max-lease-time max-lease-time配置项用来配置允许DHCP客户端请求的最大租约时间,当客户端未请求明确的租约时间时,服务器将采用默认租约时间。默认配置如下: max-lease-time 7200; 5、设置动态DNS更新模式:ddns-update-style ddns-update-style配置项用来设置与DHCP服务相关联的DNS数据动态更新模式,实际的DHCP应用中很少用的该参数,将值设为none即可。默认配置如下: #ddns-update-style none; 6、设置子网属性:subnet 在主配置文件dhcpd.conf中,包括声明、参数和选项3种基本类型的配置项,其作用与表现形式如下。 (1)“声明”用来描述dhcpd服务器中对网络布局的划分,是网络设置的逻辑范围。 (2)“参数”由配置关键字和对应的值组成,多用来确定DHCP服务的相关运行参数(如默认租约时间、最大租约时间等)。参数总是以分号“;”结束,可以位于全局配置或指定的声明中。 (3)“选项”由option引导,后面跟具体的配置关键字和对应的值,一般用于指定分配给客户端的配置参数(如默认网关地址、子网掩码、DNS服务器地址等)。选项也是以分号“;”结束,可以位于全局配置或指定的声明中。 7、设置主机属性:host 8、配置超级作用域:shared-network ddns-update-style 类型: 因为 DHCP 客户端所取得的 IP 通常是一直变动的,所以某部主机的主机名与 IP 的对应就很难处理。此时 DHCP 可以透过 ddns (请参考第十章与第十九章 DNS 的说明) 来更新主机名与 IP 的对应。不过我们这里不谈这么复杂的东西,所以你可以将他设定为 none 喔。 ignore client-updates: 与上一个设定值较相关,客户端可以透过 dhcpd 服务器来更新 DNS 相关的信息。不过,这里我们也先不谈这个, 因此就将它设定为 ignore (忽略) 了。 option routers 路由器的地址: 设定路由器的 IP 所在,记得那个『 routers 』要加 s 才对!
/etc/dhcp/dhcpd.conf配置实例1 =========================================================== 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 内容 # 2. 关于动态分配的 IP subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.101 192.168.100.200; <==分配的 IP 范围 host win7 { hardware ethernet 08:00:27:11:EB:C2; <==客户端网卡 MAC fixed-address 192.168.100.30; <==给予固定的 IP } } ###注意:以上的配置其实有问题,若存在多个接口的话,dhcp会监听多个接口,而这明显是不合适的 ###貌似现在的dhcpd会自动优化这个选项了。。。
/etc/dhcp/dhcpd.conf配置实例2 =========================================================== #cat /etc/dhcp/dhcpd.conf ddns-update-style interim; log-facility local6; authoritative; ping-check true; ping-timeout 3; default-lease-time 3600; max-lease-time 3600; deny bootp; failover peer "xxx_peer" { primary; address 10.100.100.1; port 520; peer address 10.100.100.2; peer port 520; max-response-delay 60; max-unacked-updates 10; mclt 3600; split 128; load balance max seconds 3; } subnet 10.100.100.0 netmask 255.255.255.0 { option routers 10.100.100.247; option subnet-mask 255.255.255.0; pool { failover peer "xxx_peer"; deny dynamic bootp clients; range 10.100.100.10 10.100.100.246; } } on commit { set ClientIP = binary-to-ascii(10, 8, ".", leased-address); set ClientMac = concat (suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1, 1))),2),":",suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware, 2, 1))),2),":",suffix (concat("0", binary-to-ascii (16, 8, "", substring(hardware, 3, 1))),2),":",suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware, 4,1))),2),":",suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware, 5, 1))),2),":",suffix (concat ("0", binary-to-ascii (16, 8, "",substring(hardware, 6, 1))),2)); execute("/usr/sbin/cm.py", ClientIP, ClientMac,"commit"); }
cat /var/lib/dhcpd/dhcpd.leases #查看租约记录,这里是实时信息!
让大量 PC 都具有固定 IP 的脚本 [root@www ~]# vim setup_dhcpd.conf #!/bin/bash read -p "Do you finished the IP's settings in every client (y/n)? " yn read -p "How many PC's in this class (ex> 60)? " num if [ "$yn" = "y" ]; then for site in $(seq 1 ${num}) do siteip="192.168.100.${site}" allip="$allip $siteip" ping -c 1 -w 1 $siteip > /dev/null 2>&1 if [ "$?" == "0" ]; then okip="$okip $siteip" else errorip="$errorip $siteip" echo "$siteip is DOWN" fi done [ -f dhcpd.conf ] && rm dhcpd.conf for site in $allip do pcname=pc$(echo $site | cut -d '.' -f 4) mac=$(arp -n | grep "$site " | awk '{print $3}') echo " host $pcname {" echo " hardware ethernet ${mac};" echo " fixed-address ${site};" echo " }" echo " host $pcname {" >> dhcpd.conf echo " hardware ethernet ${mac};" >> dhcpd.conf echo " fixed-address ${site};" >> dhcpd.conf echo " }" >> dhcpd.conf done fi echo "You can use dhcpd.conf (this directory) to modified your /etc/dhcp/dhcpd.conf" echo "Finished."
dhcp日志 tail -30 /var/log/messages # 1. 启动后观察一下埠口的变化: [root@www ~]# /etc/init.d/dhcpd start [root@www ~]# chkconfig dhcpd on [root@www ~]# netstat -tlunp | grep dhcp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name udp 0 0 0.0.0.0:67 0.0.0.0:* 1581/dhcpd # 2. 固定去看看登录文件的输出信息 [root@www ~]# tail -n 30 /var/log/messages Jul 27 01:51:24 www dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1 Jul 27 01:51:24 www dhcpd: Copyright 2004-2010 Internet Systems Consortium. Jul 27 01:51:24 www dhcpd: All rights reserved. Jul 27 01:51:24 www dhcpd: For info, please visit https://www.isc.org/software/dhcp/ Jul 27 01:51:24 www dhcpd: WARNING: Host declarations are global. They are not limited to the scope you declared them in. Jul 27 01:51:24 www dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file Jul 27 01:51:24 www dhcpd: Wrote 0 deleted host decls to leases file. Jul 27 01:51:24 www dhcpd: Wrote 0 new dynamic host decls to leases file. Jul 27 01:51:24 www dhcpd: Wrote 0 leases to leases file. Jul 27 01:51:24 www dhcpd: Listening on LPF/eth1/08:00:27:2a:30:14/192.168.100.0/24 Jul 27 01:51:24 www dhcpd: Sending on LPF/eth1/08:00:27:2a:30:14/192.168.100.0/24