搬遷至 blog.pichuang.com.tw

轉移陣地之後有新的文章會寫在 http://blog.pichuang.com.tw

感謝各位

OpenvSwitch Debug$ Enviroment

OpenvSwitch debug 要分三個階段看

  1. OpenvSwitch Enviroment
  2. Trace Flow
  3. Controller App

大多數說網路不通的人在第一個階段就有問題了, 基本上只要知道 OpenvSwitch 架構和 Flow match 的行為, 就能(較)簡單的進行 Debug, 這篇從第一個階段開始講

OpenvSwitch 架構

透過上圖可以清楚知道 OpenvSwitch 主要分為三個 Componets: kmod_openvswitch, ovs-vswitchd, ovsdb-server

  • kmod_openvswitch 就是我們平時講的 datapath, 屬於在 kernel space 的層級, Packets 實際上轉發都是要透過這邊進行處理, 在這邊會有一個屬於這台 hosts 通用的 table, 可以透過 ovs-dpctl show 做觀察
  • ovs-vsswitchd 是整個 OpenvSwitch 的核心所在, 屬於在 user space 的層級, 可以實作不少 protocols 在上面, 而 OpenFlow 實作也是在此, 這邊會針對 不同的 ovs bridge 會分別有不同的 Flow table, 可以透過 ovs-ofctl show ovs-br 做觀察
  • ovsdb-server 是儲存 OpenvSwitch 相關設定的地方, 基本上操作 ovs-vsctl 都是在與 ovsdb-server 溝通, 這點非常重要

詳細一點可以參考小弟於 SDNDS-TW Meetup #2 分享的投影片

亦或是 rajdeep , Director, Developer Relations VMware India at VMware India 於 slideshare 發表的投影片

OpenvSwitch 環境檢查

Check daemon

ovs-ctl status
ps aux | grep ovs
  • 確定有無 ovsdb-server 和 ovs-vswitchd
  • ovs-ctl 打哪來的? /usr/share/openvswitch/scripts/ovs-ctl 這個在安裝的時候並沒有被安裝在 /usr/bin 底下, 如果要用的話可以自行 link 至目錄底下

Logging

ovsdb-tool show-log [-mmm]
  • 這個是專門去撈你 ovs-vsctl 操作的紀錄, 多下-m可以看到更詳細的行為, 這邊可以驗證你的 db 操作是有沒有問題
cat /var/log/openvswitch/{ovsdb-server,ovs-vswitchd}.log
  • 這邊要在啟動的時候後面要加 --log-file 才會有的資訊, 詳細可以看安裝流程
  • 透過裡面資訊可以用時間來判斷各個 componets 發生了什麼事
  • log 資訊詳細與否需配合 ovs-appctl vlog/list 做設定

Interface 配置

ovs-vsctl show 

這邊主要處理是由 ovsdb-server 負責

  • Controller
    • is_connected: true 看到這個出現代表 ovs bridge 已經正常的連在 Controller 上面
    • port number 是 6633 還是 6653
    • connected method 是 tcp? ssl? ...?
    • OpenvSwitch 連到 controller 的方式一開始還是走 L2 Switching 出去的 (Hidden flow), 意思是在佈建 OpenFlow 環境時, Legacy network 要先搞定, 不然就免談
  • fail_mode
    • secure 一定要連上 controller 才處理封包
    • standalone 若沒有連上 controller 則自動轉換為 L2 Switching, 直到連上 Controller
    • Debug legacy network 是否有通, 則會開 standalone 來先進行檢查
    • Trace Flow 時會開 secure 來進行檢查
  • Port
    • 只是驗證 conf.db 是否確切存有 interface 的資訊在裡面, 以便重啟服務時還可以回復至現在環境
ovs-ofctl show ovs-br

這邊主要處理是由 ovs-vswitchd 負責

  • OFPT_FEATURES_REPLY
    • xid 裡面的值代表你現在支援哪個版本的 Protocols (例如: 0x2 = OpenFlow1.1)
    • OpenvSwitch 從 2.3.0 後, 預設採用 OpenFlow 1.1+, 如果要使用 OpenFlow 1.0 請使用 ovs-vsctl set bridge ovs-br protocols=OpenFlow10
  • dpid
    • ovs bridge id, Openflow controller 透過不同 dpid 來分別辨識不同 ovs bridge
  • 1(wlan0)
    • 1 是代表 ofport, 你進行 ACTIONS 指定一些如 in_port=1,actions=output:2 裡面所述的數字, 都是從這邊對應的, Controller 能控制的 ofport 也是在 ovs-vswitchd 處理
    • ofport 的數字可以更換, 請搜尋 ofport_request
    • wlan0 是 ofport 所綁定的 interface, 無論哪個 interface 至多只能被歸納至某一個 ovs bridge 底下, 而不能同時加入多個 ovs bridge
