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 設定檔 (contributor : nosignal,CliffLin)

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

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

由於wlan設定中, 我們把wifi network 接到名為 lan 的介面上,故我們需要在network設定檔中新增一個介面

然而我們希望在開一個vlan來處理wlan,因此我們開了一個eth0.6的vlan

  • eth0.6 <->(bridge)<->lan<->wlan

開啟 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 eth0.6

    • eth0.4 不加進去的理由已經寫在上面
    • eth0.6 是wlan的port
  • 檢查 service

    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 討論, 我們有很多志同道合的人都在這邊一起努力, 希望大家都能一起加入討論或研究

Windows 7 USB Download tool

現在製作 win7 USB 安裝碟變得十分容易, 只要下載 Windows 7 USB Download Tool 把 iso 放進去即可

但很多時候會遇到一個問題 We were unable to copy your files. Please check your USB device and the selected ISO file and try again. 此時就需要對 USB 做 Format 的動作

過程

  1. 開啟 cmd
  2. Format disk

    1
    2
    3
    4
    5
    6
    7
    8
    9
    diskpart
    list disk //找尋你的 USB 位置, 假設disk 1為 USB
    select disk 1
    clean
    create partition primary
    active
    format quick fs=fat32
    assign
    exit
  3. 開啟 Windows 7 USB Download Tool 即可

設定 OpenvSwitch

查表

  • ovs-vsctl list bridge ovs-br

關於 Brdige 及 Port

  1. 新增 Brdige
    • ovs-vsctl add-br ovs-br
  2. 在 ovs-br 上對應 interface
    • ovs-vsctl add-port ovs-br eth0
  3. (1) + (2) 的寫法可為
    • ovs−vsctl add−br ovs-br -- add−port ovs-br eth0
  4. 移除 Bridge
    • ovs-vsctl del-br ovs-br #如果不存在的話, 會有error log
      • ovs-vsctl --if-exists del-br ovs-br
  5. 更改 ofport (openflow port number) 為 100
    • ovs-vsctl add-port ovs-br eth0 -- set Interface eth0 ofport_request=100
  6. 設定 port 為 internal
    • ovs-vsctl set Interface eth0 type=internal

關於 Controller

  1. 設定 Controller
    • ovs-vsctl set-controller ovs-br tcp:1.2.3.4:6633
  2. 設定 multi controller
    • ovs-vsctl set-controller ovs-br tcp:1.2.3.4:6633 tcp:5.6.7.8:6633
  3. 查詢 Controller 設定
    • ovs-vsctl show
      • 如果有成功連到 controller 則會顯示 is_connected:true, 反之則未連上
    • ovs-vsctl get-controller ovs-br
  4. 移除 Controller
    • ovs-vsctl del-controller ovs-br

關於 STP (Spanning Tree Protocol)

  1. 開啟 STP
    • ovs-vsctl set bridge ovs-br stp_enable=true
  2. 關閉 STP
    • ovs-vsctl set bridge ovs-br stp_enable=false
  3. 查詢 STP 設定值
    • ovs-vsctl get bridge ovs-br stp_enable
  4. 設定 Priority
    • ovs−vsctl set bridge br0 other_config:stp-priority=0x7800
  5. 設定 Cost
    • ovs−vsctl set port eth0 other_config:stp-path-cost=10
  6. 移除 STP 設定
    • ovs−vsctl clear bridge ovs-br other_config

關於 Openflow Version

  1. 支援 OpenFlow Version 1.3
    • ovs-vsctl set bridge ovs-br protocols=OpenFlow13
  2. 支援 OpenFlow Version 1.3 1.2
    • ovs-vsctl set bridge ovs-br protocols=OpenFlow12,OpenFlow13
  3. 移除 OpenFlow 支援設定
    • ovs-vsctl clear bridge ovs-br protocols

關於 VLAN

  1. 設定 VLAN tag
    • ovs-vsctl add-port ovs-br vlan3 tag=3 -- set interface vlan3 type=internal
  2. 移除 VLAN
    • ovs-vsctl del-port ovs-br vlan3
  3. 查詢 VLAN
    • ovs-vsctl show
    • ifconfig vlan3
  4. 設定 Vlan trunk
    • ovs-vsctl add-port ovs-br eth0 trunk=3,4,5,6
  5. 設定已 add 的 port 為 access port, vlan id 9
    • ovs-vsctl set port eth0 tag=9
  6. ovs-ofctl add-flow 設定 vlan 100
    • ovs-ofctl add-flow ovs-br in_port=1,dl_vlan=0xffff,actions=mod_vlan_vid:100,output:3
      • ovs-ofctl add-flow ovs-br in_port=1,dl_vlan=0xffff,actions=push_vlan:0x8100,set_field:100-\>vlan_vid,output:3
  7. ovs-ofctl add-flow 拿掉 vlan tag
    • ovs-ofctl add-flow ovs1 in_port=3,dl_vlan=100,actions=strip_vlan,output:1
    • two_vlan example
  8. ovs-ofctl add-flow pop-vlan
    • ovs-ofctl add-flow ovs-br in_port=3,dl_vlan=0xffff,actions=pop_vlan,output:1

關於 GRE Tunnel

  1. 設定 GRE tunnel
    • ovs−vsctl add−port ovs-br ovs-gre -- set interface ovs-gre type=gre options:remote_ip=1.2.3.4
  2. 查詢 GRE Tunnel
    • ovs-vsctl show

