網(wǎng)關 : IP = IP-1, MAC = 11:11:11:11:11:11
本機 : IP = IP-2, MAC = 22:22:22:22:22:22
主機A: IP = IP-A, MAC = AA:AA:AA:AA:AA:AA
主機B: IP = IP-B, MAC = BB:BB:BB:BB:BB:BB
主機C: IP = IP-C, MAC = CC:CC:CC:CC:CC:CC
子網(wǎng)內(nèi)的任意兩臺主機(網(wǎng)關也可看作一臺主機)要正常通訊,需要互相知道對方的網(wǎng)卡地址MAC。如果一方不知道對方的MAC,就要進行ARP查詢。
ARP 查詢過程在一個正常的子網(wǎng)內(nèi),一次完整的 ARP 查詢需要一次查詢廣播和一次點對點的應答。查詢廣播中包含了要查詢主機的IP,此廣播可以被子網(wǎng)內(nèi)的每一臺主機的網(wǎng)卡收到,網(wǎng)卡會檢查要查詢的IP是否與自己的IP相等,不等則直接丟棄,相等則將此數(shù)據(jù)包提交給系統(tǒng)內(nèi)核(一個中斷),內(nèi)核調(diào)用網(wǎng)卡驅(qū)動解析收到的數(shù)據(jù)包,然后構建一個應答數(shù)據(jù)包回送到查詢的主機,查詢主機收到應答后更新自己的ARP緩存表。
對應 LnS 的設置,此通訊過程需要兩條規(guī)則,以本機查詢主機B的MAC為例
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允許本機廣播出站)
② 22:22:22:22:22:22 <= BB:BB:BB:BB:BB:BB (允許主機B應答本機入站)
規(guī)則說明方式:=> 表示傳出,<= 表示傳入,== 表示雙向。
注意按此設置 LnS 規(guī)則時,有方向規(guī)定的始終要將源放在左邊,目標放在右邊,對方向為雙向的始終將本機放在左邊,遠端放在右邊。
只要將此查詢過程中的任何一步掐斷,則該查詢過程就會失敗。比如有人找你公司的討債,總經(jīng)理秘書可以想各種理由使債主見不到總經(jīng)理,即使見到了,總經(jīng)理也可以找財務不在或目前實在沒錢為由不付錢,討債就失敗了。這兩個方法就好比攔截廣播和攔截應答。
子網(wǎng)內(nèi)的兩臺主機要能夠完整的通訊(雙方都可收發(fā)數(shù)據(jù))必須互知對方的MAC地址,比如本機要跟主機B完整通訊,還必須讓主機B也能查詢到自己的 MAC。
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允許本機廣播出站)
② 22:22:22:22:22:22 <= BB:BB:BB:BB:BB:BB (允許主機B應答本機入站)
③ FF:FF:FF:FF:FF:FF <= BB:BB:BB:BB:BB:BB (允許主機B廣播入站)
④ 22:22:22:22:22:22 => BB:BB:BB:BB:BB:BB (允許本機應答主機B出站)
顯然規(guī)則②④在LnS中是可以合并的,則兩臺機器完整通訊只須 3 條規(guī)則:
① 22:22:22:22:22:22 => FF:FF:FF:FF:FF:FF (允許本機廣播出站)
② FF:FF:FF:FF:FF:FF <= BB:BB:BB:BB:BB:BB (允許主機B廣播入站)
③ 22:22:22:22:22:22 == BB:BB:BB:BB:BB:BB (允許本機與主機B相互應答)
前面說了,一次查詢過程需要一次廣播和一次應答,但 ARP 協(xié)議中并不要求廣播與應答成對出現(xiàn),也就是可以沒有廣播,任何一臺主機都可以主動發(fā)送應答數(shù)據(jù)包,如果目標主機沒有使用靜態(tài)MAC,則只要收到應答廣播就會更新自己的ARP緩存表。因此,我們可以人為的構建一個錯誤的應答數(shù)據(jù)包讓目標主機更新自己的ARP緩存。
比如從本機控制,不讓主機A與主機B通訊:
本機向主機A發(fā)送應答數(shù)據(jù)包,告訴它 IP-B 的 MAC 是 XX:XX:XX:XX:XX:XX
本機向主機B發(fā)送應答數(shù)據(jù)包,告訴它 IP-A 的 MAC 是 YY:YY:YY:YY:YY:YY
此時主機A和主機B的 ARP 緩存中關于對方的MAC都錯誤的,他們互發(fā)數(shù)據(jù)時就會發(fā)到一個錯誤或都根本不存在(取決于偽造的MAC)的網(wǎng)卡,A、B 間的通訊自然失敗。(其實只要其中一臺的ARP緩存錯誤,A、B 間的通訊就會表現(xiàn)不正常)
想想,如果偽造的應答數(shù)據(jù)包是告訴主機B:IP-1 的 MAC 是 ZZ:ZZ:ZZ:ZZ:ZZ:ZZ 會怎么樣?則主機B與網(wǎng)關通訊會不正常,就會表現(xiàn)為斷網(wǎng)。如果同時對網(wǎng)關欺騙,告訴它主機B的MAC為一個錯誤值,且這種欺騙一直持續(xù),則主機B無法上網(wǎng)了。
大家常說的網(wǎng)絡執(zhí)法官就是利用ARP欺騙來踢人的。執(zhí)法官運行時首先會大量發(fā)送廣播,獲得所有主機的MAC地址,然后,想欺騙誰,就向誰發(fā)送偽造的應答數(shù)據(jù)包。
當然,ARP欺騙決不僅止于此,比如還可以使目標主機斷線后將自己的MAC偽造成被欺騙主機的MAC達到特殊目的,或者同時欺騙網(wǎng)關與目標主機,但是用自己的MAC代替?zhèn)卧鞈饠?shù)據(jù)包中的隨機MAC并開啟本機的數(shù)據(jù)轉(zhuǎn)發(fā)功能,插入到網(wǎng)關與目標主機通訊中充當代理,達到監(jiān)聽目標主機的目的。但本文的目是要說明LnS中的ARP規(guī)則如何設置,ARP欺騙不是重點。
ARP 防范
說到這樣,大家肯定已經(jīng)發(fā)現(xiàn)一個問題:欺騙者必須能與被欺騙者通訊,以便發(fā)送偽造的應答數(shù)據(jù)包,否則欺騙過程就不能完成。基于這點,我們可以從幾個地方來防止 ARP 欺騙:
一、不讓非信任的主機查詢自己的MAC,欺騙者不能與本機通訊,自然無從欺騙了
可以攔截它的查詢廣播(要錢的一律不許進門)
可以攔截本機對它的應答(都來要吧,我就一句話,沒錢,死豬不怕開水燙)
二、使用靜態(tài)MAC,拒絕更新ARP緩存。
即使有仿造應答到達本機,但本機不使用該包更新自己的ARP緩存,欺騙失敗。 那么為什么使用變種二方法的網(wǎng)友實際中“可行”了?說可行是因為過濾太嚴格,能防止絕大數(shù)大ARP欺騙,加引號是因為可行是暫時的,連續(xù)的長時間測試,很可能會斷網(wǎng)的。
這跟具體的網(wǎng)絡環(huán)境有關系,可能的原因比較多。一種可能的原因是LnS有BUG,過濾起作用在本機與網(wǎng)關建立連接之后,或者使用了靜態(tài)MAC、指定IP避免DHCP租約失效之類,具體的我也分析不清楚。但從原理上說,這方法是錯誤的。
安全是相對的
防止ARP欺騙最好的辦法在網(wǎng)關和各子機上均采用靜態(tài)MAC綁定。防火墻只能增加安全系數(shù),不能保證絕對完全,一是因為防火墻可能有BUG或者功能本身不完善又或者設置不善,二是現(xiàn)實中的妥協(xié)可能存在漏洞。比如本機為了上網(wǎng)信任了網(wǎng)關,同時為了共享信任了主機B,但主機B是沒有任何安全防護,攻擊者可以從主機B下手,迫使主機B當機后將自己偽造主機B的IP與MAC,獲得與本機通訊的能力后再用其它辦法攻擊,更嚴重的情況是如果網(wǎng)關本身不安全,那么在本機上如何防護都不能取得較好的效果。