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