1 認識什么是DHCP
DHCP服務器是自動的將網絡參數正確的分配給網域中的每部計算機,讓客戶端的計算機可以在開機的時候就立即自動的設定好網絡的參數值,這些參數值可以包括了 IP
、netmask
、network
、gateway
與 DNS 的地址等等
2 dhcp協議的運作模式
參考dhcp協議圖
DHCP
通常是用於局域網絡內的一個通訊協議,他主要藉由客戶端傳送廣播封包給整個物理網段內的所有主機, 若局域網絡內有 DHCP 服務器時,才會響應客戶端的 IP 參數要求
3 客戶端獲取IP參數的簡化流程
- 客戶端:利用廣播封包發送搜索 DHCP 服務器的封包
- 服務器端:提供客戶端網絡相關的租約以供選擇
- 到服務器的登錄文件中尋找該用戶之前是否曾經用過某個 IP ,若有且該 IP 目前無人使用,則提供此 IP 給客戶端
- 若配置文件針對該 MAC 提供額外的固定 IP (static IP) 時,則提供該固定 IP 給客戶端
- 若不符合上述兩個條件,則隨機取用目前沒有被使用的 IP 參數給客戶端,並記錄下來
- 客戶端:決定選擇的 DHCP 服務器提供的網絡參數租約並回報服務器
- 服務器端:記錄該次租約行為並回報客戶端已確認的響應封包信息
4 DHCP服務器給予客戶端的 IP 參數主要有兩種
4.1 固定IP
只要機器不換網卡,那么MAC肯定就是不會變化的,因為DHCP是基於MAC進行IP綁定的,所以每次開機都會獲取一個固定的IP
查看MAC地址的方法
- ifconfig | grep ether
- arp -n
- 觀察別人的MAC地址:
ping -c 3 {ip_addr}
4.2 動態IP
Client 端每次連上 DHCP 服務器所取得的 IP 都不是固定的!都直接經由 DHCP 所隨機由尚未被使用的 IP 中提供
5 安裝
yum install dhcp -y
mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
cp /usr/share/doc/{dhcp-version}/dhcp.conf.example /etc/dhcp/dhcpd.conf
5.1 dhcp的配置文件
/usr/share/doc/{dhcp-version}/dhcp.conf.example
:dhcp安裝包自帶的模板配置文件/var/lib/dhcpd/dhcpd.leases
:文件保存客戶端租用數據庫
5.2 dhcp配置文件語法
- 該配置文件可包含附加標簽或空白行以方便格式化
- 『 # 』為批注符號
- 除了右括號 ")" 后面之外,其他的每一行設定最后都要以『 ; 』做為結尾!重要
- 設定項目語法主要為:『 <參數代號> <設定內容> 』,例如:
default-lease-time 259200
; - 某些設定項目必須以 option 來設定,基本方式為『 option <參數代碼> <設定內容> 』例如:option range ***;
- 區分大小寫
5.3 dhcp.conf設置的兩大模塊
5.3.1 整體設定global
- default-lease-time ""; 定義默認租約時間,默認是秒
- max-lease-time ""; 定義最大租約時間,默認是秒
- option domain-name "example.com"; 相當於你在/etc/resolv.conf中使用的search google.com
- option domain-name-servers IP1, IP2; 表示把客戶端/etc/resolv.conf中nameserver后面的那個ip修改為ip1,ip2
- option routers IP;設定路由器的IP
5.3.2 IP設定模式
由於 dhcpd 主要是針對局域網絡來給予 IP 參數的,因此在設定 IP 之前,我們得要指定一個區網才行
subnet NETWORK_IP netmask NETMASK_IP {
...
}
如上所示,NETWORK_IP
和NETMASK_IP
就是要設置你要設置的網絡是什么樣的,比如"192.168.10.0/255.255.255.0",而{}
中就是設定IP是固定的
還是動態的
range IP1,IP2
; 給予一個連續的 IP 群用來發放成動態 IP 的設定host 主機名 { ... }
; 主機名自己隨意指定,但是{}
中要有指定的MAC以及固定的IPhardware ethernet 硬件地址
fixed-address IP地址
5.3.3 一個子網絡范例
[root@www ~]# vim /etc/dhcp/dhcpd.conf
# 1. 整體的環境設定
ddns-update-style none; <==不要更新 DDNS 的設定
ignore client-updates; <==忽略客戶端的 DNS 更新功能
default-lease-time 259200; <==預設租約為 3 天
max-lease-time 518400; <==最大租約為 6 天
option routers 192.168.100.254; <==這就是預設路由
option domain-name "centos.vbird"; <==給予一個領域名
option domain-name-servers 168.95.1.1, 139.175.10.20;
# 上面是 DNS的IP設定,這個設定值會修改客戶端的 /etc/resolv.conf 檔案內容
# 168.95.1.1是中華電信的DNS
# 139.175.10.20是seednet的DNS
# 2. 關於動態分配的 IP
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.101 192.168.100.200; <==分配的 IP 范圍
# 3. 關於固定的 IP 啊!
host win7 {
hardware ethernet 08:00:27:11:EB:C2; <==客戶端網卡 MAC
fixed-address 192.168.100.30; <==給予固定的 IP
}
}
# 相關的設定參數意義,請查詢前一小節的介紹,或者 man dhcpd.conf
5.3.4 限定監聽的網口
在某些早期的Linux distribution上面,當你的Linux主機具有多個接口時,你的一個設定可能會讓多個接口同時來監聽,那就可能會發生錯誤了。舉例來說,我們現在的設定是 192.168.100.0/24 這個在eth1 上頭的網域,假設你還有一個界面eth2在192.168.2.0/24 好了,那萬一你的 DHCP 同時監聽兩塊接口的話,想一想,如果 192.168.2.0/24 網域的客戶端發送出 dhcp 封包的要求時, 他會取得什么 IP ?當然是 192.168.100.X !所以啰,我們就得要針對 dhcpd 這個執行文件設定他監聽的接口,而不是針對所有的接口都監聽啊!你說是吧!那如何處理呢?在 CentOS (Red Hat 系統) 可以這樣做
[root@www ~]# vim /etc/sysconfig/dhcpd
DHCPDARGS="eth0"
以上的設定,在后期的版本中已經別放棄
修改配置文件后,一定要systemctl restart dhcpd
重啟dhcp的守護進程后方可生效
6 dhcp實驗出真知
准備在一台centos7的虛擬機上做這個實驗,對於vmware來說,它內置的就含有一個dhcp的服務,因此我們在實驗前做了這樣的實驗
- centos7采用的是NAT網絡連接模式,關閉vmware內置的dhcp服務,設置centos7的靜態IP為172.17.0.4/255.255.255.0,網關是172.17.0.2
- 添加一個新的網卡"ens33:1"在centos7,以centos7的ens33:1作為保留路由IP
ifconfig ens33:1 192.168.10.3 netmask 255.255.255.0 up
- 在centos7上搭建DHCP server
/etc/dhcp/dhcpd.conf
[root@webserver1 dhcp]# cat /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
default-lease-time 43200;
max-lease-time 86400;
option routers 192.168.10.3;
option domain-name "linuxedu.top";
option domain-name-servers 8.8.8.8,114.114.114.114;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.10 192.168.10.20;
filename "pxelinux.0";
next-server 172.17.0.4;
}
systemctl restart dhcpd.service #重啟dhcpd服務
systemctl status dhcpd.service #查看當前dhcp服務的運行狀態
[root@webserver1 dhcp]# systemctl status dhcpd.service
● dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-04 22:27:42 CST; 26s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 1158 (dhcpd)
Status: "Dispatching packets..."
CGroup: /system.slice/dhcpd.service
└─1158 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
Oct 04 22:27:42 webserver1 dhcpd[1158]: Sending on LPF/ens33:1/00:0c:29:5e:ae:c0/192.168.10.0/24
Oct 04 22:27:42 webserver1 dhcpd[1158]:
Oct 04 22:27:42 webserver1 dhcpd[1158]: No subnet declaration for ens33 (172.17.0.4).
Oct 04 22:27:42 webserver1 dhcpd[1158]: ** Ignoring requests on ens33. If this is not what
Oct 04 22:27:42 webserver1 dhcpd[1158]: you want, please write a subnet declaration
Oct 04 22:27:42 webserver1 dhcpd[1158]: in your dhcpd.conf file for the network segment
Oct 04 22:27:42 webserver1 dhcpd[1158]: to which interface ens33 is attached. **
Oct 04 22:27:42 webserver1 dhcpd[1158]:
Oct 04 22:27:42 webserver1 dhcpd[1158]: Sending on Socket/fallback/fallback-net
Oct 04 22:27:42 webserver1 systemd[1]: Started DHCPv4 Server Daemon.