1 引言
積跬步以至千里,積怠情以至深淵,我要做一個踏實的ABCer。
本文將介紹在Netgear R6220路由器上進行基於OpenVswitch的openflow實驗。路由器是刷了編譯了OpenvSwitch的OpenWRT固件的,具體可參考刷機教程。本文主要以R6220爲例介紹從刷機到配置 OpenvSwitch交換機的整個過程。
2 Netgear R6220刷機
- 收到原廠Netgear R6220路由器後,用一根網線接上筆記本網口和路由器LAN口。
- 打開瀏覽器,輸入192.168.1.1,進入路由器原廠管理界面,設置好路由器的管理密碼。
- 在瀏覽器中輸入網址
http://192.168.1.1/setup.cgi?todo=debug
,並回車,開啓路由器的telnet功能。 - Windows系統下打開本地命令提示符(其他系統也可以),輸入
telnet 192.168.1.1
,終端登錄路由器,用戶名爲admin
,密碼爲上邊設置的。 - 進入後,將帶有編譯好的固件(編譯了OpenVSwitch的OpenWRT固件,可以到我的雲盤中提取,鏈接:
https://pan.baidu.com/s/1Y3tq0nsxfi5_wX7FO4xXCw
,提取碼:ew7d
)的U盤插入路由器USB口。 - 而後,進入…/ramips/mt7621,開始刷入固件,操作步驟如下截圖所示。
NT:一定要先刷kernel,再刷rootfs。同時在刷固件過程中一定不要插拔網線,否則變磚!! - 刷完固件重啓路由器,耐心等待重新獲取得到網卡信息,首先重新以網頁方式登錄路由器新固件OpenWRT的管理界面(方法爲在網頁中輸入192.168.1.1),進入網頁後,只設置密碼而不做其他多餘操作(例如進入網絡接口界面,因爲一旦進入就會默認生成一次配置,會與之後的終端配置造成衝突),否則影響最終的配置,導致路由器變磚。
- 緊接着,ssh進入OprnWRT系統,用戶名爲
root
,密碼爲上一步設置的密碼。 - 進入/etc/config下配置network文件和wireless文件,文件的配置需要根據物理設備的網卡信息進行正確配置,因此首先摸清Netgear R6220的網絡配置信息尤爲關鍵,否則將導致路由器變磚,或者無法配置好網橋信息。以下部分,第3節主要介紹物理設備網絡信息,第4節主要介紹具體的network文件和wireless文件配置,第5節主要介紹針對第4節的配置信息進行的網橋搭建過程。
NT:刷機變磚請參考本人博客Netgear救磚教程。
3 Netgear R6220網絡配置信息介紹
4 Netgear R6220路由器的網絡文件配置
4.1 network文件配置
關於配置文件中的配置代碼對應功能介紹,請參考本人博客SDN(二),本人對於network文件的配置如下。
# 本地迴環地址
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd22:7199:e878::/48'
# 劃分lan口
config interface 'lan' # 將LAN1配置成內網地址
option type 'bridge'
option ifname 'eth0.3'
option proto 'static'
option ipaddr '192.168.3.1'
option netmask '255.255.255.0'
option ip6assign '60'
config device 'lan_dev'
option name 'eth0.3'
option macaddr '8c:3b:ad:e4:5a:b1'
config interface 'wan_controller' # wan口配置成控制器地址,該IP地址爲運行控制器的主機的網關IP地址
option ifname 'eth0.4'
option proto 'static'
option ipaddr '10.12.34.248' # 必須與LAN口在不同網段
option netmask '255.255.255.0'
config device 'wan_dev'
option name 'eth0.4'
option macaddr '8c:3b:ad:e4:5a:b0'
config interface 'wan6'
option ifname 'eth0.4'
option proto 'dhcpv6'
config interface 'lan2' # 其餘LAN口不分配IP地址,作爲openflow端口,供OpenVswitch中網橋的端口映射
option ifname 'eth0.2'
option proto 'static'
config interface 'lan3'
option ifname 'eth0.1'
option proto 'static'
config interface 'lan4'
option ifname 'eth0.0'
option proto 'static'
config switch # swith,用於R6220的四個LAN口的IP映射
option name 'switch0'
option reset '1'
option enable_vlan '1'
config switch_vlan # 劃分vlan
option device 'switch0'
option vlan '0'
option ports '0 6t'
config switch_vlan
option device 'switch0'
option vlan '1'
option ports '1 6t'
config switch_vlan
option device 'switch0'
option vlan '2'
option ports '2 6t'
config switch_vlan
option device 'switch0'
option vlan '3'
option ports '3 6t'
config switch_vlan
option device 'switch0'
option vlan '4'
option ports '4 6t'
配置完成後,輸入/etc/init.d/network restart
進行網絡重啓。
4.2 wireless文件配置
在配置好network後,可參照如下代碼進行無線設置(也可以進入網頁,直接針對無線進行可視化配置),關於Neatgear中的wireless文件本人配置如下,此時無線和LAN1分配在了同一個網段,因此wifi連接路由器也可以進入內網配置。
config wifi-device 'radio0'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path 'pci0000:00/0000:00:01.0/0000:02:00.0'
option htmode 'HT20'
option country '00'
option legacy_rates '1'
config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan' # 當要將wlan0配置成無線接口時,不需要分配網段
option mode 'ap'
option encryption 'none'
option ssid 'OpenWrt2_0'
option ifname wlan0 # 這個wifi接口名稱的設置相當重要,需要作爲ovs中網橋設置的接口
config wifi-device 'radio1'
option type 'mac80211'
option channel '36'
option hwmode '11a'
option path 'pci0000:00/0000:00:00.0/0000:01:00.0'
option htmode 'VHT80'
option country '00'
option legacy_rates '1'
config wifi-iface 'default_radio1'
option device 'radio1'
option mode 'ap'
option encryption 'none'
option ssid 'OpenWrt2_1'
option ifname wlan1 # 這個wifi接口名稱的設置相當重要,需要作爲ovs中網橋設置的接口
配置完成後,再次輸入/etc/init.d/network restart
進行網絡重啓。
5 Netgear R6220中OpenVswitch的網橋創建及配置
針對network中的配置,網橋的對應配置如下:
ovs-vsctl add-br br0 # 創建網橋
ovs-vsctl set-fail-mode br0 secure|standalone # 網橋默認模式爲standlone,這裏將其設置成secure模式
# standlone: 若OVS交換機超過3次無法正常連接到OpenFlow控制器,OVS交換機會自己負責建立流表,與常見的L2交換機類似進行工作。一旦網絡連接恢復,OVS會再次切換到使用控制器進行流表管理;
# secure: 在該模式下,若OVS無法正常連接到OPenFlow控制器,OVS會不停的嘗試與控制器重新建立連接,而不會自己負責建立流表。
ovs-vsctl add-port br0 eth0.0 -- set Interface eth0.0 ofport_request=4 # 添加端口,並固定端口編號爲4,否則每次隨機生成。
ovs-vsctl add-port br0 eth0.1 -- set Interface eth0.1 ofport_request=3 # 由於eth0.3已配置成OpenWRT內網接入地址,因此無法添加eth0.3
ovs-vsctl add-port br0 eth0.2 -- set Interface eth0.2 ofport_request=2
ovs-vsctl add-port br0 wlan0 -- set Interface wlan0 ofport_request=5 #添加2.4G頻段無線接口
ovs-vsctl add-port br0 wlan1 -- set Interface wlan1 ofport_request=6 #添加5.0G頻段無線接口
ovs-vsctl set-controller br0 tcp:10.12.34.180:6653 tcp:10.12.34.180:6654 # 添加多控制器,該IP地址爲運行控制器的主機的IP地址
在對網橋進行以上配置後,爲運行控制器的主機添加對應網絡配置(IP爲10.0.30.1/24,網關爲10.0.30.254),並運行控制器代碼。Netgear R6220路由器即可連接上該控制器。
此外,其他關於網橋的相關操作如下:
ovs-vsctl show # 查看網橋狀態
ovs-vsctl del-br br0 # 刪除網橋
# datapath類型分爲netdev和system兩種類型
# netdev類型:dpdk用戶態數據通過;system類型:對應linux內核數據通路
#
ovs-vsctl set bridge br0 datapath_type=netdev # 設置datapath類型
ovs-vsctl get bridge br0 datapath_type # 查看datapath type
ovs-vsctl set bridge br0 other_config:datapath-id=新dpid # 修改交換機dpid
ovs-vsctl get bridge br0 datapath-id # 查看datapath id
ovs-vsctl del-controller br0 # 刪除控制器
ovs-vsctl set-controller br0 tcp:1.2.3.4:6633 # 設置single controller
# 查詢 Controller 設定,如果有成功連到 controller 則會顯示 is_connected:true, 反之未連上
ovs-vsctl list controller # 查看控制器列表
ovs-vsctl del-fail-mode br0 # 移除fail-mode
ovs-vsctl get-fail-mode br0 # 查詢fail-mode
# in-band模式下,控制器與OVS交換機連接的網口既可以有控制流量,又可以有數據流量。
# out-of-band模式下,控制器與OVS交換機連接的網口只有控制流量。
# OpenvSwitch不僅僅是一個OpenFlow Switch,它的流表組成除了of流表外,還有其他一些(隱藏)流表。這些隱藏流表默認交換機和控制器在同一網絡中(in-band),因此要保證兩者互通,要關閉默認的inband。
ovs-vsctl get controller br0 connection-mode # 查詢連接模式
ovs-vsctl set controller br0 connection-mode=out-of-band # 設置br0連接模式爲out-of-band
ovs-vsctl set controller br0 connection-mode=in-band # 設置br0連接模式爲in-band
ovs-vsctl list-br # 查看有哪些橋
ovs-vsctl list bridge br0 # 查看網橋的配置信息
ovs-vsctl list-ports br0 # 查看橋中有哪些ports
ovs-vsctl list port br0 eth0.0 # 查看網橋段端口配置信息
# stp協議:防止網橋網絡中的冗餘鏈路形成環路工作
ovs-vsctl get bridge br0 stp_enable # 查看ovs交換機是否開啓stp協議
ovs-vsctl set bridge br0 stp_enable=true # 設置交換機開啓stp協議
ovs-vsctl get Interface eth0.0 ofport # 獲取網絡接口的OpenFlow編號
ovs-vsctl set Interface eth0 type=internal # 設置 port 爲 internal
# 設置可選項
ovs-vsctl set Interface eth0.0 options:link_speed=1G
ovs-vsctl remove Interface eth0.0 options link_speed
# 設置fail模式,支持standalone或者secure
ovs-vsctl del-fail-mode br0
ovs-vsctl set-fail-mode br0 secure
ovs-vsctl get-fail-mode br0
# 關於OpenFlow version
ovs-vsctl set bridge br0 protocols=OpenFlow12,OpenFlow13
ovs-vsctl clear bridge br0 protocols
ovs-ofctl dump-flows br0 # 查看網橋流表信息
ovs-ofctl del-flows br0 # 刪除網橋流表
ovs-ofctl show br0 # 查看網橋各端口流表狀態信息
vs-vsctl get Interface br0 ofport # 獲得br0網絡接口的OpenFlow編號
OpenVSwitch中常見的port類型介紹:
-
netdev: 通用網卡設備包括物理網卡以及虛擬網卡
接收:網卡收到報文後回直接通過OpenvSwitch接收函數處理,不會再走傳統內核協議棧;
發送:OpenvSwitch中的一條flow指定從網卡port發出時通過該網卡設備發送。 -
internal: OpenvSwitch創建的一種虛擬網卡設備
接收:OpenvSwitch所在主機通過internal設備網卡發送的報文(協議棧路由查找通過internal設備發送),就進入OpenvSwitch接收處理函數.。報文送入OpenvSwitch處理;
發送:OpenvSwitch中的一條flow指定從internal port發出時,該報文被重新注入內核協議棧, 標記爲從internal網卡接收。 -
gre device: L2 gre tunnel設備
接收:協議棧收到gre報文後,傳遞給L4層解析gre header, 然後傳遞給OpenvSwitch接收處理函數;
發送:OpenvSwitch中的一條flow指定從gre設備發送, 報文會根據flow規則加上gre header和ip header,查找路由發送