SDN交換機的拓撲發現與ARP處理


 

摘錄自:http://www.tuicool.com/articles/uuaMri

 

Openflow標准定義了控制器與交換機之間的交互協議,以及一組交換機操作。這個控制器—交換機協議運行在安全傳輸層協議(TLS)或無保護TCP連接之上。Openflow使用TCP端口6633或6653。

 

 

每個流表中每個流條目包括三個部分:

(1)匹配match—使用ingressport,packetheader以及前一個flow table傳遞過來的metadata;

(2)計數counter---對匹配成功的包進行計數;

(3)操作instruction—修改actionset或者流水線處理

交換機針對SDN有一個比較重要的消息類型:Packet-In,主要針對未知數據流無法命中流表的時候,作上送控制器的操作。

同樣,SDN控制器也有一個比較重要的消息類型:Packet-Out,主要針對下游SDN被管理設備,用於控制器指定從交換機的特定端口發送數據包,或者用於轉發通過Packet-in消息接收到的數據包。Packet-Out報文中包含明確的Action動作。

 

 

SDN Controller通過Openflow和LLDP發現整網拓撲:

 

 

背景闡述:

① 所有交換機彼此互聯

② 交換機通過帶外方式(或網管網方式)連接Controller

③ 交換機均使用Openflow協議。Openflow使用TCP端口6633或6653作為接收的監聽端口。目前最新Openflow協議為1.5.1,詳見ONF的spec。(https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/Openflow/Openflow-switch-v1.5.1.pdf)

④ 無特殊Controller指定,各類型都OK

那對於傳統交換機而已,正常情況他們是通過LLDP等類似的鄰居發現協議發現彼此網絡設備,形成整網拓撲。而在SDN環境中,設備是無腦的,此時需要借助Openflow和LLDP同時工作,來保障Controller環境下能夠對全網進行拓撲發現。

工作流程介紹:

① 交換機連線至Controller,通過電信號,Controller發現有支持Openflow的SDN交換機接入,此時,Controller能夠發現三台SDN交換機接入了。注意,此時三台設備之間的組網環境Controller是不清楚的。

② Controller通過packet-out報文,封裝LLDP報文進Openflow,分別分發給每個交換機。此時的packet-out報文中含有動作:分發LLDP報文從交換機的每個端口發出去。

③ 此時交換機A根據Controller的動作指令,將LLDP報文從交換機所有接口發出去。交換機B和交換機C此時都能收到這個報文。

④ LLDP報文經過交換機之間的互聯鏈路到達對端SDN交換機。而此時正因為交換機是SDN無腦交換機,他對於報文的處理都是上送Controller而非本地操作。則此時接受到LLDP的對端交換機會將LLDP報文再次封裝,封裝進packet-in,並上送至Controller。

⑤ 此時Controller收到對端SDN交換機封裝的packet-in報文,報文里包含原本的LLDP報文。此時Controller就已經知道所有的拓撲連接關系了。

 

 

SDN控制器對於ARP報文的處理:

 

 

背景闡述:

① 網絡拓撲已發現

② 控制器采用ODL(OpenDayLight)

③ 本地主機H1(10.0.0.1)和對端主機H2(10.0.0.2)均連接於SDN交換機下面

④ 整個過程是H1請求H2的ARP,H2響應H1

整個解析過程

① H1去pingH2,即10.0.0.1去ping10.0.0.2。因為沒有H2的MAC,此時需要做一次ARP解析。此時ARP請求(原本是廣播)被SwitchA通過Openflow形式單播上送給Controller(packet-in報文)

② Controller收到H1的ARP請求,記錄H1位於Switch A下游,且記錄相關的位置信息。

③ 正因為Controller有所有交換機的拓撲及位置信息,此時Controller會給全網中每台SDN交換機都發送一個10.0.0.0/8網段的ARP請求消息,來請求10.0.0.2的MAC地址。但源IP並非10.0.0.1,而是Controller的網關地址,此處為10.0.0.254。此時報文均為packet-out,即通過Controller手工泛洪,但此泛洪是有選擇性的,只針對同網段(10.0.0.0/8)

④ 所有交換機都能收到此ARP單播請求,而只有Switch B會做出回應,因為H2接在Switch B下游。此時通過packet-in,所有SDN交換機會將此ARP泛洪發送到同網段的端口。

⑤ H2收到此時的ARP請求,正常做出回應。

⑥ Switch B收到H2的ARP響應,無腦上送到Controller。Controller收到ARP響應,發現正是前面發出的ARP請求的響應報文。記錄此時的H2位置信息及ARP信息。

⑦ Controller通過Openflow將ARP響應回應給Switch A,Switch A將報文回送給H1。

此時做個小結,Controller已經完整知道SwitchA/SwitchB/H1/H2的位置信息及MAC/ARP信息。SwitchA/H1知道完整的ARP/MAC信息。而SwitchB也有H1/H2的完整IP。唯獨H2此時只知道H1的IP,而不知道H1的MAC。

⑧ H1的整個ARP請求過程已經完成。接下來要輸送ICMP請求報文。報文經由Switch A正常輸送到H2(此時是實際轉發流量,而且Switch A已有完整轉發路徑,不需要再上送Controller)

⑨ H2收到ICMP報文,想要回應,但是沒有H1的MAC,需要再次做ARP請求。此時H2請求H1的MAC地址,報文被Switch B上送Controller,Controller已有H1的MAC,則Controller做出回應,將H1的MAC回應給H2。

⑩ H2收到ARP,則整個過程完整。回應ICMP報文。整個業務流打通。

可以看到,最關鍵的應該是第三步,即Controller發送偽裝ARP報文給全局同網段交換機,以此來實現ARP廣播的同樣效果。但也正是這樣一個看似合理的安全行為,帶來了很多不安全的隱患。可以想象,Controller有幾種方式可以獲取終端主機的MAC情況:1.通過免費ARP的方式、2.定時申請下游終端的MAC方式,都可以保證對下游終端MAC的始終更新。

但同樣,集中Controller的方式也帶來了單點安全的風險考慮,一旦一台下游主機中毒,不斷變化自己的MAC不斷做出更新動作,此時會極大消耗Controller的資源,形成DOS攻擊。同樣,Controller的安全如果不是很堅固,則一旦被攻破,所有終端信息一覽無余。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM