3.1 DHCP 簡介
DHCP(Dynamic Host Configuration Protocol:動態主機配置協議)是一個工做在應用層的局域網網絡協議,數據傳輸時使用 UDP 不可靠傳輸協議工做,一般被應用在大型的局域網絡環境中,主要做用是集中的管理、分配網絡資源,使網絡環境中的主機能動態的得到 IP 地址、Gateway地址、DNS 服務器地址等信息,並可以提高地址的使用率。小程序
3.2 DHCP 工做原理(租約四部曲+續租)
3.2.1 DHCP 客戶端進行 IP 請求
當一個 DHCP 客戶機啓動時,會自動將本身的 IP 地址配置成 0.0.0.0,因爲使用 0.0.0.0 不能進行正常通訊,因此客戶機就必須經過 DHCP 服務器來獲取一個合法的地址。因爲客戶機不知道 DHCP 服務器的 IP 地址,因此**它使用 0.0.0.0 的地址做爲源地址,使用 255.255.255.255 做爲目標地址。使用 UDP 67 端口做爲目的端口來廣播請求 IP 地址信息。**廣播信息 DHCP Discover 中包含了 DHCP 客戶機的 MAC 地址和計算機名,以便使用 DHCP 服務器能肯定是哪一個客戶機發送的請求。vim
3.2.2 DHCP 服務器相應請求
當 DHCP 服務器接收到客戶機請求 IP 地址的信息時,它就在本身的 IP 地址池中查找是否有合法的 IP 地址提供給客戶機。若是有,DHCP 服務器就將此 IP 地址作上標記,加入到 DHCP OFFER 的消息中,而後 DHCP 服務器就廣播一則包括下列信息的 DHCP OFFER 消息。centos
DHCP 客戶機的 MAC 地址:DHCP 服務器提供的合法 IP 地址;子網掩碼;默認網關(路由);租約的期限;DHCP 服務器的IP地址-MAC
由於DHCP 客戶機尚未 IP 地址,因此 DHCP 服務器使用本身的 IP 地址做爲源地址,使用 255.255.255.255 做爲目標地址,使用 UDP 68 端口做爲源端口來廣播 DHCP OFFER信息。
bash
3.2.3 DHCP 客戶機選擇 IP
DHCP 客戶機從接收到的第一個 DHCP OFFER 消息中選擇 IP 地址,發出 IP 地址的 DHCP 服務器將該地址保留,這樣該地址就不能提供給另外一個 DHCP 客戶機。當客戶機從第一個 DHCP 服務器接收 DHCP OFFER 並選擇IP地址後,DHCP 租約的第三個過程發生。客戶機將DHCP REQUEST 消息光波導全部的 DHCP 服務器,代表它接收提供的內容。DHCP REQUEST 消息包括爲客戶機提供IP 配置的服務器的服務表示(IP地址)。DHCP 服務器查看服務器標識符字段,以肯定它本身是否被選擇爲指定的客戶機提供IP地址,若是那些 DHCP OFFER 被拒絕,則 DHCP 服務器會取消提供並保留其 IP 地址以用於下一個 IP 租約請求。服務器
在客戶機選擇 IP 的過程當中,雖然客戶機選擇了 IP 地址,可是尚未配置 IP 地址,而在一個網絡中可能有幾個 DHCP 服務器,因此客戶機仍然使用 0.0.0.0 的地址做爲源地址,使用 255.255.255.255 做爲目標地址,使用 UDP 67 端口做爲目標的端口來廣播 DHCP REQUEST 信息。網絡
3.2.4 DHCP 服務器確認租約
服務確認租約,也稱爲 DHCPACK/DHCPNAK。dom
DHCP 服務器接收到 DHCPREQUEST 消息後,以 DHCPACK 消息的形式向客戶機廣播成功的確認,該消息包含有IP地址的有效租約和其餘可能配置的信息。雖然服務器確認了客戶機的租約請求,可是客戶機尚未收到服務器的 DHCPACK 消息,因此服務器仍然使用本身的IP地址做爲源地址,使用 UDP67 端口做爲源端口,使用 255.255.255.255 做爲目標地址,使用 UDP68 端口做爲目的端口來廣播DHCPACK 信息。當客戶機收到 DHCPACK 消息時,它就配置了IP地址,完成了TCP/IP的初始化。編輯器
3.2.5 DHCP 客戶機續租
DHCP 客戶機會在租期過去50%的時候,直接向其提供IP地址的DHCP 服務器發送DHCP REQUEST 消息包。若是客戶機接收到該服務器迴應的 DHCP ACK 消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的 TCP/IP 參數,更新本身的配置,IP 租用更新完成。若是沒有收到該服務器的恢復,則客戶機繼續使用現有的IP地址,由於當前租期還有50%。oop
若是在租期過去50%的時候尚未更新,則DHCP客戶機將在租期過去87.5%的時候在此向其提供IP地址的DHCP服務器聯繫。若是還不成功。到租約的100%時候,DHCP 客戶機必須放棄這個IP地址,從新申請。若是此時無DHCP 服務器可用,DHCP 客戶機會使用169.254.0.0/16中隨機的一個地址,而且每隔5分鐘再進行嘗試。測試
3.3 DHCP 服務搭建
3.3.1 環境準備
主機名 | 服務 | IP |
---|---|---|
test1 | dhcp 客戶端 | ?? |
test2 | dhcp 服務端 | 192.168.117.131 |
- 兩臺主機,網絡爲 nat 模式
- 關閉防火牆
iptables -F setenforce 0
- 注:若是您用的是 VMware 虛擬機,還請關閉虛擬網絡編輯器的 DHCP 功能
3.3.2 DHCP 相關信息
- 軟件名
dhcp:DHCP 服務軟件包 dhcp-common:DHCP 命令軟件包
- 服務名
dhcpd:DHCP 服務名 dhcrelay:DHCP 中繼服務名
- 端口號
udp 67:客戶端的目標端口,用來向服務端請求 DHCP udp 68:服務端的源端口,用來向客戶端回覆數據包
- 配置文件
/etc/dhcp/dhcpd.conf:默認爲空文件,須要導入模板文件 /usr/share/doc/dhcp-4.*.*/dhcp.conf.sample:DHCP 的模板配置文件 /etc/sysconfig/shcrelay:中繼配置文件
3.3.3 DHCP 配置文件詳解
subnet 10.5.5.0 netmask 255.255.255.224 { #聲明要分配的網段和子網掩碼 range 10.5.5.26 10.5.5.30; #聲明可用的IP地址 option domain-name-servers ns1.internal.example.org; #設置DNS域 option domain-name "internal.example.org"; #設置DNS服務器地址 option routers 10.5.5.1; #默認網關的地址 option broadcast-address 10.5.5.31; #廣播地址 default-lease-time 600; #默認租約(s) max-lease-time 7200; #最大租約(s) } host fantasia { hardware ethernet 08:00:07:26:c0:a5; fixed-address fantasia.fugue.com; } #給某個主機設置固定的IP地址
3.4 DHCP 實驗部署
3.4.1 DHCP 基本功能
#查看 dhcp 和 dhcp-common rpm包有沒有安裝 [root@test2 ~]# rpm -q dhcp 未安裝軟件包 dhcp [root@test2 ~]# rpm -q dhcp-common dhcp-common-4.2.5-68.el7.centos.1.x86_64
#安裝 DHCP [root@test2 ~]# yum install -y dhcp
#生成配置文件:將模板文件粘貼到配置文件 [root@test2 ~]# \cp -af /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
#修改配置文件 #將配置文件的前幾個 subnet 聲明註釋掉,修改最後一個 subnet [root@test2 ~]# vim /etc/dhcp/dhcpd.conf subnet 192.168.117.0 netmask 255.255.255.0 { #dhcp 服務器所在網段 range 192.168.117.200 192.168.117.210; # option domain-name-servers ns1.internal.example.org; # option domain-name "internal.example.org"; # option routers 10.5.5.1; # option broadcast-address 10.5.5.31; default-lease-time 600; max-lease-time 7200; }
#重啓 dhcp 服務 [root@test2 ~]# systemctl restart dhcpd
DHCP 功能測試
#另外一臺主機開啓 IP 自動獲取功能 [root@test1 ~]# nmtui
- 編輯鏈接 ---- 回車鍵
- 網卡名 ens33 ---- 回車鍵
- 光標移動到「手動」 ---- 按回車鍵改成「自動」
- 光標下移到「肯定」 ---- 按回車鍵,完成配置
#重啓網卡並查看IP [root@test1 ~]# systemctl restart network [root@test1 ~]# ip a
客戶端成功獲取服務端地址池中的 IP
DHCP 服務端查看 IP 租約日誌
[root@test2 ~]# tail -10 /var/log/messages Oct 14 00:04:34 test2 dhcpd: ns2.example.org: host unknown. Oct 14 00:04:34 test2 dhcpd: rtr-239-0-1.example.org: host unknown. Oct 14 00:04:34 test2 dhcpd: rtr-239-0-2.example.org: host unknown. Oct 14 00:04:34 test2 dhcpd: DHCPACK on 192.168.117.200 to 00:0c:29:80:3b:35 (test1) via ens33 Oct 14 00:08:29 test2 dhcpd: DHCPREQUEST for 192.168.117.200 from 00:0c:29:80:3b:35 (test1) via ens33 Oct 14 00:08:29 test2 dhcpd: ns1.example.org: host unknown. Oct 14 00:08:29 test2 dhcpd: ns2.example.org: host unknown. Oct 14 00:08:29 test2 dhcpd: rtr-239-0-1.example.org: host unknown. Oct 14 00:08:29 test2 dhcpd: rtr-239-0-2.example.org: host unknown. Oct 14 00:08:29 test2 dhcpd: DHCPACK on 192.168.117.200 to 00:0c:29:80:3b:35 (test1) via ens33
3.4.2 固定地址分配
#獲取客戶機的 mac 地址 [root@test1 ~]# ip a | awk 'NR==8 {print $2}' 00:0c:29:80:3b:35
#在實驗3.4.1 的基礎上,編輯 DHCP 服務器的配置文件並重啓服務 [root@test2 ~]# vim /etc/dhcp/dhcpd.conf host fantasia { hardware ethernet 00:0c:29:80:3b:35; #客戶端網卡 mac 地址 fixed-address 192.168.117.205; #指定客戶端 IP } [root@test2 ~]# systemctl restart dhcpd
#重啓 DHCP 客戶機的網卡並查看IP [root@test1 ~]# systemctl restart network
客戶端成功獲取服務端地址池中的指定 IP:192.168.117.205
DHCP 服務端查看 IP 租約日誌
[root@test2 ~]# tail -10 /var/log/messages Oct 14 22:00:45 test2 dhcpd: ns2.example.org: host unknown. Oct 14 22:00:45 test2 dhcpd: rtr-239-0-1.example.org: host unknown. Oct 14 22:00:45 test2 dhcpd: rtr-239-0-2.example.org: host unknown. Oct 14 22:00:45 test2 dhcpd: DHCPOFFER on 192.168.117.205 to 00:0c:29:80:3b:35 via ens33 Oct 14 22:00:45 test2 dhcpd: Dynamic and static leases present for 192.168.117.205. Oct 14 22:00:45 test2 dhcpd: Remove host declaration fantasia or remove 192.168.117.205 Oct 14 22:00:45 test2 dhcpd: from the dynamic address pool for 192.168.117.0/24 Oct 14 22:00:45 test2 dhcpd: DHCPREQUEST for 192.168.117.205 (192.168.117.131) from 00:0c:29:80:3b:35 via ens33 Oct 14 22:00:45 test2 dhcpd: DHCPACK on 192.168.117.205 to 00:0c:29:80:3b:35 via ens33 Oct 14 22:01:01 test2 systemd: Started Session 2 of user root.
3.4.3 超級做用域(同一局域網)
超級做用域介紹
DHCP 服務器可爲單個網絡上的客戶端提供多個做用域租約地址。
實驗環境準備
準備三臺服務器並處於同一網絡模式,一個 DHCP 服務器,兩個客戶端
主機名 | 服務 | IP |
---|---|---|
dhcp-client1 | DHCP 客戶端 | ?? |
dhcp-client2 | DHCP 客戶端 | ?? |
dhcp-server | DHCP 服務端 | 192.168.117.2 |
實驗步驟
#設置 DHCP 服務器的單臂路由所需子網卡 [root@dhcp-server ~]# cd /etc/sysconfig/network-scripts/ [root@dhcp-server network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1 #編輯這個文件修改網卡名和 IP 地址 [root@dhcp-server network-scripts]# vim ifcfg-ens33:1 NAME=ens33 DEVICE=ens33:1 ONBOOT=yes BOOTPROTO=none IPADDR="192.168.100.132" NETMASK=255.255.255.0 GATEWAY=192.168.117.2 DNS1=192.168.117.2
#重啓網卡並查看IP [root@dhcp-server network-scripts]# systemctl restart network [root@dhcp-server network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:05:c5:49 brd ff:ff:ff:ff:ff:ff inet 192.168.117.132/24 brd 192.168.117.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.100.132/24 brd 192.168.100.255 scope global noprefixroute ens33:1 #子 IP 配置成功 valid_lft forever preferred_lft forever
#開啓內核路由轉發功能 [root@dhcp-server ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #刷新內核參數 [root@dhcp-server ~]# sysctl -p net.ipv4.ip_forward = 1
#安裝 DHCP 服務 [root@dhcp-server ~]# yum install -y dhcp #生成配置文件 [root@dhcp-server ~]# \cp -af /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf #修改配置文件 [root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf shared-network 100-117 { subnet 192.168.117.0 netmask 255.255.255.0 { option routers 192.168.117.132; range 192.168.117.10; } subnet 192.168.100.0 netmask 255.255.255.0 { option routers 192.168.100.132; range 192.168.100.10 192.168.100.20; } } #重啓 DHCP 服務 [root@dhcp-server ~]# systemctl restart dhcpd
#dhcp 客戶端開啓 IP 自動獲取功能(詳見:3.4.1)
#dhcp-client1 重啓網卡,並查看IP [root@dhcp-client1 ~]# ifdown ens33;ifup ens33 成功斷開設備 'ens33'。 鏈接已成功激活(D-Bus 活動路徑:/org/freedesktop/NetworkManager/ActiveConnection/9)
#dhcp-client2 重啓網卡,並查看IP [root@dhcp-client2 ~]# ifdown ens33;ifup ens33 成功斷開設備 'ens33'。 鏈接已成功激活(D-Bus 活動路徑:/org/freedesktop/NetworkManager/ActiveConnection/9)
#測試兩個客戶端可否通訊 [root@dhcp-client1 ~]# ping 192.168.117.10 PING 192.168.117.10 (192.168.117.10) 56(84) bytes of data. 64 bytes from 192.168.117.10: icmp_seq=1 ttl=64 time=0.645 ms 64 bytes from 192.168.117.10: icmp_seq=2 ttl=64 time=0.330 ms 64 bytes from 192.168.117.10: icmp_seq=3 ttl=64 time=0.393 ms 64 bytes from 192.168.117.10: icmp_seq=4 ttl=64 time=0.366 ms
3.4.4 DHCP 中繼
DHCP 中繼介紹
DHCP Relay(DHCPR)中繼是一個小程序,能夠實如今不一樣子網和物理網段之間處理和轉發 dhcp 信息的功能。
環境準備(VMware 虛擬機)
主機名 | 服務 | 網絡鏈接模式 | IP |
---|---|---|---|
dhcp-server | DHCP 服務端 | VMnet8 | 192.168.117.130 |
router | DHCP 中繼 | VMnet8 + VMnet9 | 192.168.117.131 + 192.168.200.100 |
dhcp-client | 外網客戶端 | VMnet8 + VMnet9 | ?? |
關閉防火牆(……略……)
VMware 虛擬網絡配置
- 打開虛擬網絡編輯器,添加虛擬網段 VMnet8 和 VMnet9,關閉 DHCP 功能
DHCP 服務器網絡配置
DHCP 中繼網絡配置
- DHCP 中繼端在添加一塊網絡適配器,網絡分別處於 VMnet8 和 VMnet9
外網客戶端網絡配置
- dhcp-client 端在添加一塊網絡適配器,網絡分別處於 VMnet8 和 VMnet9
配置 DHCP 服務端
#將DHCP服務器的網關地址改成爲DHCP中繼的 IP:192.168.117.131(VMnet8 的IP地址) [root@dhcp-server ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 GATEWAY=192.168.117.131
#安裝 DHCP 服務 [root@dhcp-server ~]# yum install -y dhcp #修改配置文件 [root@dhcp-server ~]# \cp -af /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf [root@dhcp-server ~]# vim /etc/dhcp/dhcpd.conf #生明兩個 subnet,其餘配置能夠不作操做或刪除 subnet 192.168.117.0 netmask 255.255.255.0 { range 192.168.117.200 192.168.117.250; option routers 192.168.117.131; #路由IP爲 DHCP 中繼服務器 VMnet8 IP } subnet 192.168.200.0 netmask 255.255.255.0 { range 192.168.200.200 192.168.200.250; option routers 192.168.200.100 ; #路由IP爲 DHCP 中繼服務器 VMnet9 IP }
#重啓 DHCP 服務和網卡 [root@dhcp-server ~]# systemctl restart dhcpd network
配置 DHCP 中繼
#配置網絡(在原有網絡基礎上配置 192.168.200 段的 IP) [root@router network-scripts]# cd /etc/sysconfig/network-scripts/ [root@router network-scripts]# \cp -af ifcfg-ens33 ifcfg-ens37 [root@router network-scripts]# vim ifcfg-ens37 #只保留如下配置文件便可 DEVICE=ens37 NAME=ens37 ONBOOT=yes BOOTPROTO=none IPADDR="192.168.200.100" #重啓網絡網卡 [root@router network-scripts]# systemctl restart network #查看 IP 以下
#安裝 DHCP 服務 [root@router network-scripts]# yum install -y dhcp #開啓 DHCP 中繼功能,指定 DHCP 服務器的地址 [root@router ~]# dhcrelay -i ens33 -i ens37 192.168.117.130 Dropped all unnecessary capabilities. Internet Systems Consortium DHCP Relay Agent 4.2.5 Copyright 2004-2013 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ Listening on LPF/ens33:1/00:0c:29:b4:a8:04 Sending on LPF/ens33:1/00:0c:29:b4:a8:04 Listening on LPF/ens37/00:0c:29:b4:a8:0e Sending on LPF/ens37/00:0c:29:b4:a8:0e Listening on LPF/ens33/00:0c:29:b4:a8:04 Sending on LPF/ens33/00:0c:29:b4:a8:04 Sending on Socket/fallback
#開啓內核路由轉發功能 [root@router network-scripts]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 #刷新內核參數 [root@router network-scripts]# sysctl -p net.ipv4.ip_forward = 1
配置外網客戶端
- IP 改成自動獲取(詳:3.4.1)
[root@dhcp-client ~]# nmtui
- 查看主機 IP
[root@dhcp-client ~]# ip a
- IP 地址獲取成功
IP 地址獲取失敗可能緣由
- 請檢查您的網絡適配器設置。
- 請檢查防火牆是否關閉。
- 檢查 dhcp-sever 和 router 主機的網絡連通性,注意 dhcp-server 網關地址指向。
- 檢查 dhcp-server 中 DHCP 服務配置文件。