1、安装
# 安装依赖环境
apt install gcc make uuid
# 下载源码
https://www.openvswitch.org/releases/openvswitch-3.1.1.tar.gz
# 编译安装
tar -xvf openvswitch-3.1.1.tar.gz
cd openvswitch-3.1.1 && ./configure
make && make install
2、运行
openvswitch有几个脚本放在/usr/local/share/openvswitch/scripts
下,为了方便使用,可以设置PATH路径。由于运行需要root权限,可以切换到root,再设置PATH。
export PATH=$PATH:/usr/local/share/openvswitch/scripts
启动ovs,需要使用random或UUID工具生成系统ip。
ovs-ctl --system-id=`uuid` restart
3、创建自启动服务
创建服务脚本
touch /etc/systemd/system/ovs.service
nano /etc/systemd/system/ovs.service
脚本内容
[Unit]
Description=Open vSwitch server daemon
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/share/openvswitch/scripts/ovs-ctl start
ExecStop=/usr/local/share/openvswitch/scripts/ovs-ctl stop
[Install]
WantedBy=multi-user.target
加载服务并设置开机自启
systemctl daemon-reload
systemctl enable ovs
4、配置网桥
(1)创建虚拟网桥
# 创建网桥
ovs-vsctl add-br br0
# 将端口加入网桥
ovs-vsctl add-port br0 eth0
ovs-vsctl add-port br0 eth0
# 物理端口开启混杂模式,采用vm虚拟机时需要虚拟主机端口开启混杂模式和伪传输
ip link set eth0 promisc on
ip link set eth1 promisc on
# 启用网桥
ip link set eth0 up
ip link set eth1 up
ip link set br0 up
(2)查看网桥状态
ovs-vsctl show
# 查看所有网桥
ovs-vsctl list-br
# 列出挂载了端口的网桥
ovs-vsctl port-to-br eth0
# 删除网桥上已经挂接的网口
ovs-vsctl del-port br0 eth0
# 删除网桥
ovs-vsctl del-br br0
# 查看网桥上的phy1端口信息
ovs-vsctl list port br0 phy1
(3)配置stp
默认网桥是没有开启生成树协议的,如果出现冗余线路,则可能会出现环路的情况
# 检查br0的网桥功能是否开启
ovs-vsctl get bridge br0 stp_enable
# 开启stp功能
ovs-vsctl set bridge br0 stp_enable=true
# 查看网桥配置信息
ovs-vsctl list bridge br0
(4)设置网桥不连接控制器的转发模式
ovs 交换机在连接不上控制器时有一个fail_mode的标志,当sdn控制器故障时,交换机的模式;fail_mode 故障模式有两种状态,standalone、secure。
- standalone mode,在三次探测控制器连接不成功后,此时ovs-vswitchd将会接管转发逻辑(后台仍然尝试连接到控制器,一旦连接则退出fail状态),OpenvSwitch将作为一个正常的mac 学习的二层交换机。
- secure mode,则ovs-vswitchd将不会自动配置新的转发流表,OpenvSwitch将按照原先有的流表转发
# standalone(default):清除所有控制器下发的流表,ovs自己接管
# secure:按照原来流表继续转发
# 查看当前转发模式
ovs-vsctl get-fail-mode br0
# 配置为secure模式
ovs-vsctl set-fail-mode br0 secure
# 查看网桥信息
ovs-vsctl show
删除fail mode标志
ovs-vsctl del-fail-mode br0
(5)mac表学习
工作在普通交换机模式下就有mac自学习功能。和普通的交换机一样,ovs交换机也能查看mac和端口关系的对应表。
ovs-appctl fdb/show br0
5、流表配置
(1)将port1 in方向的流量转发到port2,port2同理,port编号通过ovs-vsctl show
查看
ovs-ofctl add-flow br0 in_port=1,action=output:2
ovs-ofctl add-flow br0 in_port=2,action=output:1
(2)匹配ip地址
dl_type:表示指定的协议。ip为:0x0800
nw_src: 源ip地址
nw_dst: 目的ip地址
ovs-ofctl add-flow br0 dl_type=0x0800,nw_dst=10.0.0.0/8,action=output:0
ovs-ofctl add-flow br0 dl_type=0x0800,nw_dst=10.0.0.0/10,action=output:1
(3)删除流表
dl_type字段名称表
字段名称 | 说明 |
---|---|
in_port=port | 传递数据包的端口的 OpenFlow 端口编号 |
dl_vlan=vlan | 数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包 |
dl_vlan_pcp=priority | VLAN 优先级,改值取值区间为[0-7]。数字越大,表示优先级越高。 |
dl_src= |
匹配源或者目标的 MAC地址01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址00:00:00:00:00:00/01:00:00:00:00:00 代表单播 |
dl_type=ethertype | 匹配以太网协议类型,其中: dl_type=0x0800 代表 IPv4 协议 dl_type=0x086dd 代表 IPv6 协议 dl_type=0x0806 代表 ARP 协议 |
nw_src=ip[/netmask]nw_dst=ip[/netmask] | 当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址,可以使 IP 地址或者域名 |
nw_proto=proto | 和 dl_type 字段协同使用。当 dl_type=0x0800 时,匹配 IP 协议编号 当 dl_type=0x086dd 代表 IPv6 协议编号 |
table=number | 指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0 通过使用流表编号,可以创建或者修改多个 Table 中的 Flow |
reg |
交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值 |
tp_src=number | TCP/UDP/SCTP 源端口 |
tp_dst=number | TCP/UDP/SCTP 目的端口 |