二層轉(zhuǎn)發(fā)和Vlan陷阱
通常來說,物理層的一串比特位到數(shù)據(jù)鏈路層后,會被組成幀,并做檢驗和校驗——只有校驗和通過的幀才被轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)的概念對于交換機(jī)來講就是基于MAC地址的轉(zhuǎn)發(fā),最初的二層轉(zhuǎn)發(fā)設(shè)備是僅僅基于MAC地址的,用于局域網(wǎng)(LAN),后來由于廣播泛濫和通信安全性的考慮,采用vlan對不同的通信域進(jìn)行隔離。Vlan(虛擬局網(wǎng),Virtual Local Area Network)是不是網(wǎng)絡(luò)上第一個網(wǎng)絡(luò)虛擬化的技術(shù)我不清楚,但是是我接觸到的第一個網(wǎng)絡(luò)虛擬化技術(shù)。
MAC地址就是每個網(wǎng)絡(luò)設(shè)備上的物理地址,
Vlan技術(shù)是通過對原來的報文在MAC地址頭后加入4byte的數(shù)據(jù)來識別和標(biāo)志vlan,具體如下:
其中TYPE ID(簡稱TPID)例子中是0×8100,其實這個不是必須的,稍微高級點的交換芯片都支持配置,這個功能稱為Q-IN-Q;因為處于二層隧道或者vlan id不夠用的用途,可以給一個報文打上兩個vlan tag,并且兩個vlan tag的TPID可以不同,也可以相同。而對于報文能靈活刪添或修改vlan tag的功能稱之為靈活Q-IN-Q。
后面的3bit user priority用于一般稱之為COS值,用于二層QOS功能,再后面的1bit就是前面文章說的CFI(Canonical Format Indicator),為0表示該幀格式為用于802.3或EthII封裝,常用于以太網(wǎng)類網(wǎng)絡(luò)和令牌環(huán)類網(wǎng)絡(luò)之間,如果在以太網(wǎng)端口接收的幀具有CFI,那么設(shè)置為1,表示該幀不進(jìn)行轉(zhuǎn)發(fā)
自從vlan技術(shù)出現(xiàn)后,二層轉(zhuǎn)發(fā)在交換機(jī)中便不再是僅僅基于MAC地址的學(xué)習(xí)和轉(zhuǎn)發(fā),而是基于mac vlan的學(xué)習(xí)和轉(zhuǎn)發(fā),下面結(jié)合BCM和MVL等芯片廠商的處理過程介紹下大致流程如下:
其實轉(zhuǎn)發(fā)的過程比較簡單,需要說明的是以下幾點:
1. 對于SMAC=DMAC的攻擊報文高級的交換芯片可配置直接丟棄;
2. Vlan tag的識別和獲取過程很復(fù)雜,后續(xù)詳細(xì)介紹;
3. SMAC Vid的查找通??梢缘?,但是某些芯片內(nèi)部一個沒有tag的報文怎么處理?這個不同芯片處理方式不同,即使是同一個廠商的,有的是丟棄,有的是廣播,有的是可配;
4. DMAC 為0x0180c2開頭的報文主要用于一些二層協(xié)議報文,包括流控,LLDP,LACP等;
5. 交換機(jī)芯片通常進(jìn)行報文單播和廣播,默認(rèn)不開啟組播功能,但是從數(shù)學(xué)角度講,單播和廣播都可以看做是組播的兩個邊界值;這和物理學(xué)的很多定理類似,理論學(xué)習(xí)時推廣到通常的公式很難,但是實際上經(jīng)常發(fā)生的情形卻是理論上極為簡單的幾種特殊情況;另外,如果DMAC VID 查找不到相應(yīng)的表項,默認(rèn)動作是廣播到除源端口外的所有端口,通常交換芯片也可以配置為丟棄、上CPU等動作。
6. 二層組播的協(xié)議主要有IGMP等,原理有很多地方可以參考,現(xiàn)在主要有三個版本,二層組播和三層組播的MAC和IP對應(yīng)關(guān)系為:
7. 二層里報文沒有防止成環(huán)的字段,這就導(dǎo)致一旦鏈路有環(huán),將會發(fā)生極其災(zāi)難的事故,隨之提出STP協(xié)議來解決這個問題,但是STP協(xié)議隨著網(wǎng)絡(luò)規(guī)模的擴(kuò)大,到100臺網(wǎng)絡(luò)設(shè)備的規(guī)模的時候,一旦網(wǎng)絡(luò)拓?fù)浒l(fā)生變化,其響應(yīng)適應(yīng)網(wǎng)絡(luò)變化的能力就會被體現(xiàn)的體無完膚;雖然后來提出了RSTP、MSTP等改進(jìn),但是依然跑脫不了對鏈路帶寬的浪費等缺陷,直至提出了復(fù)雜的trill協(xié)議;所以三層報文IP頭部設(shè)計的時候就考慮了TTL這個防環(huán)的字段;
8. 每個端口都有自己的MTU,當(dāng)CPU通過端口發(fā)包時,在協(xié)議棧是可以對報文分片的,這個時候分片的依據(jù)是該vlan內(nèi)的所有端口的最小MTU值;
9. 為了實現(xiàn)不同vlan的端口能相互通信,引入了端口的trunk屬性的概念,可以實現(xiàn)一個端口屬于多個vlan,從而實現(xiàn)多個vlan間的通信;這個概念是將端口分為三類:Access,trunk,hybrid;交換機(jī)所有端口默認(rèn)是access口,此口出入只轉(zhuǎn)發(fā)vlan id和端口 native vlan相同的報文;trunk口時能出入轉(zhuǎn)發(fā)所有vlan id的報文,這里的所有是指交換機(jī)上已經(jīng)創(chuàng)建的vlan,但是出去的時候如果vlan id和native id相同則刪掉TAG將報文轉(zhuǎn)出去,否則帶tag轉(zhuǎn)發(fā)出去;hybrid則是可以任意單獨配置端口所允許進(jìn)入的各個vlan ID報文,以及轉(zhuǎn)出報文是否帶TAG;這個功能從數(shù)學(xué)上來講和組播類似,可以將access和trunk看成hybrid的兩個邊界值;
10. 所有端口默認(rèn)所屬的vlan 是vlan1,交換機(jī)支持對端口的所屬vlan進(jìn)行更改;同樣的對于二層QoS字段,對于沒有tag的報文打tag的時候賦予什么樣的COS值也是可以通過命令行來配置;
11.高級的交換芯片為了實現(xiàn)VLAN內(nèi)部用戶的隔離,提出了私有vlan的概念,即PVALN,并將端口設(shè)置為不同的屬性,交換機(jī)端口有三種類型:Isolated port,Community port, Promiscuous port;它們分別對應(yīng)不同的VLAN類型:Isolated port屬于Isolated PVLAN,Community port屬于Community PVLAN,而代表一個Private VLAN整體的是Primary VLAN,前面兩類VLAN需要和它綁定在一起,同時它還包括Promiscuous port。在Isolated PVLAN中,Isolated port只能和Promiscuous port通信,彼此不能交換流量;在Community PVLAN中,Community port不僅可以和Promiscuous port通信,而且彼此也可以交換流量。
12.同Q-IN-Q一樣,MAC地址也有MAC-IN-MAC的用途,又稱PBB-TE,技術(shù)標(biāo)準(zhǔn)是IEEE802.1Qay,主要用于運(yùn)營商骨干網(wǎng),關(guān)閉組播后用來解決運(yùn)營商骨干鏈路維護(hù)MAC表過大、對用戶流量進(jìn)行二次封裝和隔離、并能防止成環(huán)和負(fù)載不均衡的情況出現(xiàn);
13.MAC學(xué)習(xí)到硬件中需要通過中斷的方式通知到CPU,這樣軟件中便可以有硬件MAC表的副本,便于顯示和查詢,以及通過ARP的概念將MAC和IP進(jìn)行關(guān)聯(lián),決定路由是否下發(fā)硬件;
14.MAC都有一個老化的過程,即一段時間內(nèi)即么有SMAC為這個MAC的報文也沒有DMAC為這個MAC的報文,那么這個地址會在硬件表項中被刪除(+微信關(guān)注網(wǎng)絡(luò)世界),并通知上層軟件;老化時間默認(rèn)300秒,這個值是可以配置的,且根據(jù)芯片支持程度而不同,一般支持范圍為60~1800秒;
Vlan tag的識別和獲取是一個復(fù)雜的過程,因為涉及很多功能。下面是一個簡單的流程圖:
上面的流程中需要注意:
1. BCM和MVL的芯片處理流程少有不同,對各種vlan功能的支持程度也不太一樣;
2. 靈活Q-IN-Q是通?;赥CAM來實現(xiàn),匹配內(nèi)層或外層的VID,設(shè)置動作是刪除、添加或修改tag字段;
3. 二層表項的查找大部分表項是hash方式,少部分是tcam表項;
4. MAC表項的學(xué)習(xí)可以基于硬件,也可以是軟學(xué)習(xí);硬件學(xué)習(xí)成熟的芯片是可以完全線速的,某些通過并購來研發(fā)自己芯片的廠商在這方面支持度則略顯不足;軟學(xué)習(xí)可以更靈活和安全,因為每次的學(xué)習(xí)都要經(jīng)過CPU的控制,但是速率要變慢的多;
5. MAC表項的大小不同芯片也不一樣;
6. 當(dāng)一個端口收到一個報文的SMAC VID已經(jīng)有表項存在其他端口時,這個時候交換芯片需要根據(jù)配置判斷是否將這個地址學(xué)習(xí)到新端口上,稱之為MAC地址飄逸;這個是否飄逸的判斷也是基于一些寄存器的設(shè)置來做的;
對于二層轉(zhuǎn)發(fā),Openflow標(biāo)準(zhǔn)中所有的表項均可以來做,匹配內(nèi)容為DMAC 外層tag中的vlan ID,設(shè)置的動作為指定出端口;但是對于基于SMAC VID 的學(xué)習(xí)來說倒是不必支持的。例如一臺openflow交換機(jī)連接了十幾臺服務(wù)器,服務(wù)器需要通過二層轉(zhuǎn)發(fā)進(jìn)行通信,那么所有服務(wù)器的第一個報文需要上controller,然后controller可以把報文中的SMAC VID 解析出來下發(fā)一條DMAC為該報文SMAC VID的表項,設(shè)置動作是所有該類型的報文均轉(zhuǎn)發(fā)到該端口。
Openflow標(biāo)準(zhǔn)中對于vlan tag的動作和靈活Q-IN-Q是基本類似的,也支持對MAC-IN-MAC頭部的處理:
對于靈活Q-IN-Q功能中對vlan tag的修改openflow規(guī)則可以用setfield動作來執(zhí)行,并且openflow中還有strip vlan的動作來支持對vlan tag的刪除動作。
用傳統(tǒng)商業(yè)芯片來實現(xiàn)openflow來實現(xiàn)二層功能可以明顯看出openflow支持的動作更多些,實現(xiàn)也更靈活 ;但是反過來,如果用傳統(tǒng)的商業(yè)芯片去實現(xiàn)openflow的標(biāo)準(zhǔn),可以很肯定的說,是無法完全支持最新的openflow標(biāo)準(zhǔn)的,具體的支持程度需要看各個廠家所用芯片和開發(fā)的力度。Openflow標(biāo)準(zhǔn)1.0版本就提出了對外VLAN tag處理和Q-IN-Q的支持,到1。2則豐富了對報文內(nèi)外TAG的處理支持。Openflow的組播和廣播是用類型為ALL的group的概念來實現(xiàn)的。
隨著網(wǎng)絡(luò)規(guī)模的擴(kuò)大和網(wǎng)絡(luò)虛擬化的發(fā)展,VLAN的個數(shù)成為了限制,大二層的出現(xiàn),可以說是vlan有多大,虛擬機(jī)就能遷移多遠(yuǎn);為了解決VLAN個數(shù)不足提出了大量技術(shù),除了原來的Q-IN-Q等,為解決云計算中等相關(guān)的需求還提出了包括VXLAN、NVGRE等新興技術(shù),這些在后面再提及。可以說VLAN技術(shù)的出現(xiàn)解決了大量實際應(yīng)用中的問題,并和其他網(wǎng)絡(luò)技術(shù)有著千絲萬縷的關(guān)聯(lián),但是在云計算的今天為了解決VLAN個數(shù)不足的問題需要引入大量新技術(shù)來解決,這些不僅對網(wǎng)絡(luò)設(shè)備提出了更高的要求,而且從新技術(shù)來看都采用了封裝,這也會導(dǎo)致數(shù)據(jù)傳輸效率的降低,也可能隨之帶來網(wǎng)絡(luò)安全方面的問題。