【分享】配置一個安全的Linux DHCP伺服器

火星人 @ 2014-03-04 , reply:0


【分享】配置一個安全的Linux DHCP伺服器

分享】配置一個安全的Linux DHCP伺服器
配置一個安全的Linux DHCP伺服器

轉自:http://www.ccidnet.com/
http://tech.ccidnet.com/pub/article/c743_a253591_p1.html
感謝原創作者:曹江華


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 "\001\000\000\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伺服器:
#service dhcpd start
使用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 的列表中:
DHCPDARGS=eth0
或者直接使用命令:
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)
這意味著還需要在「監牢」中創建lib目錄,並將庫文件複製到其中。手工完成這一工作是非常麻煩的,此時可以用jail軟體包來幫助簡化chroot「監牢」建立的過程。
(1)Jail軟體的編譯和安裝
Jail官方網站是:http://www.jmcresearch.com/ ,最新版本:1.9a。
#Wget http://www.jmcresearch.com/static/dwn/projects/jail/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 <assman@gsyc.inf.uc3m.es>

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 <assman@gsyc.inf.uc3m.es>

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
此時的「監牢」目錄結構見圖1。

圖1 「監牢」目錄結構
重新啟動dhcpd:
# /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伺服器就完成了。      
《解決方案》

多謝分享。
回帖做個標記
《解決方案》

看過了 確實不錯。。。。。




[火星人 via ] 【分享】配置一個安全的Linux DHCP伺服器已經有179次圍觀

http://www.coctec.com/docs/service/show-post-28000.html