DHCP mini-HOWTO (DHCPd/DHCPcd) 作者:Vladimir Vuksan, vuksan@veus.hr 译者: 蒋大伟, dawei@sinica.edu.tw 版本/发行日期:v4.2, 11 June 1999 _________________________________________________________________ 这份文件主要在解答各位,如何把你的 Linux 机器设定成 DHCP 伺服器或 DHCP 用户端,一些基本的问题。 _________________________________________________________________ 1. 介绍 * 1.1 免责声明 * 1.2 如何取得这份文件的最新版本 * 1.3 回馈 * 1.4 供献者 * 1.5 版权声明 2. DHCP 通讯协定 3. 设定用户端 * 3.1 下载用户端的监控程式 * 3.2 安装在 Slackware 之上 * 3.3 安装在 RedHat 5.x 和 RedHat 6.x 之上 * 3.4 在 RedHat 4.x 与 Caldera OpenLinux 1.1 上的设定 * 3.5 安装在 Debian 之上 * 3.6 在 LinuxPPC 与 MkLinux 上的设定 * 3.7 “记号环”(Token Ring)网路 * 3.8 最後,请完成以下的动作 * 3.9 其它注意事项 * 3.10 疑难排除 4. 设定 DHCP 伺服器 * 4.1 UNIX 上的 DHCP 伺服器 * 4.2 设定网路组态。 * 4.3 DHCPd 的选项设定 * 4.4 启动伺服器 _________________________________________________________________ 1. 介绍 1.1 免责声明 这份文件的内容不接受任何赔偿要求。引用这份文件的概念、例子、以及其他的 内容 时,各位要自己承担风险。由於这是一份新出版的文件,所以可能会有些错 误以及不 正确的地方,因此,当然可能对你的系统造成危害。虽然,灾难不太可 能发生,但还 是请小心为上,出了事我一概不负任何责任。 同时,也请你铭记在心,这份文件所提供的内容并 不是 正式的资讯。这份 文件 的内容,有许多都是假设出来的,看起来好像能运作,但未必可以。引用时,各 位 要自己承担风险。 1.2 如何取得这份文件的最新版本 这份文件的最新版本会定期地张贴在 comp.os.linux.answers 的新闻论坛上。 它也会被放置在各个储存这类资讯的匿名 FTP 站台上,例如: [1]ftp://metalab.unc.edu/pub/Linux/docs/HOWTO 此外,你通常可以在 Linux 文件计划的网页上找到这份文件,请参考网址: [2]http://metalab.unc.edu/LDP/ 这份文件的中文版翻译,请参考网址: [3]http://www.linux.org.tw/CLDP/mini/DHCP.html 我在此正式授予翻译权给凡是要将本文件翻译成自己本国语言的任何人。条件是 你必须将 该翻译版本的链结位址提供给我。 1.3 回馈 凡是对这份文件所作的任何回馈都非常欢迎。没有您的付出和参与,这份文件将 不会 呈现在众人的面前。所以,请将您的建议、批评、和指教寄至 vuksan@veus.hr。 1.4 供献者 这份文件最初是修改自 Paul Makeev 所撰写的版本而来的。 其他对这份文件有过供献的朋友,列举如下: * Heiko Schlittermann * Jonathan Smith * Dan Khabaza * Hal Sadofsky * Henrik Stoerner * Paul Rossington 1.5 版权声明 这份文件自 1998 开始的版权属於 Vladimir Vuksan 所有,并请按照以下规定来 流通: * Linux HOWTO 文件的全部或部分,可以使用任何物理或电子的媒体形式来复 制 与流通,只要这个版权声明被保留在每份拷贝中。商业行为的再流通是被 允许而且受欢 迎的;但是,任何的流通行为,作者都希望能被告知。 * 所有翻译、衍生的工作、或合并任何 Linux HOWTO 文件的聚集工作,都必须 受 到这个版权声明的保护。也就是说,你不可以从 HOWTO 衍生出一份文件 ,然後对这份 衍生文件的流通强加上其他限制条件。除非在一些特定的状况 下,才会允诺这些限制 条件;请联络 Linux HOWTO 的协调人,他的地址如 下: * 如果你有任何疑问,请联络 Linux HOWTO 的协调人 [4]linux-howto@metalab.unc.edu 2. DHCP 通讯协定 DHCP 就是“动态主机设定协定”(Dynamic Host Configuration Protocol)的简 写。DHCP 的 主要用途是:透过伺服器的协助来控管各个主机(执行中的用户端 )上不可缺少的网路 连线参数。DHCP 协定向後相容 BOOTP 这个通讯协定。更进 一步的资讯请参考 RFC 2131 的标准( RFC 1531 是旧标准)以及其它相关资料 。(请参考该文件末尾,参考资料来源 的部分)。你也可以参阅: [5]DHCP FAQ (http://web.syr.edu/ jmwobus/comfaqs/dhcp.faq.html)。 这份文件将会为各位说明 DHCP 伺服器端的“监控程式”(daemon)和用户端的监 控程式。多 数人在工作站上会需要用到户端的监控程式,以便从远端的伺服器上 取得网路设定资讯。而 系统管理员则会使用伺服器端的监控程式,以便散布网路 设定资讯给用户端来取用,所以,i 如果你只是个一般的使用者,那麽你将会需 要用户端的监控程式。 3. 设定用户端 3.1 下载用户端的监控程式 核心 2.0.x 不论你使用的是哪一种 Linux 的发行版本,你都必需下载用户端的监控程式。你 所需要 下载的程式套件称为 dhcpcd ,目前的版本编号是 0.70。你可在 [6]此 处 阅读到这个套件的内容说明。 (ftp://metalab.unc.edu/pub/Linux/system/network/daemons/dhcpcd-0.70.ls m) 核心 2.2.x 由於在核心 2.1.x 和 2.2.x 中 ipv4 的网路程式套件曾被修改过(例如,它会 在许多 栏位设定预设值)dhcpcd 无法正常运作。除非你使用的是 RedHat 6.x( 它目前提供了 dhcpcd 1.3.x 和 2.2.x 的核心)否则你就必须下载另一个版本的 dhcpcd(即 1.3.x) 来使用,这是 Sergei Viznyuk sergei@phystech.com 为了 避免上述问题所 修改的版本。你可以在以下几个地方取得: * [7]ftp://phystech.dyn.ml.org/pub/ * [8]http://www.cps.msu.edu/~dunham/out/dhcpcd-1.3.6.tar.gz 接下来所做的说明都是以此为基本的原则。 3.2 安装在 Slackware 之上 你可以从任何 Metalab 的“镜射”(mirror)站台或以下几个地方,下载最新的 DHCPcd 程式套件: * [9]ftp://ftp.cdrom.com/pub/linux/metalab/system/network/daemons/ * [10]ftp://metalab.unc.edu/pub/Linux/system/network/daemons * [11]ftp://ftp.kobe-u.ac.jp/pub/PC-UNIX/Linux/network/dhcp (主站台 在日本) 下载最新版本的 dhcpcd.tar.gz 最新版本 * 将 dhcpcd.tar.gz 解开 tar -zxvf dhcpcd-0.70.tar.gz * 切换至套件解开後的子目录里,并编译 dhcpcd 程式 cd dhcpcd-0.70 make * 安装套件 (你必须以 root 的身份执行以下的命令) make install 这个命令会建立 /etc/dhcpc 这个子目录,DHCPcd 套件会把 DHCP 的资讯储存在 该处, 并且将 dhcpcd 程式档复制到 /usr/sbin 这个子目录里。 为能够在开机时,系统设定初值期间,使用 DHCP 的功能,请做如下的设定: cd /etc/rc.d mv rc.inet1 rc.inet1.OLD 上面的动作会将旧有的网路初值设定“命令稿”(script)移转至 rc.inet1.OLD 。接下来, 你必须建立新的 rc.inet1 命令稿。下面的程式码包含了必需的设定 内容: _________________________________________________________________ #!/bin/sh # # rc.inet1 这个 shell 的命令稿会在开机时处理 INET 系统的基本设定。 HOSTNAME=`cat /etc/HOSTNAME` # 这个命令或许不是必需的,但是我还是 # 将它保留了下来。 # 附接上 loopback(绕回)装置。 /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo # 若你有乙太网路的连线,则使用下面的命令来设定 eth0 界面。 # 若你只有 loopback 或 SLIP 的连线,则不要在这个档案里使用下面的命令。 /usr/sbin/dhcpcd _________________________________________________________________ 存档案之後请将电脑重新开机。 当你完成以上的动作後,请跳至 [12]最後的步骤 3.3 安装在 RedHat 5.x 和 RedHat 6.x 之上 DHCPcd 的设定在 RedHat 5.0 与以上的版本其实很容易。你所要作的事情,就是 启动 “控制台”(Control Panel),请输入 control-panel * 选取 Network Configuration 的图像 * 以滑鼠单击 Interfaces 栏标 * 以滑鼠单击 Add 按钮 * 选用 Ethernet 项目 * 在 Edit Ethernet/Bus Interface 对话框中勾选 "Activate interface at boot time" 项目以及选取 DHCP 做为 Interface configuration protocol 项目的 输入。 当你完成以上的动作後,请跳至 [13]最後的步骤 3.4 在 RedHat 4.x 与 Caldera OpenLinux 1.1 上的设定 DHCPcd 在标准的 RedHat 版本中是以 RPM 的包装方式来发行的,你可以在其所 发行的 CD-ROM 上的 RPMS 目录中找到它,或到下面的网址下载: [14]ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd -0.6-2.i386.rpm 然後安装它,如下所示: rpm -i dhcpcd-0.6-2.i386.rpm 或者,你可以按照 Slackware 那节所描述的方法,编译一个属於你自己的版本。 感谢 nothing nothing@cc.gatech.edu 提供以下的资讯给我 _________________________________________________________________ 我把静态的 ip 位址或网域名称,从档案 /etc/resolv.conf 中移除。但是,我留下了 search 和 nameserver 的设定行(因为某些原因我的 dhcpcd 伺服器不会产生档案 /etc/dhcpc/resol.conf,所以我必须使用静态的 /etc/resolv.conf)。 在档案 /etc/sysconfig/network 里,我移除了 HOSTNAME 与 GATEWAY 的设定行。但是, 我保留了其它的设定行(NETWORKING、DOMAINNAME、GATEWAYDEV)。 在档案 /etc/sysconfig/network-scripts/ifcfg-eth0 里,我移除了 IPADDR、NETMASK、 NETWORK、和 BROADCAST 等设定行。但是,我保留了 DEVICE 和 ONBOOT 的设定行,并将 BOOTPROTO 的设定行,修改成 BOOTPROTO=dhcp。 最後储存档案,并将电脑重新开机。 _________________________________________________________________ 当你完成以上的动作後,请跳至 [15]最後的步骤 3.5 安装在 Debian 之上 你可以在下面的网址找到以 deb 方式包装的 DHCPcd 程式套件: [16]ftp://ftp.debian.org/debian/dists/slink/main/binary-i386/net/dhcpc d_0.70-4.deb 或者,你可以按照 Slackware 那节所描述的方法来安装。 要安装这个 deb 包装的程式套件,请输入: dpkg -i /where/ever/your/debian/packages/are/dhcpd*deb 你几乎不必做任何的 DHCPcd 设定,因为: From: Heiko Schlittermann (heiko@os.inf.tu-dresden.de) 这个 dhcpcd 的程式套件如同其它的 debian 套件一样,会将启动命令稿安装在 /etc/init.d/ 之上,此处为 /etc/init.d/dhcpcd,并将 之链结 到各个 /etc/rc?.d/ 目录中。 在 /etc/rc?.d/ 目录中所存放的各类档案,是开机时所执行的命令稿。 如果你在安装後不想重新开机,你应该考虑使用人工启动“监控程式”(daemon) 的方式: /etc/init.d/dhcpcd start 当你完成以上的动作後,请跳至 [17]最後的步骤 3.6 在 LinuxPPC 与 MkLinux 上的设定 下面这节是 R. Shapiro 撰写的。 由 Yoichi Hariguchi 所发展的版本 0.65 和 0.7 的 dhcpcd 程式应该可以在使 用核心 2.1.24 的 LinuxPPC 与 MkLinux 上正常执行,但是,你必须注意以下几 个要点: * 如果你想要或需要,透过原始程式码来建立可执行的档案,请注意,ppc linux 上的 编译器会将 'char' 假定为 'unsigned char',但是,Hariguchi 的 原始程式码确将 'char' 假定为 'signed char'。所以,要透过原始程式码来产 生执行档,你必须编辑 Makefile,让 CFLAGS 中包含 "-fsigned-char" 这个选 项。 * 目前 linuxppc [就是所谓的 linux-pmac] 平台上最稳定的版本是 2.1.24,需 要的话 可到下面的网址取得 dhcpcd 的修正码: [18]2.1 版的修正码 (http://www.cro.net/ vuksan/dhcppatch)。 mklinux 平台上所发行的 DR2.1 和 DR3.0 这两个版本,采用的是 2.0 的核心 (2.0.33) ,所以,不必使用这个 修正码,但是,即使安装了这个修正码也没有什麽伤害。请注意 ,linuxppc 安 装光碟片上 dhcpcd 程式的 rpm 包装里,并不包含这个 2.1 修正码,因此 ,它 在 linuxppc 平台上无法正常运作,反倒是,可以在 mklinux 平台上正常执行。 * 当我们使用 linuxppc 平台的 2.1.24 核心时,在 dhcpcd 程式启动之後,你 会看到 一个简短的路由器警告讯息。你可以忽略它。 * Hariguchi 的 dhcpcd 程式会花一些时间,大约是 30 秒,来完成它初次连接 伺服器和 设定路由的动作。当我们使用的是 linuxppc 平台的 2.1.24 核心时, 上述的警告讯息, 只是在说明,路由已经设定完成了。 对於比较新版的 linuxppc 核心而言,由 Hariguchi 所发展的 dhcpcd 程式都无 法使用 :此时你 必须 改采 Sergei Viznyuk 所发展的版本(目前的发行版本为 1.3.9 )。麻烦的是 Viznyuk 的 dhcpcd 程式是以 glibc 2 为函式库来发展的 ,然而 linuxppc 2.1.1xx 却不使用这个函式库。结果,编译程式需要用到一些 技巧 - 相关的细节请与我 联络。一旦程式编译好之後,它就能够在较新版的核 心上正常运作了(在 linuxppc 的 2.1.24 版本或 MkLinux 的部分版本上还是不 行)。 现在我们来讨论 Viznyuk 所发展的 dhcpcd 程式,我手上有一个 Viznyuk 版的 dhcpcd (v1.3.7)执行档,可以在最近发行的 linuxppc 核心:2.1.102、103 、115、和 119,上 执行,并且已经完成测试。你应该可以透过原始程式码来产 生执行档,但是,我不知道实际 的细节。Viznyuk 版的 dhcpcd 无法在 2.1.24 的核心上运作,然而修补过的 Hariguchi 版的 dhcpcd 程式却可以正常使用。要 编译 Hariguchi 版的 dhcpcd 程式就容易多了。 摘要整理如下: _________________________________________________________________ MkLinux: Hariguchi: 可用; Viznyuk: 不可用 2.1.24: Hariguchi: 如果修正过,可以正常使用(产生执行档很容易); Viznyuk: 不可用 2.1.102+: Hariguchi: 不可用; Viznyuk: 可用(产生执行档需要技巧) _________________________________________________________________ 请注意,Viznyuk 版的 dhcpcd 会把资料直接写到 /etc/resolv.conf 里(写入 之前会先 备份旧有的档案),因此你不必再自己从 /etc/dhcpc 复制或链结相关 的资讯。同时也请 注意它通常会把执行档放到 /sbin 目录中而不是放到 /usr/sbin 里,所以它的命令列选 项与 Hariguchi 版本之间会有一点不同。若 你使用 ifup 来启动 dhcpcd ,则 ifup 这个 命令稿也必须做一些小的修正。 若你想要取得给 linuxppc 使用的预先编译好之 dhcpcd 程式,请寄信到 [19]reshapiro@mediaone.net。 我也提供了二元码的 RPMs 包装档: [20]ftp://ftp.linuxppc.org//pub/linuxppc/contrib/linuxppc-R4/RPMS/ 请不要使用该目录之下的 dhcpcd-1.3.8-2.ppc.rpm 档案,它已经停止维护了。 可靠的版 本是 dhcpcd-0.70-0.ppc.rpm(给 linuxppc 2.1.24 使用的)以及 dhcpcd-1.3.8-3.ppc.rpm (给 linuxppc 2.1.102 和以上的版本使用的)。版本 1.3.9 的 rpm 包装档近期内应该 会提供出来。同时我还依照版本 0.65 和 0.70(由 Hariguchi 所发展)的方式对版本 1.3.9 (由 Viznyuk 所发展) 做 了一些修改(就是 附加上 -c 的命令列选项)。(请注意,标 准的 Viznyuk dhcpcd 并不包含这样的内容。) 3.7 “记号环”(Token Ring)网路 若你尝试在“记号环”网路上执行 dhcpcd 程式,将无法正常运作。以下是 Henrik Stoerner (henrik_stoerner@olicom.dk) 提供给我的解决方案。 问题出在 dhcpcd 只认识“乙太网路”( Ethernet)卡。若它发现到“记号环” 网路卡 ,则它会拒绝做任何的事情,并且报告说“界面不是乙太网路”。 解决方案就是使用一个简单的修正码来变更 dhcpcd 的原始程式码。我已经将此 修正码 放在一个小型的网页上,并提供 RedHat 的 RPM 包装档和一个预先编译 好的二元档: [21]http://eolicom.olicom.dk/~storner/dhcp/ 这个修正码已经送到了 dhcpcd 的维护者手上了,因此,它有希望被未来发行的 dhcpcd 版本所采用。 3.8 最後,请完成以下的动作 在你的机器重新开机之後,你应该设定网路的界面。请输入: ifconfig 你应该会看到如下的内容 _________________________________________________________________ lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:302 errors:0 dropped:0 overruns:0 frame:0 TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0 eth0 Link encap:Ethernet HWaddr 00:20:AF:EE:05:45 inet addr:24.128.53.102 Bcast:24.128.53.255 Mask:255.255.254.0 ^^^^^^^^^^^^^^^^^^^^^^^ UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24783 errors:1 dropped:1 overruns:0 frame:1 TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96 Interrupt:10 Base address:0x300 _________________________________________________________________ 如果,你在 inet addr 之後看到一些正常的数字,这表示你已经设定好了。如果 ,你看到 的是 0.0.0.0 也不要绝望,它只是 dhcpcd 在取得 IP 位址前暂时的 设定值。如果,过了 几分钟之後,你仍然看到 0.0.0.0 ,请参考 [22]疑难排除 。DHCPcd 是一个“监控程式”(daemon),所以只要你的机器还活著,它将会持续 保持执行 的状态。它每三小时会与 DHCP 伺服器再联络一次,尝试续约 IP 位址 的租期。它会将所 有的讯息记录在 syslog 档案中(在 Slackware 上,为 /var/adm/syslog;在 RedHat/OpenLinux 上,为 /var/log/syslog)。 最後要做一件事。你必须指定名称伺服器。有两个方式可以完成这个步骤,你可 以要求网路 服务供应商,告知名称伺服器的 IP 位址,然後再将此位址填入 /etc/resolv.conf 档中 ,或者,你也可以让 DHCPcd 从 DHCP 伺服器取得资料 ,然後在 /etc/dhcpc 目录下产生 档案 resolv.conf。我决定使用 DHCPcd 来产 生档案 resolv.conf 的内容,方法如下: 备份旧的 /etc/resolv.conf 档案 mv /etc/resolv.conf /etc/resolv.conf.OLD 如果目录 /etc/dhcpc 不存在,你可以自行产生此目录 mkdir /etc/dhcpc 然候将 /etc/resolv.conf 以“符号链结”至 /etc/dhcpc/resolv.conf ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf 如果这个方式无法正常运作,请尝试使用下面的方法 (下面这个修正方法是 nothing@cc.gatech.edu 所建议的,其内容修改自 Henrik Stoerner 所提供的修 正方法) 我还必须执行下面这个步骤,只因为我的 dhcpcd 不会产生档案 /etc/dhcpc/resolv.conf 。我在 /etc/sysconfig/network-scripts/ifup 档案 中,做了以下的修改(虽然改的不是 很好,但是它已经可以为我解决这个问题了 ): _________________________________________________________________ elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE} echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^ echo "failed." exit 1 _________________________________________________________________ 我把它修改成: _________________________________________________________________ elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^^^ echo "failed." exit 1 _________________________________________________________________ 注意 ! (bang) 这个符号 if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; 总算大功告成,可以坐下来享受成果了 :-)。 3.9 其它注意事项 以下的步骤不是绝对必要,但是对某些人而言,可能就派得上用场。 a) 如果,你只是偶尔才会有网路连线的需求,你可以使用命令列的方式来启动 dhcpcd(要完成这个步骤,你必须拥有 root 的身份): /usr/sbin/dhcpcd 当你想要关掉网路,请输入 /usr/sbin/dhcpcd -k 3.10 疑难排除 如果,你按照了上述的步骤,却仍然无法存取网路,很可能是因为: I. 你的网路卡设定不正确。 在开机的过程中,你机器将会侦测你的网路卡,并且应该会显示下面几行的讯息 内容: _________________________________________________________________ eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov _________________________________________________________________ 如果,你的 Linux 系统不会出现上面这个讯息,这表示,你的网路卡可能无法被 辨识。假 使,你使用的是一般的乙太网路卡(NE2000 相容),你应该会拿到一 片 DOS 工具磁片,你 可以用它来设定网路卡。尝试设定各个 IRQs 值,一直到 Linux 可以辨识到你的网路卡( IRQ 的值设定通常为 9,10,12)。 II. 所使用的 DHCP 伺服器支援 RFC 1541 标准/我的 DHCP 伺服器是 Windows NT 尝试执行 dhcpcd ,请输入 dhcpcd -r 使用 ifconfig 来检查看看,是否你的网路界面已经设定好了(最初你所看到的 是 Inet.addr=0.0.0.0,你得等待几秒的设定时间)。 如果这个方法可以解决你的问题,则你应该在相关的开机命令稿中加上 "-r" 选 项,譬如 将 /sbin/dhcpcd 修改成 /sbin/dhcpcd -r 。 以 RedHat 为例,你必须编辑 /etc/sysconfig/network-scripts/ifup 这个命令 稿,并 将它修改成: _________________________________________________________________ IFNAME=$[ {DEVICE} \ "/sbin/dhcpcd -r -c /etc/"- etc etc. _________________________________________________________________ III. 在开机期间会产生错误讯息 "Using DHCP for eth0 ... failed",但是, 系统 却能正常运作。 你很可能使用的是 RedHat 的系统,而且,你并未仔细地按照说明操作 :-)。你 在 if 叙述 中遗漏了 ! (bang) 这个符号。跳到 [23]此处 ,检视如何来修正 它。 IV. 我的网路卡运作了几分钟之後,便没有反应了。 可能是 gated(“闸道监控程式”(gateway daemon)) 所回报的资讯,弄乱了 Linux 主机的路由,才会造成这样的问题。检查是否 gated 正在执行中: ps -auxww | grep gate 如果真的是这样,你可以使用 RedHat 的 RPM 管理程式将它移除,或是手动将它 从 /etc/rc.d/ 中移除。 V.在开机时可以辨识到我的乙太网路卡,但是,在我的讯息记录中,仍然会出现 "NO DHCPOFFER" 的讯息。同时,这个状况也会发生在我的 PCMCIA 乙太网路卡上 。 你必须确定,网路卡使用的是 10BaseT 连接埠(就像电话线的插座)。你最好检 查一下, 开机时网路卡的设定,到底是使用那个连接埠。例如: _________________________________________________________________ eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. ^^^^^^^^^^^^ 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov _________________________________________________________________ 我曾听过使用膝上型电脑的人抱怨,他们使用 PCMCIA 工具(特别是 ifport)将 连接埠设 定为 10Base2 (“细同轴线网路”(thinnet)),也会有这样的问题。 如果你不想重新设定 网路卡和重开机。你必须确定你使用的是 10BaseT 的连线 。 VI. 没有伺服器回应我 DHCP 用户端的广播要求(由 Peter Amstutz 提供) 在某些系统上,你的广播要求中必须包含你机器的主机名称。以 dhcpcd 为例, 你可以执行 'dhcpcd -h foohost'。或许,你可以使用你在网路上的帐户名称, 来做为该主机名称。 VII. 我已经按照所有的步骤完成了设定,但是,我的机器仍然无法连线。 “缆线数据机”(cable modem)通常会记住你网路卡的乙太网路位址,所以,若 你要连接 新的电脑或更换网路卡,你必须以某种方法来“教导”你的 cable modem 认得新的电脑/网路 卡。通常你可以先关掉 cable modem ,电脑开机後再 使用 cable modem,或是以电话请求 技术的支援,告知对方你的电脑已经更换了 网路卡。 你的防火墙规则(ipfwadm 的规则)不允许埠编号 67/68( DHCP 使用来散布设 定资讯) 的流量。请仔细检查你的防火墙规则。 VIII. 我使用的是 MediaOne Express 所提供的服务,但是我仍然无法连线。 原因可能是 MediaOne 在 DHCP 中附加了不应该出现的讯息。一般相信,如今这 已不再 是个问题,但是你却无法使用它,你可以朝这方面来检查。如果你(不) 幸使用的是 Windows NT,此时,如果你使用“事件检视器”(Event Viewer), 你将会看到如下的 警示讯息。 DHCP 接收到一个未知的长度为 005 的 067 选项。原始的选项资料如下所示。 0000: 62 61 73 69 63 basic 如果你遇到这样的问题,请到 [24]ftp://vanbuer.ddns.org/pub/ 下载修正 的 二元码或取得原始码。 4. 设定 DHCP 伺服器 4.1 UNIX 上的 DHCP 伺服器 在各种 UNIX 相容的作业系统上,有许多商业或免费的 DHCP 伺服器程式可用。 其中, 较著名的免费伺服器程式是 Paul Vixie/ISC 版的 DHCPd。目前最新的版 本是 2.0( 建议大家使用),而 3.0 版正在做 beta 阶段的测试。你可以到下 面的网址取得: [25]ftp://ftp.isc.org/isc/dhcp/ 在 RedHat(版本 5.2)这个 Linux 套件中包含了有 DHCP 伺服器二元码的 RPM 包装。 该 RPM 包装的档名为 dhcp-2.0b1pl6-2.platform.rpm。安装时只要输入 rpm -i dhcp-2.0b1pl6-2.i386.rpm 若你使用上面的步骤,则你可以跳过下面的安装说明。 在你下载之後,你必须将它解开。然後进入解开的目录,输入: ./configure 要做好安装前的设定工作,可能要花点时间。请随後输入: make 以及 make install 4.2 设定网路组态。 当完成安装之後,请输入 ifconfig -a,你将看到如下的讯息: _________________________________________________________________ eth0 Link encap:10Mbps Ethernet HWaddr 00:C0:4F:D3:C4:62 inet addr:183.217.19.43 Bcast:183.217.19.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2875542 errors:0 dropped:0 overruns:0 TX packets:218647 errors:0 dropped:0 overruns:0 Interrupt:11 Base address:0x210 _________________________________________________________________ 如果未显示 MULTICAST 的讯息,你应该重新设定你的核心,加入对“多址传播” (multicast)的支援。对於大多数的系统而言,你几乎都不必如此做。 下个步骤是,加入 255.255.255.255 的路由。以下的说明引述自 DHCPd 程式的 “读我档案”(README): “为了让 dhcpd 能够正确地服务过分挑剔的 DHCP 用户端(例如,Windows 95) ,dhcpd 必须能够送封包到 255.255.255.255 的 IP 位址上。不幸的是,Linux 会将 255.255.255.255 做为本地子网路的广播位址(此处为 192.5.5.223)。这 将违反 DHCP 通讯协定,然而许多 DHCP 用户端并不受影响,有些(例如,所有 Microsoft DHCP 用户端)却会。有此类问题 的用户端,将会看不到来自伺服器 的 DHCPOFFER 讯息。” 输入: route add -host 255.255.255.255 dev eth0 如果你看到如下的讯息 "255.255.255.255: Unknown host" 你应该将下面的资讯加入到 /etc/hosts 档案中: /etc/hosts file: 255.255.255.255 all-ones 然後,输入: route add -host all-ones dev eth0 或 route add 255.255.255.0 dev eth0 eth0 应该是你目前使用网路卡的装置名称。如果不是,你得配合实际情况做正确 的修改。 4.3 DHCPd 的选项设定 现在,你必须设定 DHCPd。为此,你必须产生或编辑 /etc/dhcpd.conf。 通常你所要做的是,随机地指派 IP 位址。为此,你必须按照下面的方式来设定 : _________________________________________________________________ default-lease-time 600; max-lease-time 7200; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; option routers 192.168.1.254; option domain-name-servers 192.168.1.1, 192.168.1.2; option domain-name "mydomain.org"; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.10 192.168.1.100; range 192.168.1.150 192.168.1.200; } _________________________________________________________________ 设定的结果为,DHCP 伺服器会提供用户端,使用□围 192.168.1.10-192.168.1.100 或 192.168.1.150-192.168.1.200 的 IP 位址。 如果,用户端没有特别约定 IP 位址的租用 时间,则释出时间预定为 600 秒, 要不然,最大(允许)的释出时间为 7200 秒。同时 伺服器也会“通知”用户端 ,要求它使用 255.255.255.0 做为子网路遮罩,192.168.1.255 做为广播位址 ,192.168.1.254 做为路由/闸道器,并以 192.168.1.2 做为 DNS 伺服器。 你也可以依据用户端的乙太网路位址,来指派特定的 IP 位址给用户端,例如 _________________________________________________________________ host haagen { hardware ethernet 08:00:2b:4c:59:23; fixed-address 192.168.1.222; } _________________________________________________________________ 这个设定将会指派 IP 位址 192.168.1.222 给乙太网路位址为 08:00:2b:4c:59:23 的 用户端。 网路上 IP 位址的指定,可以采混合双轨制,譬如,你可以让某些电脑拥有“静 态”的 IP 位址(例如,伺服器),而让其它的用户端取得“动态”的IP 位址( 例如,使用膝 上型电脑,机动的使用者)。还有其它的选项,譬如,说 wins 伺 服器的位址、时间伺服 器等等,如果你需要进一步了解的话,可以请参阅 dhcpd.conf 的说明文件。 4.4 启动伺服器 在启动伺服器之前你只要做一件事情就行了。通常 DHCP 的安装过程中并不会产 生档案 dhcp.leases。伺服器 DHCPd 会使用这个档案来储存目前的租用资讯。该 档案采用一般 文字的格式来储存资料,所以在 DHCPd 操作期间你可以直接检视 它的内容。现在我们 来产生档案 dhcp.leases,请在命令列上输入: touch /etc/dhcp.leases 这个动作将会产生一个空白的档案(档案的大小 = 0)。你不需要对该档案做任 何的修改 所以它应该是空白的。若你看到一个错误的讯息说该档案是空白的,你 可以不理会它并且 请继续以下的步骤。 现在,你可以启用 DHCP 伺服器了。只要输入(或将下面的叙述加到开机设定档 中) /usr/sbin/dhcpd 如果,你想要确定运作是否一切正常,你应该先开启除错模式,并把伺服器放到 “幕前” (foreground)来执行。为此,你可以输入 /usr/sbin/dhcpd -d -f 然後,开启你任何一个用户端机器,并察看伺服器端“操作控制台”(console) 的萤幕, 你将会看到一些除错讯息被显示出来。 References 1. ftp://metalab.unc.edu/pub/Linux/docs/HOWTO 2. http://metalab.unc.edu/LDP/ 3. http://www.linux.org.tw/CLDP/mini/DHCP.html 4. mailto:linux-howto@metalab.unc.edu 5. http://web.syr.edu/~jmwobus/comfaqs/dhcp.faq.html 6. ftp://metalab.unc.edu/pub/Linux/system/network/daemons/dhcpcd-0.70.lsm 7. ftp://phystech.dyn.ml.org/pub/ 8. http://www.cps.msu.edu/~dunham/out/dhcpcd-1.3.6.tar.gz 9. ftp://ftp.cdrom.com/pub/linux/metalab/system/network/daemons/ 10. ftp://metalab.unc.edu/pub/Linux/system/network/daemons 11. ftp://ftp.kobe-u.ac.jp/pub/PC-UNIX/Linux/network/dhcp 12. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#nameserver 13. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#nameserver 14. ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm 15. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#nameserver 16. ftp://ftp.debian.org/debian/dists/slink/main/binary-i386/net/dhcpcd_0.70-4.deb 17. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#nameserver 18. http://www.cro.net/~vuksan/dhcppatch 19. mailto:reshapiro@mediaone.net 20. ftp://ftp.linuxppc.org//pub/linuxppc/contrib/linuxppc-R4/RPMS/ 21. http://eolicom.olicom.dk/~storner/dhcp/ 22. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#troubleshooting 23. file://localhost/tmp/zh-sgmltools.26942/DHCP.txt.html#error3 24. ftp://vanbuer.ddns.org/pub/ 25. ftp://ftp.isc.org/isc/dhcp/