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 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,查找路由发送

————————————————

版权声明:本文为CSDN博主「梵高的向日葵丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42094589/article/details/105474344