二層交換機(jī)工作原理很簡單,其實是存在一定的安全隱患的。例如未知的單播泛洪就是常見的攻擊方式,當(dāng)二層交換機(jī)接收到一個單播包后,如果其包含的MAC地址沒有出現(xiàn)在CAM表中,交換機(jī)會將該包向相同廣播域中的所有接口進(jìn)行轉(zhuǎn)發(fā),就形成了泛洪現(xiàn)象。這實際上是交換的默認(rèn)行為,但不同的交換機(jī)的CAM表包含的項目是有限的,例如對于Cisco Catalyst 3560來說,容量為12KB,對于Cisco Catalyst 6500E來說,容量為128KB等。如果添加的條目超過限制值,就會被覆蓋或者丟棄。
這樣,如果有人在當(dāng)連接在同一廣播域的某臺主機(jī)上利用黑客工具,在很短的時間內(nèi)發(fā)送了大量包含偽造源MAC地址的數(shù)據(jù)包,當(dāng)交換機(jī)接收到這些數(shù)量龐大的數(shù)據(jù)包,就會不停重復(fù)以上談到的操作,即頻繁的將虛假的源MAC地址和相關(guān)端口信息添加到CAM表中,很容易將CAM表填滿,并覆蓋其中原本正常合法的項目。這樣,當(dāng)合法的主機(jī)(例如PC1)向目標(biāo)主機(jī)(例如PC2)發(fā)送的正常的單播數(shù)據(jù)包時,交換機(jī)會認(rèn)為其是一個未知的單播,這是因為CAM表已經(jīng)被非法數(shù)據(jù)占滿,交換機(jī)在其中查不到對應(yīng)的項目,所以交換機(jī)會將該包向相同VLAN和端口和Trunk進(jìn)行轉(zhuǎn)發(fā)。這樣,不僅PC2收到了PC1發(fā)來的數(shù)據(jù)包,別的主機(jī)上黑客也會收到該數(shù)據(jù)包,黑客利用嗅探工具就可以截獲PC1到PC2的通訊流量。
當(dāng)然,相關(guān)的攻擊方式還有很多。例如黑客可以進(jìn)行偽造MAC地址攻擊,當(dāng)PC1和PC2正常通訊時,如果PC2獲得了PC1的MAC地址,黑客就會偽造包含PC1的MAC地址的數(shù)據(jù)包,當(dāng)交換機(jī)接收到后,會認(rèn)為和PC3通訊的目標(biāo)主機(jī)為PC2,就會將原本發(fā)送給PC1的數(shù)據(jù)發(fā)送給PC3。因為二層交換機(jī)是根據(jù)接收到的數(shù)據(jù)包來不停的刷新其CAM表。利用Port Security技術(shù),可以有效阻止以上攻擊的發(fā)生。通過限制交換機(jī)上特定端口可以學(xué)習(xí)到的MAC地址的數(shù)量,將會觸發(fā) Shutdown、Restrict、Protect等行為,讓MAC地址泛洪攻擊失效。
當(dāng)交換機(jī)指定端口學(xué)習(xí)到的MAC地址數(shù)量超標(biāo)時,默認(rèn)執(zhí)行Shutdown動作模式該接口處于errordisable狀態(tài)并且報警。如果指定了第二種方式,則丟棄不合規(guī)的數(shù)據(jù)包并且報警。如果指定了第三種方式,則直接丟棄違規(guī)的數(shù)據(jù)包并且不報警。對于同一個MAC地址來說,在交換機(jī)的中的同一個VLAN中的兩個不同接口不能同時將其學(xué)習(xí)到,這可以防止偽造MAC地址攻擊。注意,在默認(rèn)情況下,所有接口的Port Security的功能是禁用的。每個接口最大的MAC地址容量為1個。對于交換機(jī)的地址學(xué)習(xí)方式來說,包括自動學(xué)習(xí)(默認(rèn)),手工指派和Stick(粘帖)。對于手動指派來說,可以為指定的端口綁定某個MAC地址,如果其他的主機(jī)連接上來,則視為違規(guī)。對于網(wǎng)絡(luò)打印機(jī),網(wǎng)絡(luò)攝像頭等特殊的設(shè)備來說,因為其MAC地址不易查看,所以可以采用Sticky方式獲得,即讓指定端口學(xué)習(xí)到的第一個MAC地址以粘帖的方式進(jìn)行綁定。
例如,當(dāng)?shù)卿浀浇粨Q機(jī)上后,執(zhí)行“sh port-securoty interface ethernet 0/0”命令,在返回信息中的“Port Security”欄中如果“Disable”字樣,說明該端口的Port Security功能沒有開啟。執(zhí)行“config t”、“int ethernet 0/0”、“switch port-security”,來針對該端口開啟Port Security功能。注意,如果是動態(tài)協(xié)商成Trunk的接口是不能開啟Port Security功能的,只能是Access接口才可以??梢詧?zhí)行“switchport mode access”,“swithport access vlan x”命令,將其修改為Access模式即可。
執(zhí)行“switchport portsecurity maximum x”命令,可以將該端口最大可以學(xué)習(xí)的端口數(shù)量設(shè)置為“X”,“X”為具體的數(shù)量值。執(zhí)行“switchport port-security violation protect”命令或“switchport port-security violation restrict”命令,設(shè)置對應(yīng)的動作模式。執(zhí)行“switchport port-security mac-address x.x.x.x”命令,手動綁定指定MAC地址。執(zhí) 行“switchport port-security mac-address sticky”命令,允許自動粘貼首個傳入的MAC地址。至于綁定多少個地址,以設(shè)置的許可數(shù)值為準(zhǔn)。執(zhí)行“exit”,“sh run int ethernet 0/0”命令,可查看該端口下的配置信息。在返回信息中如果出現(xiàn)“Ethernet 0/0 is down,line protocol is down(error-disabled)”之類內(nèi)容,說明在該端口出現(xiàn)了違規(guī)問題。
引起error-disable狀態(tài)的原因有很多,在全局配置模式下執(zhí)行“errdisable recovery cause?” 命 令,會顯示所有可能的原因,這里顯然是因為“securityviolation”引發(fā)的。對于處于error-disable狀態(tài)的端口,恢復(fù)的方法包括自動和手動模式,對于前者來說,可執(zhí)行“errdisable recovery cause security-violation”命令,開啟自動恢復(fù)功能,注意需要在該命令中指明違規(guī)的原因。執(zhí)行“errdisable recovery interval x”命令,設(shè)置恢復(fù)時間,單位為秒,范圍從30到86400。執(zhí)行“sh errdisable recovery”命令,顯示允許自動恢復(fù)的項目。例如將恢復(fù)時間設(shè)置為30秒,當(dāng)達(dá)到時間點(diǎn)后,該端口會自動恢復(fù)。但是如果黑客的攻擊持續(xù)不斷,該端口會不斷的處于關(guān)閉和恢復(fù)狀態(tài),這無疑會白白的消耗資源。因此,使用手動恢復(fù)可以有效避免該問題。其實現(xiàn)方法很簡單,執(zhí)行“config t”,“int eth 0/0”,“shutdown”,“no shut”命令,即可恢復(fù)該端口活力。
當(dāng)多臺交換機(jī)連接成一個環(huán)路時,會使用特定的法則算出一個接口被Block阻塞,方法是首先選擇根橋,其上的所有端口都處于轉(zhuǎn)發(fā)狀態(tài),之后在每個非根橋上選擇一個根端口,使其處于轉(zhuǎn)發(fā)狀態(tài),并在每一個網(wǎng)段選擇一個指定端口,將其設(shè)置為轉(zhuǎn)發(fā)狀態(tài),之后剩下的端口都處于Block狀態(tài)。不管處于什么情況,只要交換機(jī)組成環(huán)路,都會使用STP技術(shù)為其Block一個接口。
從環(huán)路的結(jié)構(gòu)上分析,對于根橋來說,所有端口都處于轉(zhuǎn)發(fā)狀態(tài),如果有人非法連接了一個交換機(jī),如果其優(yōu)先級最低,就將根橋的角色搶奪過來,造成原來網(wǎng)絡(luò)的Block端口發(fā)生變化,該交換機(jī)上所有端口會自動處于轉(zhuǎn)發(fā)狀態(tài),因為根橋可以匯聚流量,所有一旦讓其得手,只要黑客在該交換機(jī)上連接一臺主機(jī),開啟專用的嗅探抓包軟件,就可以捕獲該根橋上的所有數(shù)據(jù),這樣,網(wǎng)絡(luò)中的所有流量就會徹底暴露在黑客面前。
為了避免上述攻擊方式,就需要采取Root Guard技術(shù),避免讓根橋隨意發(fā)生變化。其原理是當(dāng)確定某臺交換機(jī)處于根橋角色時,則其他接入的交換機(jī)禁止搶奪根橋角色。例如在交換機(jī)管理命令行中執(zhí)行“interface fa 0/1”,“spanning-tree guard root”命令,就可以針對fa 0/1接口Root Guard功能。此外,采用BPDU Guard方法,也可以實現(xiàn)同樣的防護(hù)功能。
我們知道,BPDU是交換機(jī)用來選擇根橋以及計算哪些端口會被Block的數(shù)據(jù)包,對于有些端口(例如一些Access端口等)來說,是沒有必要收到BPDU包的。對于這些Access端口來說,需要配置BPDU功能功能。對于BPDU的過濾,包括BPDU Guard 和 BPDU Filtering。對于前者來說,其安全級別最高,一旦被在端口下啟動了BPDU Guard功能,只要其收到BPDU包,會自動將其設(shè)置為errdisable狀態(tài),并發(fā)出警告信息。
例如,執(zhí)行“interface fa 0/1”、“spanning-tree bpduguard enable”命 令,可以在指定端口上啟用BPDU Guard功能。如果執(zhí)行“errdisable recovery cause bpduguard”、“errdisable recovery interval 30”、“spanningtree portfast bpduguard default”命令,可以在全局啟動BPDU Guard功能。如果端口的errdisable狀態(tài)是因為BPDU Guard安全違規(guī)引起的,則經(jīng)過30秒自動恢復(fù)。對于后者來說,當(dāng)其端口發(fā)送和接收到BPDU包后,可以自動將其丟棄。執(zhí)行正常的數(shù)據(jù)包轉(zhuǎn)發(fā)操作,對BPDU包不予理睬。執(zhí)行“interface fa 0/1”、“spanning-tree bpdufilter enable”、“spanning-tree portfast bpdufilter default”命令,可以在指定端口開啟BPDU Filtering功能。
對于VALN跳躍攻擊,同樣不能掉以輕心。對于在Trunk鏈路行傳輸?shù)臄?shù)據(jù)包,才可以打上tag標(biāo)記,用來區(qū)分不同的VLAN的流量。但是在Access接口的二層數(shù)據(jù)包中的以太網(wǎng)頭部是無法打上tag的。
因此需要利用Trunk封裝技術(shù),Trunk封裝分為兩種,包括Dot802.1Q和ISL。對于Dot802.1Q封裝來說,會在二層數(shù)據(jù)包以太網(wǎng)網(wǎng)頭部插入Dot802.1Q字段。對于后者來說,會在數(shù)據(jù)包以太網(wǎng)網(wǎng)頭部打上ISL包頭。因此,只能在不同交換機(jī)之間的Trunk鏈路上為數(shù)據(jù)包打上tag標(biāo)記。
對于不同VALN之間的數(shù)據(jù)包,會分別添加不同的Tag信息。例如對于VLAN10流量來說,插入的tag值為10,對于VLAN20流量來說,插入的tag值為20。當(dāng)對方的交換機(jī)接收到這些流量數(shù)據(jù)包后,會根據(jù)不同的tag標(biāo)記值,將對應(yīng)的數(shù)據(jù)包發(fā)送給關(guān)聯(lián)的VALN。
但是,當(dāng)交換機(jī)的一個Access接口接收到一個帶有tag的包時(雖然理論上不會這樣)。如果該包的tag值和該端口所屬的VALN號相同,則直接接受。如果該包的tag值和該端口所屬的VALN號不一致,則將其直接丟棄。在Dot802.1Q中存在名為Native VLAN的概念,其默認(rèn)為VLAN 1,是不會打上tag的。要想實現(xiàn)VLAN跳躍攻擊,必須基于Native VLAN才可以進(jìn)行。
例如,如果黑客連接的交換機(jī)端口從屬于VLAN 9,那么Trunk的Native VALN必須是VLAN 9才行。如果黑客攻擊的目標(biāo)主機(jī)連接到另外一臺交換機(jī),其位于VLAN 100。那么黑客可以對發(fā)送的數(shù)據(jù)包打上數(shù)值為100的tag,因為數(shù)據(jù)包的上層還需要封裝一個tag,其值為其連接的交換機(jī)接口VLAN號,才可以被該接口所接受。但是該 VALN是 Native VLAN,所以會打上該tag標(biāo)記來欺騙交換機(jī)端口。交換機(jī)接收到黑客偽造的數(shù)據(jù)包后,自然會正常接收,之后將其發(fā)送到Trunk鏈路上,而Trunk鏈路實際上從屬于任何VLAN的,自然不會將其丟棄,Trunk的一端會將該包的外層標(biāo)簽剝離,并將其該數(shù)據(jù)包發(fā)送過去。
在Trunk的另一端會將該包的外層標(biāo)簽剝離,之后發(fā)現(xiàn)內(nèi)層標(biāo)簽還有一個VLAN號,就會將其剝離并將封裝的數(shù)據(jù)發(fā)送給對方交換機(jī)的VLAN 100,這樣該數(shù)據(jù)包就會到達(dá)目標(biāo)主機(jī)。防御VLAN跳躍攻擊的方法是確保和用戶主機(jī)連接的交換機(jī)接口配置為Access模式,并Shutdown所有未使用的端口,即使不能全部Shutdown,也至少將所有的未使用接口設(shè)置為Access狀態(tài),使其無法協(xié)商Trunk協(xié)議,并將其放入一個未被使用的VALN中,因為該VLAN沒有配置網(wǎng)關(guān),所以自然不會和外界通訊。之后在Trunk鏈路上配置一個虛假的并不存在不被使用Native VLAN。
對于VALN跳躍攻擊來說,有效的防御方法需要從設(shè)計角度來考慮。例如,在全局配置模式下執(zhí)行“vlan 199”、“shutdown”、“vlan 198”、“shutdown”命令,創(chuàng)建VLAN 198和VLAN 199,并 將 其 Shutdown。 執(zhí)行“int range f0/15-20”命令,進(jìn)入f0/15-20端口范圍中,假設(shè)這些端口未被使 用。 執(zhí) 行“switchport access vlan 199” 命 令,將其劃入VLAN 199。執(zhí)行“switchport trunk encapsulation dot1q”命令,將其封裝為Trunk接口,執(zhí)行“switchport mode trunk”、“switch nonegotiate” 命令,設(shè)置Trunk非協(xié)商功能,禁止其發(fā)送協(xié)商信息。執(zhí)行“switchport trunk native vlan198”命令,將VLAN 198設(shè)置為Native VLAN。這樣,VLAN 998和VLAN 999為手工關(guān)閉的VLAN,并將沒有使用到的接口放置到其中。
如果想使用某個未用接口(例如 f 0/15),可以執(zhí)行“int f 0/15”,“switchport access vlan 50”命令,將其放置到VLAN 50中,這里的VLAN 50為正常的可以使用的VALN。這樣,就可以正常使用該端口了。不用的話,可以執(zhí)行“switchport access vlan 199”命令,將其移動到關(guān)閉掉的VALN中。這樣的話,這些未使用的端口就處于安全狀態(tài)了。將Trunk協(xié)議設(shè)置為ON模式,禁止其自動協(xié)商,并禁止其定期發(fā)送相關(guān)消息。將Trunk上的Native VLAN設(shè)置為一個不使用的VLAN,在Tunk鏈路上配置所需要承載的具體的VLAN,并且為Native VLAN打上tag 標(biāo) 記。 假 設(shè)F0/19,f0/21為Trunk接口,執(zhí)行“int range f/19,f0/21”命令,對其進(jìn)行配置。執(zhí)行“switchport trunk allowed vlan 10,20,30”命令,只允許其傳遞VLAN10/20/30的流量,這些VAN是正常可以正常使用的。執(zhí)行“valn dot1q tag native”命令,對Native VLAN也打上tag標(biāo)記,即將Native VLAN排除在外并禁止使用。