DHCP是動態主機設定通訊協定。這個協議用於向電腦自動提供IP地址,子網路遮罩和路由資訊。網路系統管理員通常會分配某個範圍的IP地址來分發給區域網路上的客戶機。當裝置接入這個區域網路時,它們會向 DHCP 伺服器請求一個 IP 位址。然後DHCP伺服器為每個請求的裝置分配一個地址,直到分配完該範圍內的所有 IP 位址為止。已經分配的IP地址必須定時地延長借用期。這個延期的過程稱作leasing,確保了當客戶機裝置在正常地釋放IP地址之前突然從網路斷開時被分配的地址可以歸還給伺服器。本文以Redhat Linux 9.0為例,介紹如何建立一個完整和安全的DHCP伺服器。
一、建立DHCP伺服器設定檔
可以使用Redhat Linux 9.0自身攜帶rpm包安裝。安裝結束後, DHCP 連接埠監督程式 dhcpd設定檔是/etc目錄中的名為dhcpd.conf的檔案。下面手工建立/etc/dhcpd.conf檔案。/etc/dhcpd.conf通常包括三部分:parameters、declarations 、option。
1.DHCP設定檔中的parameters(參數):表明如何執行任務,是否要執行任務,或將哪些網路設定選項發送給客戶。主要內容見表1
參 數 |
解 釋 |
ddns-update-style |
配置DHCP-DNS 互動更新模式。 |
default-lease-time |
指定確省租賃時間的長度,單位是秒。 |
max-lease-time |
指定最大租賃時間長度,單位是秒。 |
hardware |
指定網卡介面類型和MAC地址。 |
server-name |
通知DHCP客戶服務器名稱。 |
get-lease-hostnames flag |
檢查用戶端使用的IP地址。 |
fixed-address ip |
分配給用戶端一個固定的地址。 |
authritative |
拒絕不正確的IP地址的要求。 |
2. DHCP設定檔中的declarations (聲明):用來描述網路布局、提供客戶的IP地址等。主要內容見表2:
聲 明 |
解 釋 |
shared-network |
用來告知是否一些子網路分享相同網路。 |
subnet |
描述一個IP地址是否屬於該子網。 |
range 起始IP 終止IP |
提供動態分配IP 的範圍。 |
host 主機名稱 |
參考特別的主機。 |
group |
為一組參數提供聲明。 |
allow unknown-clients;deny unknown-client |
是否動態分配IP給未知的使用者。 |
allow bootp;deny bootp |
是否響應啟用查詢。 |
allow booting;deny booting |
是否響應使用者查詢。 |
filename |
開始開機檔案的名稱,應用於無盤工作站。 |
next-server |
設定伺服器從引導檔案中裝如主機名稱,應用於無盤工作站。 |
3. DHCP設定檔中的option(選項):用來配置DHCP選擇性參數,全部用option關鍵字作為開始,主要內容包括見表3:
選 項 |
解 釋 |
subnet-mask |
為用戶端設定子網路遮罩。 |
domain-name |
為用戶端指明DNS名字。 |
domain-name-servers |
為用戶端指明DNS伺服器IP地址。 |
host-name |
為用戶端指定主機名稱。 |
routers |
為用戶端設定預設閘道。 |
broadcast-address |
為用戶端設定廣播位址。 |
ntp-server |
為用戶端設定網路時間伺服器IP地址。 |
time-offset |
為用戶端設定和格林威治時間的位移時間,單位是秒。 |
注意:如果用戶端使用的是視窗作業系統,不要選擇"host-name"選項,即不要為其指定主機名稱。
下面是一個筆者使用的DHCP設定檔,這是一個C類網路,共126個IP地址可以分配的例子。讀者可以複製後使用,注意紅色部分是必須要修改的。
ddns-update-style interim; ignore client-updates; subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.254; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; option domain-name-servers 192.168.1.3; option domain-name "www.cao.com"; #DNS名稱# option domain-name-servers 192.168.1.3; option time-offset -18000; range dynamic-bootp 192.168.1.128 192.168.1.255; default-lease-time 21600; max-lease-time 43200; host ns { hardware ethernet 52:54:AB:34:5B:09;#運行DHCP的網路介面的MAC地址# fixed-address 192.168.1.9; } } |
二、建立客戶租約檔案
運行DHCP伺服器還需要一個名為 dhcpd.leases 的檔案,保持所有已經分發出去的 IP 位址。在Redhat Linux 發行版本中,該檔案位於 /var/lib/dhcp/ 目錄中。如果您通過 RPM 安裝 ISC DHCP,那麼該目錄應該已經存在。dhcpd.leases的檔案格式為:
Leases address {statement} |
一個典型的檔案內容如下:
lease 192.168.1.255 { #DHCP伺服器分配的IP地址# starts 1 2005/05/02 03:02:26; # lease 開始租約時間# ends 1 2005/05/02 09:02:26; # lease 結束租約時間# binding state active; next binding state free; hardware ethernet 00:00:e8:a0:25:86; #客戶機網卡MAC地址# uid "%content%01%content%00%content%00/350/240%/206"; #用來驗證客戶機的UID標示# client-hostname "cjh1"; #客戶機名稱# } |
注意lease 開始租約時間和lease 結束租約時間是格林威治標準時間(GMT),不是本地時間。
第一次運行DHCP伺服器時dhcpd.leases是一個空檔案,也不用手工建立。如果不是通過 RPM 安裝 ISC DHCP,或者 dhcpd 已經安裝,那麼您應該試著確定 dhcpd 將其 lease 檔案寫到何處,並確保該檔案存在。也可以手工建立一個空檔案:
#touch /var/lib/dhcp/dhcpd.leases |
三、啟動和檢查DHCP伺服器
使用命令啟動DHCP伺服器:
使用ps命令檢查dhcpd進程:
#ps -ef | grep dhcpd root 2402 1 0 14:25 ? 00:00:00 /usr/sbin/dhcpd root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd |
使用檢查dhcpd啟動並執行連接埠:
# netstat -nutap | grep dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd |
四、配置DHCP用戶端
通常網管員使用選擇手工配置 DHCP 客戶,需要修改 /etc/sysconfig/network 檔案來啟用連網;並修改 /etc/sysconfig/network-scripts 目錄中每個網路裝置的設定檔。在該目錄中,每個裝置都有一個叫做 ifcfg-eth? 的設定檔,eth?是網路裝置的名稱。 如eth0等。如果你想在引導時啟動連網,NETWORKING 變數必須 被設為 yes。 除了此處之外/etc/sysconfig/network 檔案應該包含以下行:
NETWORKING=yes DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes |
五、DHCP配置常見錯誤排除
通常配置DHCP 伺服器很容易,不過,在這裡有一些技巧可以協助您避免出現問題。對伺服器而言,要確保網卡正常工作,並具備廣播功能。對客戶機而言,還要確保客戶機的網卡正常工作。最後,要考慮網路的拓撲,並考慮客戶機向 DHCP 伺服器發出的廣播訊息是否會受到阻礙。另外如果dhcpd進程沒有啟動,那麼可以瀏覽 syslog 訊息檔案來確定是哪裡出了問題。這個訊息檔案通常是 /var/log/messages。
典型故障:
1.DHCP伺服器配置完成,沒有語法錯誤。但是網路中的客戶機卻沒辦法取得IP地址。
通常是Linux DHCP伺服器沒有辦法接收來自255.255.255.255 的 DHCP 客戶機的Request 封包造成的。一般是Linux DHCP伺服器的網卡沒有設定具有MULTICAST功能。為了讓dhcpd(dhcp程式的守護進程)能夠正常的和DHCP客戶機溝通,dhcpd必須傳送封包到255.255.255.255這個IP地址,但是有些Linux系統裡255.255.255.255這個IP地址被用來做為監聽地區子網域(local subnet)廣播的 IP地址,所以需要在路由表(routing table)裡加入255.255.255.255以啟用MULTICAST功能;
使用命令:
route add -host 255.255.255.255 dev eth0 |
如果報告錯誤訊息:255.255.255.255:Unkown host
那麼請先修改/etc/hosts加入一行:
255.255.255.255 dhcp
2. DHCP用戶端程式和DHCP伺服器不相容
由於Linux有許多發現版本,不同版本使用DHCP用戶端程式和DHCP伺服器也不相同。Linux提供了四種DHCP用戶端程式:pump, dhclient, dhcpxd, 和dhcpcd。瞭解不同Linux發行版本的伺服器端和用戶端程式對於常見錯誤排除是必要的。筆者曾經遇到過使用SuSE Linux 9.1 DHCP伺服器和使用Mandrake Linux 9.0客戶機不相容的情況。此時就必須更換用戶端程式。方法是先停止客戶機的網路服務,卸載原程式,安裝和伺服器端相容程式。附表:主要Linux發行版使用的DHCP用戶端。
發行版本 |
預設 DHCP用戶端 |
可選 DHCP 用戶端 |
DHCP用戶端啟動指令碼 |
附加設定檔 |
Red Hat Linux 9.0 |
dhclient |
無 |
/sbin/ifup |
/etc/sysconfig/network /etc/sysconfig/network-scripts/ifcfg-eth0 |
Debian Linux 3.0 |
dhclient |
無 |
/sbin/ifup |
/etc/network/interfaces /etc/dhclient.conf |
Mandrake Linux 9.1 |
dhclient |
dhcpcd, dhcpxd, pump |
/sbin/ifup |
/etc/sysconfig/network /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/dhclient-eth0.conf |
SuSE Linux 9.1 |
dhcpcd |
dhclient |
/sbin/ifup-dhcp |
/etc/sysconfig/network/dhcp /etc/sysconfig/network/ifcfg-eth0 |
六、DHCP伺服器的安全
1. 在指定網路介面啟動DHCP伺服器
如果你的Linux系統串連了不止一個網路介面,但是你只想讓 DHCP 伺服器啟動其中之一,你可以配置 DHCP 伺服器只在那個裝置上啟動。在 /etc/sysconfig/dhcpd 中,把介面的名稱添加到 DHCPDARGS 的列表中:
或者直接使用命令:
Echo "DHCPDARGS=eth0" >> /etc/ sysconfig/dhcpd |
這樣對於帶有兩個網卡的防火牆機器,更加安全:一個網卡可以被配置成 DHCP 客戶來從互連網上檢索 IP 位址;另一個網卡可以被用作防火牆之後的內部網路的 DHCP 伺服器。僅指定串連到內部網路的網卡使系統更加安全,因為使用者無法通過互連網來串連它的守護進程。
2. 讓DHCP伺服器在監牢中運行
所謂"監牢"就是指通過chroot機制來更改某個軟體運行時所能看到的根目錄,即將某軟體運行限制在指定目錄中,保證該軟體只能對該目錄及其子目錄的檔案有所動作,從而保證整個伺服器的安全。這樣即使出現被破壞或被侵入,所受的損失也較小。
將軟體chroot化的一個問題是該軟體運行時需要的所有程式、設定檔和庫檔案都必須事先安裝到chroot目錄中,通常稱這個目錄為chroot jail(chroot"監牢")。如果要在"監牢"中運行dhcpd,而事實上根本看不到檔案系統中那個真正的目錄。因此需要事先建立目錄,並將dhcpd複製到其中。同時dhcpd需要幾個庫檔案,可以使用ldd(library Dependency Display縮寫)命令,ldd作用是顯示一個可執行程式必須使用的共用庫。
ldd dhcpd libc.so.6 => /lib/tls/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) style='font-family:宋體'> |
這意味著還需要在"監牢"中建立lib目錄,並將庫檔案複製到其中。手工完成這一工作是非常麻煩的,此時可以用jail軟體包來協助簡化chroot"監牢"建立的過程。
(1)Jail軟體的編譯和安裝
Jail官方網站是:http://www.jmcresearch.com/ ,最新版本:1.9a。
#Wget http://www.jmcresearch.com/stati ... il/jail_1.9a.tar.gz #tar xzvf jail.tar.gz; cd jail/src #make; make install |
(2)用jail建立監牢
jail軟體包提供了幾個Perl指令碼作為其核心命令,包括mkjailenv、addjailuser和addjailsw。
mkjailenv:建立chroot"監牢"目錄,並且從真實檔案系統中拷貝基本的軟體環境。addjailsw:從真實檔案系統中拷貝二進位可執行檔及其相關的其它檔案(包括庫檔案、輔助性檔案和裝置檔案)到該"監牢"中。addjailuser:建立新的chroot"監牢"使用者。
首先停止目前dhcpd服務,然後建立chroot目錄:
#/sbin/service dhcpd start #mkjailenv /chroot/ mkjailenv A component of Jail (version 1.9 for linux) http://www.gsyc.inf.uc3m.es/~assman/jail/ Juan M. Casillas Making chrooted environment into /chroot Doing preinstall() Doing special_devices() Doing gen_template_password() Doing postinstall() Done. |
下面的例子展示為"監牢"添加dhcpd程式的過程:
# addjailsw /chroot/ -P /usr/sbin/dhcpd addjailsw A component of Jail (version 1.9 for linux) http://www.gsyc.inf.uc3m.es/~assman/jail/ Juan M. Casillas Guessing dhcpd args(0) Warning: file /chroot//lib/tls/libc.so.6 exists. Overwritting it Warning: file /chroot//lib/ld-linux.so.2 exists. Overwritting it ……… Done. |
不用在意那些警告資訊,因為jail會調用ldd檢查dhcpd用到的庫檔案。而幾乎所有基於共用庫的二進位可執行檔都需要上述的幾個庫檔案。接下來將dhcpd的相關檔案拷貝到"監牢"中:
# mkdir -p /chroot/dhcp/etc # cp /etc/dhcpd.conf /chroot/dhcp/etc/ # mkdir -p /chroot/dhcp/var/state/dhcp # touch /chroot/dhcp/var/state/dhcp/dhcp.leases |
重新啟動dhcpd:
[root@www root]# /chroot/usr/sbin/dhcpd |
使用ps命令檢查dhcpd進程:
#ps -ef | grep dhcpd root 2402 1 0 14:25 ? 00:00:00 /chroot/usr/sbin/dhcpd root 2764 2725 0 14:29 pts/2 00:00:00 grep dhcpd |
注意此時進程名稱已經改變,使用檢查dhcpd啟動並執行連接埠:
# netstat -nutap | grep dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* 2402/dhcpd |
連接埠號碼沒有改變。現在dhcpd已經成功運行在"監牢"中。到此為止一個這樣,一個完整和安全的 DHCP伺服器就完成了。