關於 Dump flows

  1. Dumps OpenFlow flows 不含 hidden flows (常用)
    • ovs-ofctl dump-flows ovs-br
  2. Dumps OpenFlow flows 包含 hidden flows
    • ovs-appctl bridge/dump-flows ovs-br
  3. Dump 特定 bridge 的 datapath flows 不論任何 type
    • ovs-appctl dpif/dump-flows ovs-br
  4. Dump 在 Linux kernel 裡的 datapath flow table (常用)
    • ovs-dpctl dump-flows [dp]
  5. Top like behavior for ovs-dpctl dump-flows
    • ovs-dpctl-top

XenServer 開啓 OpenvSwitch 方式

  1. 檢查開啟與否
    • service openvswitch status
  2. 開啓
    • xe-switch-network-backend openvswitch
  3. 關閉
    • xe-switch-network-backend bridge

關於 Log

  1. 查詢 log level list
    • ovs-appctl vlog/list
  2. 設定 log level (以 stp 設定 file 為 dbg level 為例)
    • ovs-appctl vlog/set stp:file:dbg
    • ovs-appctl vlog/set {module name}:{console, syslog, file}:{off, emer, err, warn, info, dbg}

關於 Fallback

  1. Controller connection: false 的時候, 會自動調成 legacy switch mode
    • ovs-vsctl set-fail-mode ovs-br standalone
  2. 無論 Controller connection status 為何, 都必須通過 OpenFlow 來進行網路行為 (default)
    • ovs-vsctl set-fail-mode ovs-br secure
  3. 移除
    • ovs-vsctl del-fail-mode ovs-br
  4. 查詢
    • ovs-vsctl get-fail-mode ovs-br

關於 sFlow

  1. 查詢
    • ovs-vsctl list sflow
  2. 新增
  3. 刪除
    • ovs-vsctl -- clear Bridge ovs-br sflow

關於 NetFlow

  1. 查詢
    • ovs-vsctl list netflow
  2. 新增
  3. 刪除
    • ovs-vsctl -- clear Bridge ovs-br netflow

設定 Out-of-band 和 in-band

  1. 查詢
    • ovs-vsctl get controller ovs-br connection-mode
  2. Out-of-band
    • ovs-vsctl set controller ovs-br connection-mode=out-of-band
  3. In-band (default)
    • ovs-vsctl set controller ovs-br connection-mode=in-band
  4. 移除 hidden flow
    • ovs-vsctl set bridge br0 other-config:disable-in-band=true

關於 ssl

  1. 查詢
    • ovs-vsctl get-ssl
  2. 設定
  3. 刪除
    • ovs-vsctl del-ssl

關於 SPAN

  1. 詳細設定
1
2
3
4
5
6
7
ovs-vsctl add-br ovs-br
ovs-vsctl add-port ovs-br eth0
ovs-vsctl add-port ovs-br eth1
ovs-vsctl add-port ovs-br tap0 \
-- --id=@p get port tap0 \
-- --id=@m create mirror name=m0 select-all=true output-port=@p \
-- set bridge ovs-br mirrors=@m
  • 將 ovs-br 上 add-port {eth0,eth1} mirror 至 tap0
  1. 刪除
    • ovs-vsctl clear bridge ovs-br mirrors

      關於 Table

  2. 查 table
    ovs-ofctl dump-tables ovs-br

關於 Group Table

參考 hwchiu - Multipath routing with Group table at mininet

  1. 建立 Group id 及對應的 bucket

    • ovs-ofctl -O OpenFlow13 add-group ovs-br group_id=5566,type=select,bucket=output:1,bucket=output:2,bucket=output:3
    • type 共有 All, Select, Indirect, FastFailover, 詳細規格
  2. 使用 Group Table

    • ovs-ofctl -O OpenFlow13 add-flow ovs-br in_port=4,actions=group:5566

關於 VXLAN

參考 rascov - Bridge Remote Mininets using VXLAN

  1. 建立 VXLAN Network ID (VNI) 和指定的 OpenFlow port number, eg: VNI=5566, OF_PORT=9

    • ovs-vsctl set interface vxlan type=vxlan option:remote_ip=x.x.x.x option:key=5566 ofport_request=9
  2. VNI flow by flow

    • ovs-vsctl set interface vxlan type=vxlan option:remote_ip=140.113.215.200 option:key=flow ofport_request=9
  3. 設定 VXLAN tunnel id

    • ovs-ofctl add-flow ovs-br in_port=1,actions=set_field:5566->tun_id,output:2
    • ovs-ofctl add-flow s1 in_port=2,tun_id=5566,actions=output:1

關於 OVSDB Manager

參考 OVSDB Integration:Mininet OVSDB Tutorial

  1. Active Listener 設定
    • ovs-vsctl set-manager tcp:1.2.3.4:6640
  2. Passive Listener 設定
    • ovs-vsctl set-manager ptcp:6640

OpenFlow Trace

  1. Generate pakcet trace
    • ovs-appctl ofproto/trace ovs-br in_port=1,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02 -generate

其它

  1. 查詢 OpenvSwitch 版本
    • ovs-ofctl -V
  2. 查詢下過的指令歷史記錄
    • ovsdb-tool show-log [-mmm]

Reference