LINUX中的dhcp服务器
介绍及配置:
一dhcp介绍:
dhcp称为 动态主机配置协议
运行dhcp服务的计算机或设备,称为dhcp服务器,该服务器可以为网络中的工作站自动分配
IP地址,子网掩码,网关,DNS等参数
dhcp,可应用于网吧,机房,办公室以及网络管理中
dhcp服务器为客户机分配IP,是有相应的时间限制的,计算机可能每次启动所获取的地址均不一样
把这种地址获取称为动态地址获取
二使用DHCP原因:
初学者以及在某种网络环境下不了解IP设定情况
用户在输入网络参数时,手误造成参数出错
在经常发生IP冲突的环境
网络中有大量计算机需要更改网络参数
三dhcp服务器的条件:
服务器必须有相应的dhcp软件,在linux计算机中,要求已经安装了dhcp软件包
服务器必须要求具有静态的IP地址
服务器为工作站分配IP地址,前提是服务器必须有可用的空闲IP地址
四linux中dhcp服务器安装及启动:
1dhcp服务器软件包安装:
rpm -qa | grep dhcp
软件包名为 dhcp-30pl1-23
2dhcp服务器主进程名称为 dhcpd
控制脚本为 /etc/rcd/initd/dhcpd
3 dhcp服务器启动:
默认情况下,无法启动dhcp服务器,原因在于 /etc目录下不存在dhcp服务器的配置文件dhcpdconf
从目录 /usr/share/doc/dhcp-30pl1 下,将文件 dhcpdconfsample 复制到 /etc 目录下,并
改名为 dhcpdconf
复制完成后,通过对 dhcpdconf 文件做配置,再由命令 service dhcpd start 启动服务器即可
4使每次启动计算机后,dhcp服务器自动启动
chkconfig --level 35 dhcpd on
五配置dhcp服务器,使得服务器为网络中其它计算机分配IP:
在配置dhcp服务器之前,首先确定服务器IP地址,以及网络号等信息
如服务器IP为 1000219 ,则网络号为 255000
打开 /etc/dhcpdconf 文件,做如下项目设定
subnet 10000 netmask 255000 { =>指定dhcp服务器的作用域范围在10000网络
[服务器IP所在的网络应与上述网络一致]
option subnet-mask 255000; =>指定分配IP地址时所使用的掩码
range dynamic-bootp 1000240 1000249; =>指定分配的IP地址范围[地址1 小于 地址2]
完成后,保存退出,并重启dhcpd进程 [ service dhcpd restart ]
六配置计算机从dhcp服务器获取IP地址等:
[以windows为例]
将tcp/ip协议中的IP地址,更改为自动获取
完成后,可以通过命令
ipconfig /all -->查看网络信息
ipconfig /release -->丢弃所获取的IP
ipconfig /renew -->重新获取IP
七为dhcp服务器做进一步配置:
1配置IP地址的租用期限:
[默认租用期限为 6 小时]
在配置文件中
default-lease-time 21600; -->21600秒,即六小时
max-lease-time 43200; -->续约地址最大使用 十二小时
2 在服务器配置为工作站分配的网关与dns参数
option routers 10001; ->网关选项,工作站获取IP同时,也
获取了网关地址
option domain-name-servers 20210322468; ->dns选项,工作站获取IP同时,也
获取了dns服务器地址
3 为网络中特定的计算机添加地址保留;
为网络中特定的计算机绑定IP,使其无论在何时,均从服务器获取同一个IP地址,而且不会
受租用期限的限制
配置文件中有如下配置
host ns { =>ns 为本次绑定的名称标识,可任意,最好填写对方
计算机名称
next-server marvinredhatcom; =>当前服务器无IP时,用下一服务器分配通常可省略 hardware ethernet 12:34:56:78:AB:CD; =>对方计算机的网卡卡号,注意格式
fixed-address 20717542254; =>要分配给对方计算机的IP地址
}
完成后,重启dhcp服务器即可
工作站可以采用命令刷新,或者重启计算机
八 工作站向服务器请求分配IP地址的过程:
dhcp discovery[搜索:工作站向整个网络发送广播,搜索dhcp服务器]
dhcp offer[回应:dhcp服务器收到广播后,检测自身IP地址池是否有空闲IP,有则分配一个地址给
工作站]
dhcp request[请求:工作站收到服务器分配的地址后,立刻应用,并发一确认信息给服务器,请求
服务器确认所使用的IP地址]
dhcp pack [确定:服务器收到请求信息,将分配的地址标识为已用,完成地址分配]
九 dhcp中继:
计算机x ,y ,z 发送广播请求分配地址,此时服务器s 收到请求
但服务器S并不是dhcp服务器,由于配置了dhcp中继,则服务器S会向网络其它dhcp服务器
发送请求分配IP, dhcp服务器收到请求后,立刻分配IP地址给服务器S,而服务器S再将
所得到的地址分配给计算机 x, y, z
在linux中配置dhcp中继方法如下:
采用vi 打开 /etc/sysconfig/dhcrelay 文件
INTERFACES ="" -->填写上采用哪个接口接收工作站的广播
DHCPSERVERS="" -->填写网络中dhcp服务器IP地址
如 INTERFACES="eth1"
DHCPSERVERS="1000219"
完成以后保存,并启动独立进程 dhcrealy 即可
设置和使用DHCP
在FreeBSD的Packages Collection中,有两个不同的DHCP客户机和服务器软件,一个为ISC-DHCP,另一个为WIDE-DHCP,两个软件都包括了DHCP客户软件和服务器软件,其中ISC-DHCP 更为常用一些,这里就以ISC-DHCP为例介绍在FreeBSD上安装和设置DHCP。
为了支持DHCP,首先要确认系统内核支持伪设备bpfilter,如果没有,就需要重新编译内核。伪设备bpfilter 是一个允许应用程序接收网络的原始数据包的界面,这样应用程序就能接收目的地址非本机IP地址的数据包了。DHCP使用bpfilter的原因是在DHCP设置好计算机的TCP/IP之前,由于计算机本身没有定义IP地址,而TCP/IP堆栈本身不会接收不具备本机IP地址的数据包。要接收DHCP服务器发送回客户的数据包,就需要绕过TCP/IP堆栈,而必须使用伪设备bpfilter。
pseudo-device bpfilter 4
定制内核之后,还要保证/dev/目录下具有对应bpfilter的设备文件。
# cd /dev
# sh MAKEDEV bpf0 bpf1 bpf2 bpf3
从Packages Collecion中安装DHCP软件,这将DHCP软件中的dhcpd,dhclient和dhcprelay 安装到/usr/local/sbin目录下。
$ ls /usr/local/sbin/dhc
/usr/local/sbin/dhclient /usr/local/sbin/dhcpd
/usr/local/sbin/dhcrelay
设置服务器
为了设置DHCP服务器dhcpd,首先就要设置其配置文件/etc/dhcpdconf。这个配置文件语法简单,比较容易理解。
server-identifier 19216831;
subnet 19216830 netmask 2552552550 {
range 192168310 192168320;
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 2552552550;
option broadcast-address 1921683255;
option routers 19216831;
option domain-name-servers 19216831;
option domain-name "exampleorgorgcn";
}
host a1 {
hardware ethernet 00:90:27:4e:92:09;
fixed-address 192168332;
option subnet-mask 2552552550;
option broadcast-address 1921683255;
option routers 19216831;
option domain-name-servers 19216831;
option domain-name "exampleorgorgcn";
}
基本的dhcpdconf首先使用server-identifier定义了本服务器的IP地址,这对于有多个IP地址的服务器系统十分重要,一般不必设置这个参数,dhcpd能自动侦测。然后定义要分配IP地址的客户机组,每组拥有一个可用的IP地址范围。有两种客户机组的划分方式,一种为指定子网段来区分,一种为指定主机来区分。
这个例子中的第一组定义了一个子网19216830/24,这个子网段内,可供DHCP服务器分配的I P地址范围为192168310到192168320,这个地址范围也可以不是连续的,不连续的地址可以使用多个range设置参数来设置。此外,还设置了这一组内分配的IP地址的租期限制default-lease-time 和max-lease-time,可以使用缺省值,而不必改动。后面的option参数设置DHCP的附加功能,例如设置DHCP客户的网络掩码、广播地址、DNS服务器、域名等等。事实上这些option设置选项也可以被用作全局选项设置,即放置在server-identifier之后,对所有的客户机组起作用。
例子的第二组是针对某个特定主机a1进行的设置,这个主机被限定为以太网地址为hardware ethernet 参数值的计算机,将给这个计算机分配一个固定地址。这种分配方式实际等价于固定地址分配方式,唯一的好处就是能够对IP地址进行集中管理,不必每个计算机分别设置了。这里同样也可以使用option参数,设置TCP/IP的参数。
dhcpdconf中还能有更多的组,包括对非本网段的子网上的客户机指定的组。
当设置了dhcpdconf之后,就能启动dhcpd守护进程了,由于计算机会有多个网络界面,需要指定dhcpd 服务器的网络界面,以便回应相应界面上的DHCP请求。
# /usr/local/sbin/dhcpd fxp0
在调试阶段,可以使用-d参数,这样dhcpd就不会进入后台运行,而一直保留在前台,并显示各个与客户计算机通信的过程。当一切都调试完毕之后,就能去除-d参数,并将执行命令放入rclocal启动脚本中,以便系统能够自动执行。
此后,dhcpd正常运行的时候,会将每一次客户请求及其回应的IP地址分配的记录,都记录在/var/run/dhcpdleases 文件中。为了使dhcpd能正常进行日志记录,应该在启动dhcpd之前使用touch 命令,生成一个新的日志文件。以后就可以查看这个日志文件的内容,以得到当前DHCP服务器的状态和客户机IP地址分配的情况。以下是一个日志文件的部分内容。
lease 192168311 {
starts 3 1998/11/26 05:46:28;
ends 4 1998/11/27 05:46:28;
hardware ethernet 0:80:c2:12:fd:d;
uid 1:0:80:c2:12:fd:d;
}
touch命令的优点是在存在相关的文件时,不删除或更改文件内容,只更新其访问时间设置,只有在文件不存在时才生成新文件。
然后就能设置网络中的客户计算机使用DHCP协议,获取合法的IP地址了。通常Windows计算机的TCP/IP设置中能直接设置支持DHCP协议,如果为Unix(包括FreeBSD)设置DHCP客户软件,就需要dhclient的支持。
设置客户软件
ISC-DHCP中同样也提供了一个客户程序dhclient,用于FreeBSD系统从DHCP服务器上动态获取一个IP地址。这个程序同样也要求内核支持bpfilter伪设备。
dhclient使用的配置文件为/etc/dhclientconf,然而最一般的情况下可以不使用它,软件本身的缺省配置就满足一般情况下请求IP地址的需要了。缺省设置下dhclient在获得了IP地址之后,会自动执行/etc/dhclient-script 这个脚本程序,以针对刚获取的动态IP地址进行必要的设置。很多依赖于IP地址的网络服务,就可以在这个脚本中启动,或者针对重新分配的动态IP地址对已有的网络服务进行修正。虽然使用者也许不希望使用这个脚本设置网络,但如果不存在这个脚本程序,或者这个程序不可执行,那么dhclient就不能正常执行。
因此对于最一般的客户机,一般只连接到一个网络上,仅具备一个网络界面,可以使用一个空的dhclientconf 和空的declient-script文件,就能完成设置IP地址和其他TCP/IP参数的任务了。
# touch /etc/dhclientconf
# touch /etc/dhclient-script
# chmod +x /etc/dhclient-script
# /usr/local/sbin/dhclient fxp0
Listening on BPF/fxp0/00:90:27:4e:92:09/unattached
Sending on BPF/fxp0/00:90:27:4e:92:09/unattached
Sending on Socket/fallback/fallback-net
DHCPDISCOVER on fxp0 to 255255255255 port 67 interval 22
DHCPOFFER from 19216831
DHCPREQUEST on fxp0 to 255255255255 port 67
DHCPACK from 19216831
bound to 192168332 -- renewal in 3600 seconds
在更复杂的情况下,就要指定更多的内容,例如当系统有多个网卡时,要指定dhclient应该从哪个子网中获得IP地址设置,就需要使用设置文件dhclientconf。一般除非有多个局域网网络界面,都应该使用空设置文件,避免产生配置错误。以下为一个简单的dhclientconf的例子,可以用于多网络界面的情况:
# Defaults
timeout 60;
reboot 10;
retry 60;
select-timeout 5;
initial-interval 2;
script "/etc/dhclient-script";
interface "fxp0" {
request subnet-mask, broadcast-address, routers, domain-name-servers,
domain-name, host-name;
require domain-name-servers;
}
这个设置文件主要用于重新定义一些参数,比较容易理解,更改也比较容易。
成功的手工执行dhclient之后,就可以考虑将其和系统启动文件相结合了。因为很多网络服务是依赖于网络配置的,应该在启动这些网络服务之前使用DHCP配置好TCP/IP。使用dhclient-script启动服务的想法虽然也能解决问题,然而这就不能使用系统的启动rc文件中的相关设置启动网络服务,而在这个dhclient-script 中重新启动,因此比较麻烦。更简便的做法是仅仅在dhclient-script中设置hostname,而让系统启动文件完成其他网络服务的启动。这样就要求将dhclient与系统rc文件结合起来。
#hostname="mydomainname"
network_interfaces="fxp0 lo0" # List of network interfaces (lo0 is
loopback)
ifconfig_lo0="inet 127001" # default loopback device configuration
#ifconfig_fxp0="inet 192168312 netmask 2552552550"
defaultrouter="NO" # Set to default gateway (or NO)
这样就需要更改rcconf文件,更改一些设置语句。首先要注释hostname设置,而在dhclientscript中进行设置,也不必设置defaultrouter,它通过DHCP协议自动设置。同时要保证network_interfaces参数中,设置了要通过dhclient来获取IP地址的网络界面fxp0,以允许rc系统文件能启动该与该界面相关的设置文件,然而却必须注释设置该界面的参数ifconfig_fxp0,因为这个设置参数是用于设置静态IP地址的选项,因此要屏蔽它,而使用start_iffxp0配置脚本来设置网络界面。
缺省情况下,不存在start_iffxp0等start_if设置网络脚本,但是这些脚本在rcnetwork已经做好了设置,针对每个网络界面启动,而不需要在rcconf中做特别设定。对于dhclient,可以创建一个简单的启动脚本start_iffxp0为:
#! /bin/sh
/usr/local/sbin/dhclient fxp0
这样,dhclient就和系统启动文件结合起来了,在系统启动的时候会自动设置好TCP/IP,此后再启动相关的网络服务。此时需要注意的是删除原来可能在rclocal或者在/usr/local/etc/rcd目录中的dhclient启动命令,以避免冲突。
在FreeBSD系统上不推荐使用动态IP地址,因为FreeBSD能提供大量有用的网络服务,都会与IP地址或域名有关,不适合使用动态IP地址。如果必须要作为DHCP客户以保持IP地址的统一管理,建议使用dhcpd针对硬件地址的设置方式,在DHCP服务器上为FreeBSD系统设定一个固定IP地址。
设置DHCP中转
当网络中存在多个子网的时候,由于客户计算机只能通过广播发送DHCP请求,这些请求一般不能跨越路由器。为了在DHCP服务器存在的子网之外的DHCP客户分配IP地址,可以设置路由器转发DHCP请求,即转发相应的UDP 端口67和68的广播数据包。但这样设置就增加了网络广播,不利于减少网络流量。
此外,还有另外一种方法来使得DHCP客户计算机能使用子网之外的DHCP服务器来分配IP地址。这就是使用 DHCP中转计算机来转发DHCP的请求。DHCP中转计算机能听取DHCP广播,由于它了解DHCP服务器的IP地址,因此能通过正常的IP数据包将原广播包转发到服务器中,然后再将服务器的回应信息回复客户机。这样DHCP客户机就以为本子网中也存在一个DHCP服务器。
在ISC-DHCP软件中,提供的中转程序为dhcrelay,这是一个简单的程序,不需要额外的设置。启动 dhcrelay的标准方式为使用命令行指定将DHCP服务请求中转到的目的DHCP服务器,由于DHCP中允许多个 DHCP服务器同时为客户提供地址,而不会产生冲突,就可以使用多个DHCP服务器进行中转。
# dhcrelay dhcpsrv1 dhcpsrv2
如果这台中转服务器为多网络界面计算机,那么dhcrelay将侦听所有网络界面的DHCP请求,有时不希望 dhcrelay中转某些界面上的请求,就可以设置dhcrelay侦听的网络界面,这需要指定-i参数。
# dhcrelay -i xl0 dhcpsrv1
提供备份的DHCP设置
在一个具备多个子网的大型网络中,提供冗余是一个非常重要的问题。由于DHCP协议中DHCP服务器负责分配 IP地址,一旦DHCP服务器出现故障,那么所有的客户就无法正确获得IP地址,从而不能访问网络。
但可以同时设置多个DHCP服务器来提供一个冗余能力。然而DHCP服务器本身是不提供备份能力的,不能互为备份。他们占用的IP地址资源也不能重叠,以免发生客户机IP地址冲突的现象。提供容错能力是通过分割可用的IP地址到不同的DHCP服务器上,通过多个DHCP服务器同时为一个网络服务,从而使得一个服务器发生故障还能正常执行操作。通常为了进一步增强可靠性,还可以将不同的DHCP服务器放置在不同子网中,互相使用中转提供服务。
例如在两个子网上各自有一个DHCP服务器,标准的做法可以不使用DHCP中转,各个子网上的服务器为各个子网服务就行了。然而为了达到容错的目的,可以互相为另一个子网提供服务,通过设置中转或路由器转发广播以达到互为服务的目的。
例如位于19216830网络上的srv1的配置可能为:
subnet 19216830 netmask 2552552550 {
range 192168310 1921683199;
}
subnet 19216840 netmask 2552552550 {
range 1921684200 1921684220;
}
位于19216840网络上的srv2的配置可能为:
subnet 19216840 netmask 2552552550 {
range 192168410 1921684199;
}
subnet 19216830 netmask 2552552550 {
range 1921683200 1921683220;
}
注意,上述设置都是设置样例,标准情况下还需分别指定各个option,用于设置IP地址及其相关设置。
可以看出两个服务器都能对两个网络上的客户机分配IP地址,而各自又有一个主要服务的网络。每个网络上的IP 地址主要放在本地的服务器上,但也有少部分地址放在另一个子网中的服务器上(地址资源不能冲突),这样提供了一定的容错能力。
实际的多子网网络中,并不必要每个子网都设置一个服务器,并使用另外的服务器备份,一般网络中有2-3个DH CP服务器就够用了。其他子网可以通过DHCP中转的方式,给该子网提供DHCP服务。
Q:什么是 DHCP(动态主机配置协议)
A:DHCP 是一种多种工作站共享 IP 地址的方法。当一台主机要和 Internet 通讯时,它从 DHCP 服务器申请一个合法的 IP 地址,并使用该 IP 地址完成该次连接。然后,该 IP 地址被释放,别的机器还可以再次使用。目前 Internet 的拨号用户就是采用这种方法和 Internet 通讯的。
DHCP 是 Dynamic Host Configuration Protocol 之缩写,它的前身是 BOOTP。BOOTP 原本是用于无磁碟主机连接的网路上面的:网路主机使用 BOOT ROM 而不是磁碟起动并连接上网路,BOOTP 则可以自动地为那些主机设定 TCP/IP 环境。但 BOOTP 有一个缺点:您在设定前须事先获得客户端的硬体位址,而且,与 IP 的对应是静态的。换而言之,BOOTP 非常缺乏 "动态性" ,若在有限的 IP 资源环境中,BOOTP 的一对一对应会造成非常可观的浪费。
DHCP 可以说是 BOOTP 的增强版本,它分为两个部份:一个是伺服器端,而另一个是客户端。所有的 IP 网路设定资料都由 DHCP 伺服器集中管理,并负责处理客户端的 DHCP 要求;而客户端则会使用从伺服器分配下来的IP环境资料。比较起 BOOTP ,DHCP 透过 "租约" 的概念,有效且动态的分配客户端的 TCP/IP 设定,而且,作为兼容考量,DHCP 也完全照顾了 BOOTP Client 的需求。
DHCP的分配形式
首先,必须至少有一台 DHCP 工作在网路上面,它会监听网路的 DHCP 请求,并与客户端搓商 TCP/IP 的设定环境。它提供两种 IP 定位方式:
Automatic Allocation 自动分配,其情形是:一旦 DHCP 客户端第一次成功的从 DHCP 伺服器端租用到 IP 位址之后,就永远使用这个位址。
Dynamic Allocation 动态分配,当 DHCP 第一次从 HDCP 伺服器端租用到 IP 位址之后,并非永久的使用该位址,只要租约到期,客户端就得释放(release)这个 IP 位址,以给其它工作站使用。当然,客户端可以比其它主机更优先的延续(renew)租约,或是租用其它的 IP 位址。
动态分配显然比自动分配更加灵活,尤其是当您的实际 IP 位址不足的时候,例如:您是一家 ISP ,只能提供 200 个IP位址用来给拨接客户,但并不意味着您的客户最多只能有 200 个。因为要知道,您的客户们不可能全部同一时间上网的,除了他们各自的行为习惯的不同,也有可能是电话线路的限制。这样,您就可以将这 200 个位址,轮流的租用给拨接上来的客户使用了。这也是为什么当您查看 IP 位址的时候,会因每次拨接而不同的原因了(除非您申请的是一个固定 IP ,通常的 ISP 都可以满足这样的要求,这或许要另外收费)。当然,ISP 不一定使用 DHCP 来分配位址,但这个概念和使用 IP Pool 的原理是一样的。
DHCP 除了能动态的设定 IP 位址之外,还可以将一些 IP 保留下来给一些特殊用途的机器使用,它可以按照硬体位址来固定的分配 IP 位址,这样可以给您更大的设计空间。同时,DHCP 还可以帮客户端指定 router、netmask、DNS Server、WINS Server、等等项目,您在客户端上面,除了将 DHCP 选项打勾之外,几乎无需做任何的 IP 环境设定。
DHCP的工作原理
视乎客户端是否第一次登录网路,DHCP 的工作形式会有所不同。
第一次登录的时候:
1 寻找 Server。当 DHCP 客户端第一次登录网路的时候,也就是客户发现本机上没有任何 IP 资料设定,它会向网路发出一个 DHCPDISCOVER 封包。因为客户端还不知道自己属于哪一个网路,所以封包的来源位址会为 0000 ,而目的位址则为 255255255255 ,然后再附上 Dhcpdiscover 的信息,向网路进行广播。
在 Windows 的预设情形下,Dhcpdiscover 的等待时间预设为 1 秒,也就是当客户端将第一个 Dhcpdiscover 封包送出去之后,在 1 秒之内没有得到回应的话,就会进行第二次 Dhcpdiscover 广播。若一直得不到回应的情况下,客户端一共会有四次 Dhcpdiscover 广播(包括第一次在内),除了第一次会等待 1 秒之外,其余三次的等待时间分别是 9、13、16 秒。如果都没有得到 DHCP 伺服器的回应,客户端则会显示错误信息,宣告 Dhcpdiscover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 Dhcpdiscover 的过程。
2 提供 IP 租用位址。当 DHCP 伺服器监听到客户端发出的 Dhcpdiscover 广播后,它会从那些还没有租出的位址范围内,选择最前面的的空置 IP ,连同其它 TCP/IP 设定,回应给客户端一个 DHCPOFFER 封包。
由于客户端在开始的时候还没有 IP 位址,所以在其 Dhcpdiscover 封包内会带有其 MAC 位址信息,并且有一个 XID 编号来辨别该封包,DHCP 伺服器回应的 Dhcpoffer 封包则会根据这些资料传递给要求租约的客户。根据伺服器端的设定,Dhcpoffer 封包会包含一个租约期限的信息。
3 接受 IP 租约。如果客户端收到网路上多台 DHCP 伺服器的回应,只会挑选其中一个 Dhcpoffer 而已(通常是最先抵达的那个),并且会向网路发送一个Dhcprequest广播封包,告诉所有 DHCP 伺服器它将指定接受哪一台伺服器提供的 IP 位址。
同时,客户端还会向网路发送一个 ARP 封包,查询网路上面有没有其它机器使用该 IP 位址;如果发现该 IP 已经被占用,客户端则会送出一个 DHCPDECLINE 封包给 DHCP 伺服器,拒绝接受其 Dhcpoffer ,并重新发送 Dhcpdiscover 信息。
事实上,并不是所有 DHCP 客户端都会无条件接受 DHCP 伺服器的 offer ,尤其这些主机安装有其它 TCP/IP 相关的客户软体。客户端也可以用 Dhcprequest 向伺服器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP Option Field 里面:
换一句话说,在 DHCP 伺服器上面的设定,未必是客户端全都接受,客户端可以保留自己的一些 TCP/IP 设定。而主动权永远在客户端这边。
4租约确认。当 DHCP 伺服器接收到客户端的 Dhcprequest 之后,会向客户端发出一个 DHCPACK 回应,以确认 IP 租约的正式生效,也就结束了一个完整的 DHCP 工作过程。如上的工作流程如下图:
DHCP发放流程
第一次登录之后:
一旦 DHCP 客户端成功地从伺服器哪里取得 DHCP 租约之后,除非其租约已经失效并且 IP 位址也重新设定回 0000 ,否则就无需再发送 Dhcpdiscover 信息了,而会直接使用已经租用到的 IP 位址向之前之 DHCP 伺服器发出 Dhcprequest 信息,DHCP 伺服器会尽量让客户端使用原来的 IP 位址,如果没问题的话,直接回应 Dhcpack 来确认则可。如果该位址已经失效或已经被其它机器使用了,伺服器则会回应一个 DHCPNACK 封包给客户端,要求其从新执行 Dhcpdiscover。
至于 IP 的租约期限却是非常考究的,并非如我们租房子那样简单, 以 NT 为例子:DHCP 工作站除了在开机的时候发出 dhcprequest 请求之外,在租约期限一半的时候也会发出 dhcprequest ,如果此时得不到 DHCP 伺服器的确认的话,工作站还可以继续使用该 IP ;然后在剩下的租约期限的再一半的时候(即租约的75%),还得不到确认的话,那么工作站就不能拥有这个 IP 了。至于为什么不是到租约期限完全结束才放弃 IP 呢?,对不起,小弟也是不学无术之人,没有去深究了,只知道要回答 MCSE 题目的时候,您一定要记得 NT 是这么工作的就是了。
要是您想退租,可以随时送出 DHCPLEREASE 命令解约,就算您的租约在前一秒钟才获得的。
跨网路的 DHCP 运作
从前面描述的过程中,我们不难发现:DHCDISCOVER 是以广播方式进行的,其情形只能在同一网路之内进行,因为 router 是不会将广播传送出去的。但如果 DHCP 伺服器安设在其它的网路上面呢?由于 DHCP 客户端还没有 IP 环境设定,所以也不知道 Router 位址,而且有些 Router 也不会将 DHCP 广播封包传递出去,因此这情形下 DHCPDISCOVER 是永远没办法抵达 DHCP 伺服器那端的,当然也不会发生 OFFER 及其他动作了。要解决这个问题,我们可以用 DHCP Agent (或 DHCP Proxy )主机来接管客户的 DHCP 请求,然后将此请求传递给真正的 DHCP 伺服器,然后将伺服器的回复传给客户。这里,Proxy 主机必须自己具有路由能力,且能将双方的封包互传对方。
若不使用 Proxy,您也可以在每一个网路之中安装 DHCP 伺服器,但这样的话,一来设备成本会增加,而且,管理上面也比较分散。当然啰,如果在一个十分大型的网路中,这样的均衡式架构还是可取的。端视您的实际情况而定了。
DHCP 封包格式
以下为各栏位的简要说明:
OP
若是 client 送给 server 的封包,设为 1 ,反向为 2 。
HTYPE
硬体类别,Ethernet 为 1 。
HLEN
硬体位址长度, Ethernet 为 6 。
HOPS
若封包需经过 router 传送,每站加 1 ,若在同一网内,为 0 。
TRANSACTION ID
DHCPREQUEST 时产生的数值,以作 DHCPREPLY 时的依据。
SECONDS
Client 端启动时间(秒)。
FLAGS
从 0 到 15 共 16 bits ,最左一 bit 为 1 时表示 server 将以广播方式传送封包给 client ,其余尚未使用。
ciaddr
要是 client 端想继续使用之前取得之 IP 位址,则列于这里。
yiaddr
从 server 送回 client 之 DHCPOFFER 与 DHCPACK 封包中,此栏填写分配给 client 的 IP 位址。
siaddr
若 client 需要透过网路开机,从 server 送出之 DHCPOFFER、DHCPACK、DHCPNACK 封包中,此栏填写开机程式码所在 server 之位址。
giaddr
若需跨网域进行 DHCP 发放,此栏为 relay agent 的位址,否则为 0 。
chaddr
Client 之硬体位址。
sname
Server 之名称字串,以 0x00 结尾。
file
若 client 需要透过网路开机,此栏将指出开机程式名称,稍后以 TFTP 传送。
options
允许厂商定议选项(Vendor-Specific Area),以提供更多的设定资讯(如:Netmask、Gateway、DNS、等等)。其长度可变,同时可携带多个选项,每一选项之第一个 byte 为资讯代码,其后一个 byte 为该项资料长度,最后为项目内容。
DHCP的选项非常多,有空请查阅 RFC 或相关文献,并好好理解,这里不再叙述了。
在FreeBSD的Packages Collection中,有两个不同的DHCP客户机和服务器软件,一 个为ISC-DHCP,另一个为WIDE-DHCP,两个软件都包括了DHCP客户软件和服务器软件,其中ISC-DHCP 更为常用一些,这里就以ISC-DHCP为例介绍在FreeBSD上安装和设置DHCP。
为了支持DHCP,首先要确认系统内核支持伪设备bpfilter,如果没有,就需要重新编译内核。伪设备bpfilter 是一个允许应用程序接收网络的原始数据包的界面,这样应用程序就能接收目的地址非本机IP地址的数据包 了。DHCP使用bpfilter的原因是在DHCP设置好计算机的TCP/IP之前,由于计算机本身没有定义IP地 址,而TCP/IP堆栈本身不会接收不具备本机IP地址的数据包。要接收DHCP服务器发送回客户的数据包,就需要绕 过TCP/IP堆栈,而必须使用伪设备bpfilter。
1 pseudo-device bpfilter 4
定制内核之后,还要保证/dev/目录下具有对应bpfilter的设备文件。
1 # cd /dev
2 # sh MAKEDEV bpf0 bpf1 bpf2 bpf3
从Packages Collecion中安装DHCP软件,这将DHCP软件中的dhcpd,dhclient和dhcprelay 安装到/usr/local/sbin目录下。
1 $ ls /usr/local/sbin/dhc
2 /usr/local/sbin/dhclient
3 /usr/local/sbin/dhcpd
4 /usr/local/sbin/dhcrelay
设置服务器
为了设置DHCP服务器dhcpd,首先就要设置其配置文件/etc/dhcpdconf。这个配置文件 语法简单,比较容易理解。
1 server-identifier 19216831;
2
3 subnet 19216830 netmask 2552552550 {
4 range 192168310 192168320;
5 default-lease-time 600;
6 max-lease-time 7200;
7 option subnet-mask 2552552550;
8 option broadcast-address 1921683255;
9 option routers 19216831;
10 option domain-name-servers 19216831;
11 option domain-name "exampleorgorgcn";
12 }
13
14 host a1 {
15 hardware ethernet 00:90:27:4e:92:09;
16 fixed-address 192168332;
17 option subnet-mask 2552552550;
18 option broadcast-address 1921683255;
19 option routers 19216831;
20 option domain-name-servers 19216831;
21 option domain-name "exampleorgorgcn";
22 }
基本的dhcpdconf首先使用server-identifier定义了本服务器的IP地址,这对于有 多个IP地址的服务器系统十分重要,一般不必设置这个参数,dhcpd能自动侦测。然后定义要分配IP地址的客户机组 ,每组拥有一个可用的IP地址范围。有两种客户机组的划分方式,一种为指定子网段来区分,一种为指定主机来区分。
这个例子中的第一组定义了一个子网19216830/24,这个子网段内,可供DHCP服务器分配的I P地址范围为192168310到192168320,这个地址范围也可以不是连续的,不连续的地址可以 使用多个range设置参数来设置。此外,还设置了这一组内分配的IP地址的租期限制default-lease-time 和max-lease-time,可以使用缺省值,而不必改动。后面的option参数设置DHCP的附加功能 ,例如设置DHCP客户的网络掩码、广播地址、DNS服务器、域名等等。事实上这些option设置选项也可以被用作 全局选项设置,即放置在server-identifier之后,对所有的客户机组起作用。
例子的第二组是针对某个特定主机a1进行的设置,这个主机被限定为以太网地址为hardware ethernet 参数值的计算机,将给这个计算机分配一个固定地址。这种分配方式实际等价于固定地址分配方式,唯一的好处就是能够对IP地址进行集中管理,不必每个计算机分别设置了。这里同样也可以使用option参数,设置TCP/IP的参数 。
dhcpdconf中还能有更多的组,包括对非本网段的子网上的客户机指定的组。
当设置了dhcpdconf之后,就能启动dhcpd守护进程了,由于计算机会有多个网络界面,需要指定dhcpd 服务器的网络界面,以便回应相应界面上的DHCP请求。
1 # /usr/local/sbin/dhcpd fxp0
在调试阶段,可以使用-d参数,这样dhcpd就不会进入后台运行,而一直保留在前台,并显示各个与客户计算机通信的过程。当一切都调试完毕之后,就能去除-d参数,并将执行命令放入rclocal启动脚本中,以便系统能够自动执行。
此后,dhcpd正常运行的时候,会将每一次客户请求及其回应的IP地址分配的记录,都记录在/var/run/dhcpdleases 文件中。为了使dhcpd能正常进行日志记录,应该在启动dhcpd之前使用touch 命令,生成一个新的日志文件。以后就可以查看这个日志文件的内容,以得到当前DHCP服务器的状态和客户机IP地址分 配的情况。以下是一个日志文件的部分内容。
1 lease 192168311 {
2 starts 3 1998/11/26 05:46:28;
3 ends 4 1998/11/27 05:46:28;
4 hardware ethernet 0:80:c2:12:fd:d;
5 uid 1:0:80:c2:12:fd:d;
6 }
touch命令的优点是在存在相关的文件时,不删除或更改文件内容,只更新其访问时间设置,只有在文 件不存在时才生成新文件。
然后就能设置网络中的客户计算机使用DHCP协议,获取合法的IP地址了。通常Windows计算机的TCP/IP设置 中能直接设置支持DHCP协议,如果为Unix(包括FreeBSD)设置DHCP客户软件,就需要dhclient的支持。
设置客户软件
ISC-DHCP中同样也提供了一个客户程序dhclient,用于FreeBSD系统从DHCP服务器上动态获取一个IP地 址。这个程序同样也要求内核支持bpfilter伪设备。
dhclient使用的配置文件为/etc/dhclientconf,然而最一般的情况下可以不使用它,软件本身的缺省配置就满足一般情况下请求IP地址的需要了。缺省设置下dhclient在获得了IP地址之后,会自动执行/etc/dhclient-script 这个脚本程序,以针对刚获取的动态IP地址进行必要的设置。很多依赖于IP地址的网络服务,就可以在这个脚 本中启动,或者针对重新分配的动态IP地址对已有的网络服务进行修正。虽然使用者也许不希望使用这个脚本 设置网络,但如果不存在这个脚本程序,或者这个程序不可执行,那么dhclient就不能正常执行。
因此对于最一般的客户机,一般只连接到一个网络上,仅具备一个网络界面,可以使用一个空的dhclientconf 和空的declient-script文件,就能完成设置IP地址和其他TCP/IP参数的任务了。
1 # touch /etc/dhclientconf
2 # touch /etc/dhclient-script
3 # chmod +x /etc/dhclient-script
4 # /usr/local/sbin/dhclient fxp0
5
6 Listening on BPF/fxp0/00:90:27:4e:92:09/unattached
7 Sending on BPF/fxp0/00:90:27:4e:92:09/unattached
8 Sending on Socket/fallback/fallback-net
9 DHCPDISCOVER on fxp0 to 255255255255 port 67 interval 22
10 DHCPOFFER from 19216831
11 DHCPREQUEST on fxp0 to 255255255255 port 67
12 DHCPACK from 19216831
13 bound to 192168332 -- renewal in 3600 seconds
在更复杂的情况下,就要指定更多的内容,例如当系统有多个网卡时,要指定dhclient应该从哪个子网中获 得IP地址设置,就需要使用设置文件dhclientconf。一般除非有多个局域网网络界面,都应该使用空设置文件, 避免产生配置错误。以下为一个简单的dhclientconf的例子,可以用于多网络界面的情况:
1 # Defaults
2 timeout 60;
3 reboot 10;
4 retry 60;
5 select-timeout 5;
6 initial-interval 2;
7 script "/etc/dhclient-script";
8 interface "fxp0" {
9 request subnet-mask, broadcast-address, routers, domain-name-servers,
10 domain-name, host-name;
11 require domain-name-servers;
12 }
这个设置文件主要用于重新定义一些参数,比较容易理解,更改也比较容易。
成功的手工执行dhclient之后,就可以考虑将其和系统启动文件相结合了。因为很多网络服务是依赖于网络 配置的,应该在启动这些网络服务之前使用DHCP配置好TCP/IP。使用dhclient-script启动服务的想法虽然也能解决问题,然而这就不能使用系统的启动rc文件中的相关设置启动网络服务,而在这个dhclient-script 中重新启动,因此比较麻烦。更简便的做法是仅仅在dhclient-script中设置hostname, 而让系统启动文件完成其他网络服务的启动。这样就要求将dhclient与系统rc文件结合起来。
1 #hostname="mydomainname"
2 network_interfaces="fxp0 lo0"
3 # List of network interfaces (lo0 is loopback)
4 ifconfig_lo0="inet 127001"
5 # default loopback device configuration
6 #ifconfig_fxp0="inet 192168312 netmask 2552552550"
7 defaultrouter="NO"
8 # Set to default gateway (or NO)
这样就需要更改rcconf文件,更改一些设置语句。首先要注释hostname设置,而在dhclientscript中进行设置,也不必设置defaultrouter,它通过DHCP协议自动设置。同时要保证netwo
如果想实现静态分配ip地址的,需要创建静态ip地址池。需要创建很多,但这个和绑定是分开执行的,也就是说,ip+mac的绑定你也需要重新设置一下。很不方便。
我建议使用dhcp 中的dhcp 安全功能,将分配出去的ip地址和mac地址自动绑定,实现能够访问网络。具体命令可参见s55的手册。
广东省DHC专柜的详细地址如下:(全部)
广州市
广州北京路店 地址:广州市越秀区北京路325号动感328商场首层A01铺
广州中华广场店 地址:广州市中山三路33号中华广场首层1001-1002A铺
广州番禺易发店 地址:广州市番禺区市桥街大北路易发商业街西街首层130号
广州花都金城店 地址:广州市花都区秀全大道31号金城广场一层OJ2店铺
广州恒宝华庭店 地址:广州市荔湾区宝华路133号恒宝广场1楼140-142
广州岗顶摩登店 地址:广州市天河区天河路611号摩登百货1楼
广州五月花广场店 地址:广州市越秀区中山五路68号五月花商业广场首层115号商铺
广州天河又一城店 地址:广州市天河区体育西路人防南段天河又一城原潮区OJE02铺
深圳市
深圳东门店 地址:深圳市罗湖区东门解放路1018号(德奥商场)
深圳金光华店 地址:深圳市罗湖区人民南路2028号金光华广场B2-001号单元
深圳深南茂业店 地址:深圳市福田区深南路茂业百货1楼
深圳东门茂业店 地址:深圳市罗湖区东门中路2047号东门茂业百货1楼
深圳创业天虹店 地址:深圳市宝安44区创业一路1018号天虹百货1楼
深圳沙井天虹店 地址:深圳市宝安区中心路与创新路交汇处天虹百货1楼
深圳南山海雅店 地址:深圳市南山区南海大道2746号海雅百货1楼
深圳南山花园城店 地址:深圳市南山区南海大道1090号紫荆城1楼
深圳华强北茂业店 地址:深圳市福田区华强北路2005-2006号华强北茂业百货1楼
中山市
中山假日广场店 地址:广东省中山市石歧区兴中道6号假日广场1楼东门B118铺
江门市
江门地王广场店 地址:江门市蓬江区胜利路28号地王广场1080-1081铺
佛山市
佛山南海广场店 地址:佛山市南海区南海大道北49号南海广场地下一层G-2B
佛山兴华商场店 地址:佛山市禅城区祖庙路42号之一兴华商场一楼1B12专柜
佛山三水广场店 地址:佛山市三水区张边路9号三水广场1633号
佛山顺德天佑城店 地址:佛山市顺德区容桂红星桂洲大道中63号天佑城A023
东莞市
东莞东城天虹店 地址:东莞市东城区东纵大道愉景威尼斯广场天虹商场1楼
东莞长安怡安店 地址:东莞市长安镇长盛长青南路303号2区地王广场1楼
东莞常平天虹店 地址:东莞市常平镇常平大道南埔路口金汇大厦天虹商场1楼
东莞樟木头天和店 地址:东莞市樟木头镇永宁路樟罗商贸城天和百货1楼
东莞南城嘉信茂店 地址:东莞市南城区鸿福路90号嘉信茂广场1楼
东莞天和百货西城店 地址:东莞市莞城区西正路西城楼文化广场天和百货2楼
湛江市
广东湛江广百店 地址:湛江市霞山区海滨大道南18号广百鑫海名店
珠海市
广东珠海百货店 地址:珠海市吉大景山路222号珠海百货广场1楼
广东珠海茂业店 地址:珠海市香洲区紫荆路301号珠海茂业百货1楼
惠州市
广东惠州西湖丽日店 地址:惠州市惠城区环城西二路5号1楼
广东惠州港惠新天地店 地址:惠州市惠城区演达一路港惠新天地购物中心1楼1137A
广东惠州数码商业街店 地址:惠州市惠城区横江三路数码商业街北段C区N-152 号
增城市
广东增城新都汇店 地址:增城市新塘区荔新公路国际贸易中心新都汇名店城
汕头市
汕头百盛店 地址:汕头市长平路中段南国商场东侧百盛百货1楼
欢迎分享,转载请注明来源:品搜搜测评网