11.1 DHCP概述 11.1.1 采用DHCP的必要性 在TCP/IP網絡上,每台工作站要能存取網絡上的資源之前,都必須進行基本的網絡配置,一些主要參數諸如IP地址,子網掩碼,缺省網關,DNS等必不可少,還可能需要一些附加的信息如IP管理策略之類。對於一個稍微大點的網絡而言,網絡的管理和維護的任務是相當繁重的。一台計算機從一個子網轉移到另一個子網,就要重新對系統進行配置。對於普通水平的工作站用戶是不能賦予他們配置自己的工作站網絡的權限,而且也沒有這個必要。如果一個沒有相應技術水平的用戶出於好奇或想學習一下的目的錯誤地更改了工作站的網絡配置,造成網絡故障,後果不言而喻。因此,需要有一種機制來讓TCP/IP的配置和管理從用戶端轉移到網絡管理端,實現IP的集中式管理。解決方案就是用DHCP。 11.1.2 DHCP的主要功能 DHCP的全稱是動態主機配置協議(Dynamic Host Configuration Protocol),由IETF(Internet 網絡工程師任務小組)設計,詳盡的協議內容在RFC文檔rfc2131和rfc1541裡。目的就是為了減輕TCP/IP網絡的規劃、管理和維護的負擔,解決IP地址空間缺乏問題。運行DHCP的服務器把TCP/IP網絡設置集中起來,動態處理工作站IP地址的配置,用DHCP租約和預置的IP地址相聯系,DHCP租約提供了自動在TCP/IP網絡上安全地分配和租用IP地址的機制,實現IP地址的集中式管理,基本上不需要網絡管理人員的人為干預。而且,DHCP本身被設計成BOOTP(自舉協議)的擴展,支持需要網絡配置信息的無盤工作站,對需要固定IP的系統也提供了相應支持。 11.2 DHCP的工作原理 11.2.1 幾個DHCP名詞 在介紹DHCP工作原理以前,先解釋這幾個名詞的含義: DHCP客戶:DHCP客戶是一通過DHCP來獲得網絡配置參數的Internet主機,通常就是普通用戶的工作站。 DHCP服務器:DHCP服務器是提供網絡設置參數給DHCP客戶的Internet主機。 DHCP/BOOTP 中繼代理:在DHCP客戶和服務器之間轉發 DHCP 消息的主機或路由器。 DHCP是基於客戶機/服務器模型設計的,DHCP客戶和DHCP服務器之間通過收發DHCP消息進行通訊。 11.2.2 DHCP 消息的格式: DHCP 消息的格式與BOOTP消息大部分相同, 這樣設計可以增強BOOTP服務器工具,同時為BOOTP和DHCP兩種客戶服務。另外,BOOTP的中繼代理可用來轉發跨子網的DHCP請求。 各段描述如下 括號裡的數字代表這個段以8位組為單位的大小,除options外,其余的段的長度都是固定的,options段的長度至少是312個8位組。 如op(1)代表這個段的長度為一個8位組 op 是消息操作代碼,值為1 代表BOOTREQUEST(自舉請求)值為2 代表BOOTREPLY(自舉響應) 在DHCP客戶和DHCP服務器對話期間,op段被DHCP客戶設置為BOOTREQUEST(1), 被DHCP服務器設置為 BOOTREPLY(2)。 htype 是硬件地址類型 hlen 是硬件地址長度 hops DHCP客戶置這項為零,中繼代理要用 xid DHCP客戶在尋求時產生的一個隨機數, 它提供了對所有後續的DHCP消息中的客戶請求和服務器響應的一種聯合。 ciaddr 客戶機用來請求一個特定的IP地址, 這個地址以前曾經分配給該客戶機,希望保留。 yiaddr 由DHCP服務器填寫,包含它提供給某一DHCP客戶的IP地址。 siaddr 服務器的主機地址 giaddr 中繼代理的IP地址 chaddr DHCP客戶硬件地址 sname 服務器主機名 file 啟動文件名 options 選項 在獲得IP地址前,DHCP客戶用 htype, hlen 和 chaddr 段表明它的硬件地址, 這個值由向客戶硬件地址作出響應的服務器和中繼代理利用。 以前BOOTP協議中的兩個沒有用到的8位組的flags段在DHCP消息裡有了定義。這個段的高位比特用於表明客戶機能不能在IP地址沒有被配置前接收Unicast 回應, 剩下的低位比特保留且必須置為零。 hops 和 secs 段在初始化過程中被中繼代理有選擇地利用。 sname 和 file 域可以被BOOTP或無盤站利用。 關於 options 選項 選項附加在DHCP消息的固定長度段之後, 為了與BOOTP工具兼容, 選項段的前四個8位組包含了 RFC1497中定義的magic cookies,余下的段就都是DHCP 選項。在RFC1533裡定義了DHCP的所有的選項 的格式。大多數選項用於標志網絡傳輸設置值, 例如子網掩碼 (mask)、 DNS 服 務 器 地 址 等其 他選項被DHCP協議利用, 且在大多數消息中是必需的。 DHCP 選項的編碼格式如下: 選項可以固定長度或可變長度,所有的選項都以一個8位組標識碼開始,這個標識碼用來標識選項。不帶數據的固定長度選項就只由一個標識碼構成。而且只有選項0和255是固定長度,其它的選項都可變長度的,為了標明選項數據的長度,在標識碼後面是一個長度8位組,這個長度8位組的值不包含標識碼和長度碼本身。 例如,DHCP選項裡的子網掩碼選項如下定義 標識碼是1,長度是4個8位組,隨後的4個8位組就是子網掩碼 DHCP消息類型選項的標識碼是53,長度是1個8位組,值是從1到7,分別代表不同的DHCP消息類型。 最後一項選項是零長度的End(選項 255), 表明這是選項的結束以便DHCP客戶處理。 采用選項編碼的好處是不論選項有多長,DHCP客戶都可以正確接收,即使是它不認識的選項(不見得所有的DHCP客戶程序都完全遵循RFC標准)。 不論是DHCP客戶還是DHCP服務器,都是通過按DHCP消息格式要求來填寫各個段形成具體的DHCP消息,DHCP用的傳輸協議的非面向連接的UDP(用戶數據報協議),從DHCP客戶發出的DHCP消息送往DHCP服務器的端口67,DHCP服務器發給客戶的DHCP消息送往DHCP客戶的端口68,由於在取得服務器賦予的IP之前,DHCP客戶並沒有自己的IP,所以包含DHCP消息的UDP數據報的IP頭的源地址段是0.0.0.0,目的地址則是255.255.255.255。 11.2.3 DHCP分配IP地址的過程: DHCP客戶機初始化TCP/IP,在本地物理子網上廣播一個 DHCPDISCOVER 消息, 以確定DHCP服務器位置及其IP地址。如果DHCP服務器和客戶不在同一個物理子網上,BOOTP中繼代理將轉發這個消息給DHCP服務器。由於網絡上可能不止一個DHCP服務器,凡所有具有有效IP地址信息的DHCP服務器向客戶機發出一個提議。客戶機從接收到的第一個提議中選定IP地址信息,並廣播一條租用地址的消息請求。由發出該提議的DHCP服務器響應該消息,指定IP地址信息給該客戶機並發送一個確認,而所有其它DHCP服務器撤回各自的提議。客戶機完成TCP/IP協議的初始化和綁定。配置完成後,客戶機就可以使用普通網絡通信和連接至其它IP主機時用到的所有IP服務和應用。 11.3 DHCP 服務器軟件的安裝 在Linux幾乎都采用的是Paul Vixie/ISC DHCPd,來實現DHCP服務器端功能。可以訪問http://www.isc.org/isc獲得最新消息。 目前大多書Linux發布都包含這個軟件,如果是Red Hat,以RPM形式提供,只要簡單地用RPM安裝就可以了。 # rpm -i dhcpd-1.3.17pl5-i386.rpm 11.4 基本應用 從目前情況看,大多數Linux DHCP服務器是為Windows95/98客戶平台提供服務。 11.4.1 增加主機路由 為了使DHCP服務器能為正確MS的DHCP客戶機器服務,需要創建一個到地址255.255.255.255的路由,把這條路由命令加到/etc/rc.d/rc.local,使得每次機器啟動後自動運行。 #route add -host 255.255.255.255 dev eth0 在一些老Linux核心的系統裡可能會報告錯誤消息: 255.255.255.255: Unkown host 可以試著加下面的條目到/etc/hosts文件裡 255.255.255.255 dhcphost 再用下面的命令 #route add -host dhcphost dev eth0 11.4.2 修改配置文件 DHCPd默認的配置文件是/etc/dhcpd.conf,這是一個文本文件,DHCPd裡有一個語法分析器,能對這個文件進行語法分析,獲得配置參數。dhcpd.conf 格式是遞歸下降的,關鍵字大小寫敏感,可以有注釋,注釋以#開頭,一直到該行結束。這裡給出一個簡單的dhcpd.conf的例子,所服務的網絡為C類保留網絡 192.168.1.0 #examples # 缺省租約時間 default-lease-time 28800; # 最大租約時間 max-lease-time 43200; # 子網掩碼選項 option subnet-mask 255.255.255.0; # 廣播地址 option broadcast-address 192.168.1.255; # 路由器地址 option routers 192.168.1.1; # DNS地址 option domain-name-servers 192.168.1.1; # 域名 option domain-name netreslab.org; # 以上都是全局參數 # 子網聲明和掩碼 subnet 192.168.1.0 netmask 255.255.255.0 { # 范圍 r