ovs-dpctl show

這邊主要處理是由 datapath 負責

  • lookups
    • hit 表示 packet 進來後, match datapath flow table 成功次數
    • missed 表示 packet 進來後, 有 unmatched datapath flow table 情形, 則會透過 upcall 將封包送至 ovs-vswitchd 的次數
    • lost 表示在 ovs-vswitchd 回應前, datapath 就把封包 drop 掉的次數
  • flows
    • 現存在 datapath flow 的個數
  • port 1: wlan0
    • port 1 這邊是專門給 datapth 辨識的 port number, 跟上述 ovs-ofctl show ovs-br 所看到的 ofport 無相關, 但後續在 datapath 中 trace flow 時會需要他

各位觀察一下 ovs-ofctl show ovs-brovs-dpctl show 兩者 interface 及 port number 的關係, 可以發現 ovs-vswitchd 針對綁定的 interface 有自己的 ofport number, 然而相同 interface 在 datapath 又有不同的 number, 所以在 trace flow 要特別注意這類 mapping 問題, 千萬不要弄混

接下來還會有 OpenvSwitch Debug$ Trace flow 的文章, 請讓我繼續拖搞, 謝謝各位

OpenvSwitch Lab 7$ Setting OpenWrt

在看本篇之前, 我預設你已經把 OpenWrt 刷好, 也把 OpenvSwitch 安裝好了, 那從現在開始我們就要開始設定 OpenWrt 讓他變成一個 OpenFlow switch, 那如果沒刷過的也別難過, 可以參考 編譯 OpenWrt 來完成編譯, 那如果有需要 .config 的話, 可以參考我的 config

環境

  • DLink DIR-835
    • 5 LAN Port
    • 2 WLAN Port
  • 這邊要稱讚一下他的 recovery mode 做得還不錯, 有 web 上傳介面, 節省很多時間

切出 5 個 interface

將原先 eth0.{1,2} 切成 5 個 interface eth0.{1,2,3,4,5}, 供 OpenvSwitch 針對 Port 做控制

network 設定檔

裡面的 eth0.4 為什麼要特別設定呢? 在先舊的 config 我們都是透過 OpenWrt 替我們建好的 bridge 'lan' (192.168.1.1)來進行連線, 新的設定檔因為把 lan 拿掉, 所以要特別針對某個 interface (例如: eth0.4) 上一個 ip, 好方便連線設定

而這個 interface 之後也不會將它 ovs-vsctl add-port, 理由是避免你設定錯誤導致整台 AP 進不去的防制手段, 可以視為 Console port

開啟 WLAN

將 /etc/config/wireless 裡面的兩行option disabled 0 remove 之後, 再下 wifi 啟動 wireless

wireless 設定檔

設定 OpenvSwitch

  • 新增 interface 至 ovs-br 做管理

    ovs-vsctl add-br ovs-br
    ovs-vsctl add-port ovs-br eth0.1
    ovs-vsctl add-port ovs-br eth0.2
    ovs-vsctl add-port ovs-br eth0.3
    ovs-vsctl add-port ovs-br eth0.5
    ovs-vsctl add-port ovs-br wlan0
    ovs-vsctl add-port ovs-br wlab1
    
    • eth0.4 不加進去的理由已經寫在上面
  • 檢查

    ovs-vsctl show
    ovs-ofctl show ovs-br
    
    • 這邊要注意所有的 interface 都應該要被正確的顯示, 尤其是 ovs-ofctl 這裡面的資訊, 大家最常遇到的問題是 ovs-vsctl show 明明有相關資訊, 但是卻不會動, 有過半的可能是因為你的 ovs-vswitchd 沒有啟動, 你下 ovs-ofctl show ovs-br 會毫無反應

設定網路

設定網路是非常重要的事情 "網路不會通, 就不會有 SDN"

讓 ovs-br 連上網路 (Network: 192.168.77.0/24, GW: 192.168.77.1), 這邊採用 in-band 作法, out-of-band 作法之後再另外說

  • 上 ip (例: 192.168.77.111)

    ifconfig ovs-br 192.168.77.111
    route add default gw 192.168.77.1 ovs-br
    
  • 檢查 route table

    route -n
    

  • 檢查網路狀況
    ping 192.168.77.1
    ping 8.8.8.8
    

  • 設定 controller 連線
    ovs-vsctl set-controller ovs-br tcp:x.x.x.x:6633
    
    • 應該要可以看到 is_connected: true, 若無的話, 你上面一定有個步驟弄錯, 再仔細檢查看看

到這邊應該大家都可以順利地建立 OpenFlow switch, 那如果有問題的話, 歡迎加入 SDNDS-TW 討論, 我們有很多志同道合的人都在這邊一起努力, 希望大家都能一起加入討論或研究