1 引言
积跬步以至千里,积怠情以至深渊。
本文将介绍在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 idovs-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-bandovs-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 protocolsovs-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,查找路由发送