????????DHCP(Dynamic Host Configuration Protocol/動(dòng)態(tài)主機(jī)配置協(xié)議)是到目前為止筆者接觸到的比較復(fù)雜的協(xié)議择镇,在傳輸過程中喉祭,DHCP有8種報(bào)文類型來實(shí)現(xiàn)不同的過程,而當(dāng)客戶端成功獲取地址之后也會(huì)有多種狀態(tài)的變化座咆。因此筆者打算先從dhcp的報(bào)文入手徽惋,理清楚一臺(tái)終端設(shè)備從無到有取得IP地址的過程案淋。
????????為何要使用DHCP呢?首先险绘,終端設(shè)備接入互聯(lián)網(wǎng)一定是需要IP地址的踢京,就像普通的電腦,而最初分配IP地址的方式就是手動(dòng)輸入IP地址宦棺,如有10臺(tái)設(shè)備A/B/C/D…I/G那么就找出10個(gè)IP地址如192.168.0.2/3/4/5…11瓣距。只需要一對(duì)一的設(shè)定好每臺(tái)設(shè)備的IP不沖突,設(shè)置好網(wǎng)關(guān)代咸、掩碼蹈丸、dns等就可以正常上網(wǎng)了。筆者第一章架設(shè)linux服務(wù)器和第二章接入專網(wǎng)的時(shí)候都是用的這種方式呐芥。但隨著接入量的增加逻杖,地址分配、更改會(huì)變得非常繁瑣思瘟,有時(shí)候一個(gè)內(nèi)網(wǎng)環(huán)境下用戶接入量少則幾千多則幾萬荸百,這要是一個(gè)一個(gè)手動(dòng)設(shè)置IP地址,工作量根本無法統(tǒng)計(jì)滨攻。
????????其實(shí)對(duì)于網(wǎng)管而言够话,哪臺(tái)電腦是什么IP地址似乎并不是很重要蓝翰,大多數(shù)人配置IP地址的目的也僅僅是為了上網(wǎng)。那么是否存在一種方式可以使得接入終端在連入互聯(lián)網(wǎng)后可以自動(dòng)獲取一個(gè)IP地址更鲁,而網(wǎng)管可以看到一張IP對(duì)應(yīng)電腦的關(guān)系表來進(jìn)行維護(hù)呢?
????????方案上肯定是可行的霎箍,這就涉及到了IP地址的動(dòng)態(tài)分配,即DHCP澡为。如下所示是客戶端一次完整的DHCP請(qǐng)求、續(xù)約的過程景埃。其中涉及三次數(shù)據(jù)交互媒至,分別為兩次請(qǐng)求(Discover-Offer、Request-ACK)一次續(xù)約(Request-ACK)谷徙【軉基于這三次交互客戶端就順利獲取并延續(xù)使用IP地址來訪問互聯(lián)網(wǎng)。
????????筆者來仔細(xì)看一下這幾個(gè)請(qǐng)求過程:
????????DHCP Discover:客戶端在剛接入網(wǎng)絡(luò)時(shí)完慧,本身是沒有IP地址的谋旦,這時(shí)候,客戶端需要在網(wǎng)絡(luò)內(nèi)發(fā)起一次discover的請(qǐng)求屈尼,這時(shí)候源地址是0.0.0.0册着,目的地址為255.255.255.255,來詢問網(wǎng)絡(luò)中哪臺(tái)設(shè)備是dhcp server脾歧。Discover報(bào)文只是在客戶端所在的子網(wǎng)內(nèi)進(jìn)行廣播甲捏。
????????DHCP Offer:dhcp server收到客戶端的discover報(bào)文后,為了響應(yīng)客戶端而回復(fù)一個(gè)offer報(bào)文鞭执。服務(wù)器會(huì)匹配客戶端所在的子網(wǎng)信息后會(huì)送給客戶端IP地址司顿。并在地址池中暫時(shí)保留該地址。
????????DHCP Request:對(duì)于實(shí)際使用的網(wǎng)絡(luò)兄纺,沒有網(wǎng)絡(luò)協(xié)議可以規(guī)定網(wǎng)絡(luò)中只能有一臺(tái)dhcp server大溜。當(dāng)客戶端收到多個(gè)dhcp offer的時(shí)候會(huì)根據(jù)先到先得的原則從中選取最先獲得的報(bào)文。之后客戶端會(huì)再次廣播一個(gè)名為request的報(bào)文告知所有響應(yīng)的dhcp server估脆。
????????DHCP ACK:dhcp server收到request報(bào)文钦奋,保留客戶端ip-mac地址。
????????DHCP Request(Renew/ACK):當(dāng)客戶端到了最大租期的一半時(shí)旁蔼,會(huì)向dhcp server發(fā)送一個(gè)request報(bào)文來申請(qǐng)續(xù)約锨苏,dhcp server給出回復(fù)(ACK)。
????????DHCP報(bào)文的8種類型:
????????經(jīng)過上述步驟棺聊,客戶端與服務(wù)器已經(jīng)建立了連接并進(jìn)行租期的續(xù)約伞租。除了上述discover、offer限佩、request葵诈、ack四種基礎(chǔ)的報(bào)文類型裸弦,還有以下四種:
????????DHCP NAK:當(dāng)DHCP收到客戶端的request報(bào)文之后,沒有發(fā)現(xiàn)相應(yīng)的租約記錄或某些原因(如地址池用盡)無法分配IP地址作喘,則返回客戶端NAK報(bào)文理疙。
????????DHCP Release:當(dāng)客戶端不使用所分配的IP地址時(shí),會(huì)發(fā)送release報(bào)文告知dhcp server泞坦。
????????DHCP Decline:當(dāng)客戶端收到dhcp的地址信息后窖贤,發(fā)現(xiàn)由于某些原因地址不可用(如地址沖突)會(huì)發(fā)送decline報(bào)文告知dhcp server。
????????DHCP Inform:當(dāng)客戶端希望獲取dhcp server詳細(xì)信息時(shí)會(huì)發(fā)送inform報(bào)文至服務(wù)器贰锁。
????????附:四種常見dhcp報(bào)文:https://ro.wikipedia.org/wiki/DHCP
????????DHCP協(xié)議:https://tools.ietf.org/html/rfc2131
????????熟悉了客戶端自動(dòng)獲取IP地址的過程赃梧,下一步筆者就開始搭建一臺(tái)DHCP服務(wù)器了。老樣子豌熄,先把上一章的TFTP服務(wù)停掉:/bin/systemctl stop xinetd.service
????????查看一下狀態(tài)確認(rèn)關(guān)閉:/bin/systemctl status xinetd.service
????????查看yum已經(jīng)安裝的dhcp軟件:yum list installed | grep dhcp
????????查看yum源關(guān)于dhcp的安裝軟件:yum list | grep dhcp
????????yum安裝DHCP:yum install dhcp.x86_64
????????安裝好之后授嘀,和之前TFTP一樣,筆者先對(duì)其進(jìn)行初始化設(shè)置:
????????cd /etc/dhcp/
????????cat dhcpd.conf
????????筆者看到第四行似乎有個(gè)example的配置文件锣险,果斷進(jìn)去看了看語句的格式蹄皱。熟悉之后筆者開始對(duì)dhcp的策略配置: cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
????????先介紹一下筆者的網(wǎng)絡(luò)情況,筆者之前配的馬賽克地址(一直以來稱作192.168.101.2)是筆者園區(qū)網(wǎng)絡(luò)的地址芯肤,這段地址在筆者的數(shù)據(jù)中心巷折,一般是固定地址供服務(wù)器使用。其余的一些地址則是由現(xiàn)網(wǎng)中的DHCP server分配纷妆,園區(qū)網(wǎng)絡(luò)中除了客戶端獲取地址之外盔几,基于ap-ac架構(gòu)的無線接入點(diǎn)也需要獲取地址,并同時(shí)需要下發(fā)option選項(xiàng)掩幢。而筆者園區(qū)網(wǎng)絡(luò)比較復(fù)雜逊拍,現(xiàn)網(wǎng)業(yè)務(wù)不能中斷,因此筆者考慮找兩段沒有用過的地址际邻,在專網(wǎng)(10.150.101.0/24)中進(jìn)行測(cè)試芯丧。首先筆者在10.150.101.0/24網(wǎng)段中測(cè)試一下同網(wǎng)段前半部分地址分發(fā),并為某臺(tái)設(shè)備綁定地址世曾;其次筆者新建一段地址10.150.100.0/24通過dhcp relay的方式為option 60字符為Aruba的設(shè)備下發(fā)ac地址缨恒。
????????明確了測(cè)試目標(biāo),筆者進(jìn)行dhcpd.conf的配置:
????????vi dhcpd.conf
????????首先進(jìn)行全局設(shè)置:
????????ddns-update-style none;
????????調(diào)整ddns的方式為none轮听,DDNS為域名解析提供了一種動(dòng)態(tài)關(guān)聯(lián)的機(jī)制骗露,其目的是為了實(shí)現(xiàn)客戶端地址變動(dòng)時(shí),dns解析可以跟隨主機(jī)的IP地址變動(dòng)血巍。由于客戶端完全可以通過mac-ip的綁定不使其地址變動(dòng)萧锉,所以該功能在網(wǎng)絡(luò)中應(yīng)用意義不大,就直接設(shè)置為none了述寡。
????????http://www.zytrax.com/books/dns/ch9/dhcp.html
????????ignore client-updates;
????????同上柿隙,客戶端更新叶洞,直接關(guān)閉。
????????default-lease-time 3600;
????????該字段是標(biāo)識(shí)dhcp租約的時(shí)間禀崖,筆者在全局模式下設(shè)置為1小時(shí)=3600秒衩辟。
????????max-lease-time 86400;
????????最大租約時(shí)間,如果某地址池設(shè)置的租約時(shí)間大于該閾值波附,則生效艺晴。設(shè)置為1天。
????????option domain-name "hbai.com";
????????option domain-name-servers 10.150.101.249;
????????設(shè)置dns服務(wù)器為本機(jī)地址掸屡,使得dhcp server可以同時(shí)下發(fā)dns供服務(wù)器域名解析财饥。
????????class "aruba" {
???????????????match if substring (option vendor-class-identifier, 0, 7) = "ArubaAP";
????????}
????????定義一個(gè)class規(guī)則,匹配字符“ArubaAP”折晦。
????????option serverip code 43 = string;
????????option serverip31:31:2e:31:31:31:2e:31:2e:31:31:31;
????????設(shè)置option 43下發(fā)的ac地址為11.111.1.111以ascii來表示。
????????全局模式下配置差不多就這些沾瓦,下面就是定義一些地址池满着,新建兩段地址用做測(cè)試。整個(gè)文件的配置如下:
????????配置中贯莺,筆者新建了同網(wǎng)段的一個(gè)地址池10.150.101.10-10.150.101.100风喇,對(duì)匹配到字符為Aruba的設(shè)備下發(fā)地址,同時(shí)缕探,筆者有臺(tái)mac后四位為137d的設(shè)備魂莫,對(duì)其綁定地址10.150.101.55。
? ? ? ? 同時(shí)爹耗,筆者新建了一段10.150.100.0的網(wǎng)段耙考,進(jìn)行地址分配。
????????配置參數(shù)完成后參考之前的策略潭兽,開放防火墻udp67端口倦始。
????????firewall-cmd --list-all
????????firewall-cmd --zone=public --del-port=67/udp–permanent
????????firewall-cmd –reload
????????cd /etc/firewalld/zones/
????????cat public.xml
????????開啟dhcp服務(wù):systemctl start dhcpd
????????開啟dns服務(wù):systemctl start named
????????對(duì)于一臺(tái)客戶機(jī)而言,取到地址是一件非常簡單的事情山卦,只要在操作系統(tǒng)上設(shè)置為自動(dòng)獲取地址鞋邑,等待地址獲取就可以了。由于故障排查的要求账蓉,筆者需要對(duì)整個(gè)dhcp地址獲取枚碗、續(xù)租、釋放等過程都需要有深刻的理解铸本,因此筆者在內(nèi)網(wǎng)的一臺(tái)跳板機(jī)抓包分析dhcp的獲取過程和option字段肮雨。
????????在同網(wǎng)段的某臺(tái)內(nèi)網(wǎng)windows設(shè)備上開啟wireshark,選擇網(wǎng)卡后在搜索欄中篩選關(guān)于dhcp的報(bào)文:bootp
????????(wireshark官網(wǎng)地址:https://www.wireshark.org/#download)
????????很幸運(yùn)归敬,筆者的專網(wǎng)比較干凈(無大量設(shè)備自動(dòng)獲取地址)酷含,因此抓到了一個(gè)完整的dhcp四次交互過程:
????????如上圖所示鄙早,是筆者一臺(tái)mac末尾為137d的設(shè)備進(jìn)行dhcp獲取地址的過程。在這臺(tái)設(shè)備接入網(wǎng)絡(luò)后椅亚,即開始發(fā)送DHCP Discover報(bào)文限番,當(dāng)筆者的dhcp服務(wù)器在67端口監(jiān)聽到該報(bào)文后就會(huì)恢復(fù)客戶端DHCP Offer報(bào)文,由于筆者在配置文件中將其mac綁定了地址10.150.101.55呀舔,因此服務(wù)器將該地址返回給客戶端弥虐,再經(jīng)過request和ack兩個(gè)階段后客戶端成功獲取地址。
????????首先筆者查看discover報(bào)文媚赖,在該報(bào)文中首先看option 55的請(qǐng)求參數(shù)列表霜瘪,客戶端會(huì)向服務(wù)器請(qǐng)求如下option參數(shù)。
????????在報(bào)文中并沒有看到客戶端請(qǐng)求option 43的信息惧磺,筆者的客戶端在發(fā)起dhcp請(qǐng)求時(shí)颖对,除了獲取到想要的IP地址之外,還請(qǐng)求了包括子網(wǎng)掩碼磨隘、廣播地址缤底、網(wǎng)關(guān)、dns番捂、主機(jī)名个唧、NTP、MTU的信息设预。
????????查看一下discover報(bào)文中的option 60徙歼,是F5Nerworks。該字段標(biāo)識(shí)了客戶端的廠商信息鳖枕。
????????當(dāng)客戶端發(fā)起一次請(qǐng)求之后魄梯,dhcp服務(wù)器就會(huì)對(duì)其進(jìn)行響應(yīng),這個(gè)報(bào)文就是DHCP offer報(bào)文耕魄。
????????查看報(bào)文中的option 53画恰、option 54信息,看到報(bào)文類型為offer吸奴,dhcp服務(wù)器地址為筆者服務(wù)器的地址允扇。
????????查看報(bào)文中option 51,看到筆者在服務(wù)器端設(shè)置的默認(rèn)lease time為1H则奥。
????????查看報(bào)文中option 1考润、option 3,看到筆者設(shè)置的掩碼和網(wǎng)關(guān)读处。
????????查看該報(bào)文中的option 15糊治、option 6,看到筆者下發(fā)的dns server ip為10.150.101.249罚舱,dns下發(fā)成功井辜。
????????后面兩個(gè)交互的報(bào)文是客戶端和服務(wù)器確認(rèn)地址獲取成功绎谦,option信息基本相同,就不再細(xì)看了粥脚。
????????最后再看一下dhcp的租約信息窃肠。Linux的租約目錄在/var/lib/dhcpd/下,進(jìn)入該目錄cat dhcpd.leases文件就可以看到地址和租約了~
????????該文件記錄了某時(shí)間點(diǎn)IP地址和客戶端MAC地址的對(duì)應(yīng)關(guān)系刷允,一旦需要溯源冤留,就可以以這個(gè)文件為準(zhǔn)了。筆者測(cè)試時(shí)間測(cè)試跨度比較長树灶,其間地址綁定等操作陸陸續(xù)續(xù)測(cè)試了多次纤怒,這個(gè)租約是某周末前后筆者截取的一段log,其中137d的地址綁定已經(jīng)被筆者釋放了天通,這個(gè)測(cè)試階段測(cè)試了已經(jīng)獲取地址設(shè)備的續(xù)約泊窘,使用了兩臺(tái)設(shè)備分別下發(fā)了地址池第一個(gè)和最后一個(gè)地址。
????????還有一些遺憾像寒,由于出差筆者沒法找到合適的設(shè)備測(cè)試option 60字段是否下發(fā)成功州既,文中關(guān)于option 60的一些配置是查看相關(guān)的文檔資料配置的,這個(gè)在文件“cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example”中就有配置的例子萝映,但要抓到option 43的報(bào)文還需要進(jìn)行下一步的驗(yàn)證。
????????附上一個(gè)客戶端dhcp狀態(tài)圖阐虚,度娘上直接搜的序臂。可以更方便的理解客戶端在不同狀態(tài)間的轉(zhuǎn)換实束,有興趣的朋友可以根據(jù)不同的狀態(tài)抓取相應(yīng)的報(bào)文仔細(xì)分析奥秆。到此為止客戶端獲取地址并續(xù)約的過程已經(jīng)實(shí)現(xiàn)。
????????CSDN一篇對(duì)DHCP option解讀:http://blog.csdn.net/nosodeep/article/details/45971677