欢迎各位兄弟 发布技术文章
这里的技术是共享的
DHCP: Dynamic Host Configuration Protocal<--前身 bootp (Boot Protocal)
早期的网吧等 cpu,内存,键盘什么的都有,就是没有硬盘
DHCP里面引入了 lease 租约的概念
现在的电脑 都有硬盘的
DHCP 真正实现了动态.需要就分配,不需要就回收
DHCP 在租期达到一半的时候,就决定是否需要续租了,续租后 还是原来的时候
boot->dhcp
lease租约
续租
2H, 1H->2H (到一半时,是续租,但是租期不是3小时,而是还是2小时,换句话说,此时是一次延长一个小时)
1H->2H
2H, 1H (到一半时,联系服务器,联系不上的话,再过一半,,即0.5小时,再联系服务器)
1H->0.5H (如果联系上服务器,还是续租总计2小时)
0.5h-->0.25H(0.5小时时,再联系不上服务器的话,再走一半,即0.25小时,)
0.25H-->0.125h((0.25小时时,再联系不上服务器的话,再走一半,即0.125小时,)
当到了最后仍然联系不上服务器时,干脆释放地址,重新找地址
找服务器时,一家一家的找房子,是广播的
如果找到了三家,一般来讲是最近的,响应速度最快的(客户端一般接受第一个响应的服务器)
TCP/IP (客户端配置TCP/IP属性的时候,配置项)
IPADDR 必须
NETMASK 必须
GATEWAY 不必须 (没有它的话,就是只能本地通信,不跟外网联系)
DNS 不必须
(NIS) (不必须) (这是linux网络中常用的一种服务)
对于windows来讲,可能还有windows名,netbells名称,主机名等
地址池:DHCP能够给其它的主机提供ip的列表
客户端找 dhcp要ip地址是广播的,
dhcp响应客户端也是广播的(因为此时那个客户端只有mac地址,没有ip地址)
dhcp广播后,客户端就收到ip地址了(假如两个dhcp都提供了ip地址)
客户端收到ip后,就要说一声,我收到了ip地址,我使用的是第一个dhcp提供的地址,此时仍是广播(因为要让两个dhcp(及所有的主机)都知道我的ip)
第一个dhcp要向客户端说一声,我知道了,此时也是广播的,因为要通知所有人,我给这个客户端分配了某ip地址
Client-->DHCPDISCOVER (发现报文) 广播出去 udp
HDCPOFFER <-- Server (提供报文,回应报文,回应一个ip) 广播出去
Client-->DHCPREQUEST (请求报文,请求这个ip) 广播出去
DHCPACK <-- Server (确认报文,确认这个ip) 广播出去
续租的时候是单播 (续租房子的时候不用满大街找房子)
Client-->DHCPREQUEST (请求自己这个ip) 单播
DHCPACK <-- Server (仍旧确认这个ip) 单播
续租不成功的话,就要重试 (再不成功的话,再重试续租) (再再不成功的话,再重试续租)
(最后仍不成功的话,就换房东,把地址释放,发起 第一步 DHCPDISCOVER (广播) )
路由器不会转发广播包,因此DHCP不能跨物理网络来实现
把中间的路由器配置成为dhcp的中继器 (DHCP Relay),各个dhcp服务器就可以跨网络了
一方的客户端请求广播后, 路由器(中继器) 单播这一方的客户端的请求到另一方的dhcp服务器,
另一方的dhcp服务器 单播给路由器(中继器),路由器(中继器)呢,广播回应给一方的客户端
一方的客户端 发送 REQUEST 请求给路由器(中继器), 路由器(中继器)再单播给另一方的dhcp服务器
另一方的dhcp服务器 再单播给路由器(中继器),路由器(中继器)再广播回应给一方的客户端
当一端没有dhcp服务器的时候,也是可以借助于另一端的dhcp服务器来进行工作
dhcp必须要有一个地址池,提供给本地主机使用
地址池与dhcp要不要在同一个网段中呢?肯定要的,如果不要的话,客户端就不是本地客户端了,
就必须是通过路由器来进行通信,就不是在同一个IP网络(逻辑网络)中了
此时使用ip地址是能够互相通信吗?应该可以的
此时单播这种方式续租是不能完成的
所以dhcp提供的地址池一定要跟自己的网卡在同一网段中,这就是表示我就是在本地网络中提供服务的
dhcp的有一个地址池是跟由器的某个网卡的地址段
但是这种将来这样子配置的可能性很小
现在讲的是配置一个dhcp服务器给本地网络主机提供地址掩码网关以及dns服务器等这几种情况
主要目的是提供php?其础的,不打算讲的过于深入
假如没有远程网络,都是本地网络
保留地址(固定地址,静态地址)是地址池外的,也应该与dhcp的网卡在同一网段中
保留地址是靠mac来识别的
下面看看如何配置dhcp服务器
软件包的名称是dhcp,跟dns一样,也是isc.org提供的
我们使用rpm包来安装就完了
[root@localhost ~]# yum list all | grep dhcp
This system is not registered to Red Hat Subscription Management. You can use su bscription-manager to register.
dhcpv6-client.i386 1.0.10-20.el5 installed #ipv6的客户端
dhcp.i386 12:3.0.5-33.el5_9 Cdrom_Base #服务器端包,为什么不叫dhcpd呢?
dhcp-devel.i386 12:3.0.5-33.el5_9 Cdrom_Base
dhcpv6.i386 1.0.10-20.el5 Cdrom_Base # ipv6专用的
libdhcp.i386 1.20-13.el5 Cdrom_Base
libdhcp-devel.i386 1.20-13.el5 Cdrom_Base
libdhcp4client.i386 12:3.0.5-33.el5_9 Cdrom_Base
libdhcp4client-devel.i386 12:3.0.5-33.el5_9 Cdrom_Base
libdhcp6client.i386 1.0.10-20.el5 Cdrom_Base
libdhcp6client-devel.i386 1.0.10-20.el5 Cdrom_Base
sblim-cmpi-dhcp.i386 1:1.0-49.el5 Cdrom_Base
sblim-cmpi-dhcp-devel.i386 1:1.0-49.el5 Cdrom_Base
sblim-cmpi-dhcp-test.i386 1:1.0-49.el5 Cdrom_Base
[root@localhost ~]#
[root@localhost ~]# yum -y install dhcp
[root@localhost ~]# rpm -ql dhcp
/etc/dhcpd.conf
/etc/rc.d/init.d/dhcpd #我们提供dhcp 服务器的话 ,只需要提供 dhcpd就可以了
/etc/rc.d/init.d/dhcrelay # 这是中继器服务
/etc/sysconfig/dhcpd # 它是 /etc/rc.d/init.d/dhcpd 的配置文件
/etc/sysconfig/dhcrelay
/usr/bin/omshell
/usr/sbin/dhcpd # dhcpd 提供服务的程序
/usr/sbin/dhcrelay # 中继器
/usr/share/doc/dhcp-3.0.5
/usr/share/doc/dhcp-3.0.5/IANA-arp-parameters
/usr/share/doc/dhcp-3.0.5/README
/usr/share/doc/dhcp-3.0.5/RELNOTES
/usr/share/doc/dhcp-3.0.5/api+protocol
/usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-authentication-14.txt
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-dhcp-dns-12.txt
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-failover-07.txt
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient-script.8
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.8
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.conf.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.leases.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhcp-eval.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhcp-options.5
/usr/share/doc/dhcp-3.0.5/rfc1542.txt
/usr/share/doc/dhcp-3.0.5/rfc2131.txt
/usr/share/doc/dhcp-3.0.5/rfc2132.txt
/usr/share/doc/dhcp-3.0.5/rfc2485.txt
/usr/share/doc/dhcp-3.0.5/rfc2489.txt
/usr/share/doc/dhcp-3.0.5/rfc951.txt
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcp-eval.5.gz
/usr/share/man/man5/dhcp-options.5.gz
/usr/share/man/man5/dhcpd-eval.5.gz
/usr/share/man/man5/dhcpd-options.5.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
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases # (leases 租约)这里记明白哪个地址分配给谁使用的
[root@localhost ~]#
可以不是路由器,只要是个主机,装上 dhcp 的软件包 只要启用 dhcrelay 功能就可以了,就是中继器
所以 relay 和 dhcpd 一般来说是不能同时使用的,这就是为什么软件包没有叫 dhcpd的原因
所以软件包不叫 dhcpd 而叫dhcp,因为它提供了两个服务 1)dhcpd 2)dhcrelay
dhcp的配置文件
/etc/dhcpd.conf
[root@localhost ~]# vim /etc/dhcpd.conf
里面没有内容,但是注释告诉我们 有个模板 我们复制过来
[root@localhost ~]# cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
cp:是否覆盖“/etc/dhcpd.conf”? y
[root@localhost ~]#
[root@localhost ~]# vim /etc/dhcpd.conf
#每一行都要用分号结尾(没有分号,语法错误)
ddns-update-style interim; #( interim 临时的,暂时的)(ddns dynamic dns)动态dns的更新方式,地址发生改变后会 动态的通知dns服务器,把dns服务器数据文件里面的内容改一改,这非常危险,有人把里面的对应的dns域名改成他的ip地址了 (有人把icbc.com的地址改成他的电脑,他的电脑上的页面与icbc.com的页面一模一样,提示你输入账号密码,一点击,告诉网站在维护,请稍候,他把账号密码登入真正的icbc.com网站中去,然后要确认码,然后假icbc.com告诉客户,网站修复好,请输入确认码,假icbc.com提示有错误,,,然后呢他把确认码输入真正的icbc.com,那你的钱就没了,这就是钓鱼网站)(攻击dns方法有很多比如有缓存毒化,第一次访问icbc.com时,dns解析结果是缓存到本地的,通过一些客户端软件,把里面缓存的内容改一改,下次访问的时候不是通过dns服务器解析的,而是通过本地获取)
动态dns很危险,一般不用,更新方式有三种,另外两种都废弃了,所有只有这一种
ignore client-updates; #是不是忽略客户端更新,(就是客户端更新不起作用)这是配合上面一行工作的,怎么去更新dns服务器上面的数据的
#所以上面两行都不用管它了
#指令 值 这叫指令
#可以定义多个子网,必须是定义一个子网,与本机(当前的dhcp服务器的网卡)的ip地址在同一个网段中(本地地址池)
#否则dhcp服务器启动不了
subnet 192.168.1.0 netmask 255.255.255.0 { #子网 地址池列表
# --- default gateway
option routers 192.168.1.1; #默认网关,路由器,给客户端提供的默认的网关地址 #关键字 指令 值 这叫选项
option subnet-mask 255.255.255.0; #子网掩码
option nis-domain "domain.org"; #nis域,我们用不着,可以注释掉
option domain-name "domain.org";#域名 给 /etc/resolv.conf 当中的search 后面的字符串,这就是搜索域
()
option domain-name-servers 192.168.1.1,180.110.21.78;#dns服务器地址,如果有多个的话,用逗号(,)隔开,对linux而言 最多三个 加个公网地址吧
option time-offset -18000; # Eastern Standard Time #时间偏移,用来定义时区的
# option ntp-servers 192.168.1.1;
# option netbios-name-servers 192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
# range dynamic-bootp 192.168.0.128 192.168.0.254;
range dynamic-bootp 192.168.1.60 192.168.1.70;
#范围,地址池 指定起始地址和结束地址,这就是地址池中可以分配出去的地址 linux上的dhcp服务器向外分配地址的时候,是从大到小来的(windows是从小到大)
default-lease-time 21600;#默认租约长度,单位是秒 6小时
max-lease-time 43200;#最大租约长度,单位是秒 12小时
# we want the nameserver to appear at a fixed address
host ns { #定义保留地址的 host就是定义定义保留地址,某个主机的 ns是标记符,没有意义,你自己拿来去识别客户端的一个标记而已
next-server marvin.redhat.com;#下一个服务器,指定用于pxc当中的,用于向对方客户端提供文件服务器的, 指定文件服务器,通过这个服务器获取引导文件的
hardware ethernet 12:34:56:78:AB:CD; #指定对方的mac地址
fixed-address 207.175.42.254;#给它分配的保留地址 (固定地址)
}
}
/etc/dhcpd.conf 改成 如下
[root@localhost ~]# vim /etc/dhcpd.conf
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- default gateway
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option nis-domain "domain.org";
option domain-name "mageedu.com";
option domain-name-servers 192.168.1.1;
option time-offset -18000; # Eastern Standard Time
# option ntp-servers 192.168.1.1;
# option netbios-name-servers 192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
range 192.168.1.10 192.168.1.20;
default-lease-time 21600;
max-lease-time 43200;
# we want the nameserver to appear at a fixed address
#host ns {
# next-server marvin.redhat.com;
# hardware ethernet 12:34:56:78:AB:CD;
# fixed-address 207.175.42.254;
#}
}
[root@localhost ~]# service dhcpd start
启动 dhcpd: [确定]
[root@localhost ~]#
dhcp是基于udc工作的,它既然是服务器,就是监听到某个端口上,
UDP:
67/udp 服务端是监听到67号端口上
68/udp 客户端是监听到68号端口上 服务端要租约响应报文给客户端,所以客户端也监听到68端口上
服务器端
[root@localhost ~]# netstat -unlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:933 0.0.0.0:* 3725/rpc.statd
udp 0 0 0.0.0.0:936 0.0.0.0:* 3725/rpc.statd
udp 0 0 192.168.1.104:53 0.0.0.0:* 4794/named
udp 0 0 192.168.1.45:53 0.0.0.0:* 4794/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 4794/named
udp 0 0 0.0.0.0:67 0.0.0.0:* 8257/dhcpd
udp 0 0 0.0.0.0:68 0.0.0.0:* 3420/dhclient
udp 0 0 0.0.0.0:49000 0.0.0.0:* 4294/avahi-daemon
udp 0 0 0.0.0.0:5353 0.0.0.0:* 4294/avahi-daemon
udp 0 0 0.0.0.0:111 0.0.0.0:* 3675/portmap
udp 0 0 0.0.0.0:631 0.0.0.0:* 4106/cupsd
udp 0 0 :::5353 :::* 4294/avahi-daemon
udp 0 0 :::37497 :::* 4294/avahi-daemon
[root@localhost ~]#
教室里有dhcp,服务器是个dhcp,无线路由也提供dhcp,,,,共计三个dhcp服务器
我们的客户使用哪个dhcp呢,谁的响应快,就使用谁提供的地址
在客户端上
修改过后,重启网络服务
# server network restart
看看地址
#ifconfig
我这里看不出来 是哪个dhcp提供的客户端地址
马哥那边能看出来不是配置的dhcp服务器提供的地址
下图是马哥的
在服务器端(192.168.1.45) (干脆提供192.168.1.33),我们固定地址(保留地址)
[root@localhost ~]# vim /etc/dhcpd.conf
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- default gateway
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option nis-domain "domain.org";
option domain-name "mageedu.comgg";
option domain-name-servers 192.168.1.1;
option time-offset -18000; # Eastern Standard Time
# option ntp-servers 192.168.1.1;
# option netbios-name-servers 192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
range 192.168.1.10 192.168.1.20;
default-lease-time 21600;
max-lease-time 43200;
# we want the nameserver to appear at a fixed address
host ns2 { #随便起个名 ns2
next-server marvin.redhat.com;
hardware ethernet 00:0C:29:0F:3A:5D; #把上面的客户端的 mac地址填进来
#当然 00:0C:29 是 vmware固定的前缀
fixed-address 192.168.1.33; #一定不能是地址池中的地址
}
}
在服务器端 (192.168.1.45) 把汉字注释去掉,如下
[root@localhost ~]# vim /etc/dhcpd.conf
ddns-update-style interim;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0 {
# --- default gateway
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option nis-domain "domain.org";
option domain-name "mageedu.comgg";
option domain-name-servers 192.168.1.1;
option time-offset -18000; # Eastern Standard Time
# option ntp-servers 192.168.1.1;
# option netbios-name-servers 192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;
range 192.168.1.10 192.168.1.20;
default-lease-time 21600;
max-lease-time 43200;
# we want the nameserver to appear at a fixed address
host ns2 {
next-server marvin.redhat.com;
hardware ethernet 00:0C:29:0F:3A:5D;
fixed-address 192.168.1.33;
}
}
在服务器端 (192.168.1.45)
[root@localhost ~]# service dhcpd restart
关闭 dhcpd: [确定]
启动 dhcpd: [确定]
[root@localhost ~]#
客户端 (网卡是 00:0C:29:0F:3A:5D )重启网络
# service network restart
客户端 ( 网卡是 00:0C:29:0F:3A:5D ) 看ip ,,,,可以看到192.168.1.33 已经生效了,所以专用地址(固定地址 保留地址) 优先级要高
服务器端 (192.168.1.45)
[root@localhost ~]# tail /var/lib/dhcpd/dhcpd.leases (可以看到租约)
# This lease file was written by isc-dhcp-V3.0.5-RedHat
lease 192.168.1.20 {
starts 1 2019/02/18 08:57:46;
ends 1 2019/02/18 14:57:46;
tstp 1 2019/02/18 14:57:46;
binding state active;
next binding state free;
hardware ethernet 00:0c:29:0f:3a:5d;
}
[root@localhost ~]#
[root@localhost ~]# tail /var/lib/dhcpd/dhcpd.leases~
next binding state free;
hardware ethernet 00:0c:29:0f:3a:5d;
}
lease 192.168.1.20 {
starts 1 2019/02/18 08:57:46;
ends 1 2019/02/18 14:57:46;
binding state active;
next binding state free;
hardware ethernet 00:0c:29:0f:3a:5d;
}
[root@localhost ~]#
教室里太多人做dhcp服务器,地址太多 我们只让两台电脑在一起,其中一台做dhcp
当然不用桥接了 也不要NAT 也不用Host-only (因为这两种情况下,vmware本身也作为一个dhcp服务器)
(当然把vmware的hdcp服务器关掉就可以了)
(马哥的英文图)
(下面把 vmware的hdcp服务器关掉就可以了)
(马哥的英文图)
我们使用另一种虚拟的办法 让两个主机在同一个网络中 (VMnet2) (内部的独有的假设出来的专用网络)
(此时谁都连不上这个网络VMnet2,连物理机都连不上,它们两在一个虚拟的私有的网络中通信,跟物理机都没法通信了)
服务器端 和 客户端 都是同样如 下面几个图的配置
(假如有两个网卡的话,把没有用到的网卡断掉吧) 下图是断掉第二个网卡
)
服务端 ( 192.168.1.45 )
# vim /etc/dhcpd.conf (把固定地址(保留地址)任意改下吧,改下后,就说明不是使用原来的固定地址(保留地址)了)
服务端 ( 192.168.1.45 )
# service dhcpd restart
# service network restart
(这个报错,大约是因为禁用了 eth1 这个网卡吧)
客户端 ( 00:0c:29:0f:3a:5d 这个网卡的电脑 )
# service network restart
# ifconfig ( 00:0c:29:0f:3a:5d 这个网卡的电脑 ) 可以看到ip是最大的
# tail /var/lib/dhcpd/dhcpd.leases 可以看到租约了
192.168.1.20 分配给 00:0c29:0f:3a:5d 了
starts 租约开始时间
ends 租约结束时间
刚刚每次都要重启客户端网络服务的,我们可以不必这么麻烦
[root@localhost ~]# dhclient -h
Internet Systems Consortium DHCP Client V3.0.5-RedHat
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/
Usage: dhclient [-1dqr] [-nwx] [-p <port>] [-s server] [-cf config-file] [-lf lease-file][-pf pid-file] [-e VAR=val] [ -I <dhcp-client-identifier> ] [-B]
[ -H <host-name> | -F <fqdn.fqdn> ] [ -T <timeout> ]
[ -V <vendor-class-identifier> ]
[ -R <request option list> ]
[-sf script-file] [interface][root@localhost ~]#
[root@localhost ~]# man dhclient
客户端 关闭client
客户端
# dhclient eth0 (只有一个网卡吧 不指eth0也行)
# dhclient
Listening on 监听哪个网卡
Sending on 从哪个网卡发送的
DHCPOFFER 哪个dhcp服务器提供地址的
HDCPACK 哪个dhcp地址确认
bound 客户绑定ip地址 可以看到是最大的
# dhclient 是个运行的进程 不能执行第二次
dhclient (10431) is already running - exiting. (提示 dhclient 已经在运行)
# killall dhclient 把这个进程杀死
# dhclient 重来一次申请ip地址
服务器 ( 192.168.1.45 )
# vim /etc/dhcpd.conf
# service dhcpd restart (重启dhcpd服务器)
客户端
# killall dhclient 把这个进程杀死
# dhclient 重来一次申请ip地址
DHCPREQUEST 请求续租 这里请求了两次(因为人家192.168.1.20 还没有到期,请求了两次)
(因为列表中不包含 192.168.1.20 这个地址了,所以服务器端不给这个地址了)
所以重新 DHCPDISCOVER
.....................
最终给的地址是 192.168.1.18
每次都要 killall ,如果不想每次使用killall
可以使用 # dhclient -d (但第一次时 必须要先 执行killall 即 # killall dhclient )
( dhclient -d 是工作在前台的 )
ctrl+c 取消执行
dhcp的功能是非常强大的,它可以分类获得地址的
可以让windows获得200以上的地址
让linux获得200以下的地址,
dhcp可以根据操作系统来判断的客户端来源分类的
还能根据网卡地址来分类,比如是虚拟机的话,可以给特定的网段地址
不是虚拟机的话,再给特定的网段地址
windows的话,再给另外的特定网段地址
这些功能大多数情况下 不怎么用,所以不讲了
配置php的工作环境时,偶尔可能会用到