flow table
在支持OpenFlow的交换机中包含了若干个Flow table,Flow table可以用来控制数据包的处理,交换机会执行与flow相匹配的表项中所罗列的动作。
OpenFlow controller通过使用OpenFlow协议来管理交换机,并且controller也能通过使用OpenFlow协议来获取交换机上的端口、流量的统计信息或其他情报,并可以根据这些信息来调整各端口的流量。
交换机中维护的每个flow table都包含有很多个条目,这些条目会根据自身的一个优先级从高到底进行排序,优先级最高的条目位于flow table的顶部。
当一个数据包进入到交换机时,先和优先级最高的条目进行匹配,如果匹配成功,那么就停止继续匹配动作,去执行该条目中的一组action。如果匹配失败,则按照优先级高低,继续匹配下一条。如果flow table中所有的条目都不匹配,每张表会有默认的动作,一般为drop或者转给下一张表。
1. 测试环境
主机一:192.168.3.200
网桥:br0
测试容器:
con2:10.10.1.2
con3:10.10.1.3
主机二:92.168.3.248
网桥:br1
测试容器
con4:10.10.2.4
con5:10.10.2.5
con6:10.10.1.6
主机一配置:
创建容器
docker run -itd –name con2 –net=none ubuntu:14.04 /bin/bash
docker run -itd –name con3 –net=none ubuntu:14.04 /bin/bash
创建网桥
ovs-vsctl add-br br0
给容器添加网卡,并挂载到br0上
ovs-docker add-port br0 eth0 con2 –ipaddress=10.10.1.2/24
ovs-docker add-port br0 eth0 con3 –ipaddress=10.10.1.3/24
主机二配置:
创建容器
docker run -itd –name con4 –net=none ubuntu:14.04 /bin/bash
docker run -itd –name con5 –net=none ubuntu:14.04 /bin/bash
docker run -itd –name con6 –net=none ubuntu:14.04 /bin/bash
创建网桥
ovs-vsctl add-br br1
给容器添加网卡,并挂载到br1上
ovs-docker add-port br1 eth0 con4 –ipaddress=10.10.2.4/24
ovs-docker add-port br1 eth0 con5 –ipaddress=10.10.2.5/24
ovs-docker add-port br1 eth0 con6 –ipaddress=10.10.1.6/24
查看默认流表
主机一:
ovs-ofctl dump-flows br0
主机二:
ovs-ofctl dump-flows br1
2. 主机内连通性测试
在容器con2中ping con3,
docker exec -it con2 sh
删除主机一默认流表,测试con2和con3的连通性,发现网络已经不通
ovs-ofctl dump-flows br0
ovs-ofctl del-flows br0
ovs-ofctl dump-flows br0
docker exec -it con2 sh
添加流表
如果要con2和con3能够进行通信,需要建立规则,让ovs转发对应的数据
查看con2和con3在ovs上的网络端口
ovs-vsctl show
ovs-vsctl list interface \”31f988622c094_l\” | grep ofport
ovs-vsctl list interface \”94bcddea7e614_l\” | grep ofport
添加规则
ovs-ofctl add-flow br0 \”priority=1, in_port=1, actions=output:2\”
ovs-ofctl add-flow br0 \”priority=2, in_port=2, actions=output:1\”
ovs-ofctl dump-flows br0
测试主机一con2和con3的连通性
docker exec -it con2 sh
3. 测试优先级,设备一条优先级高的规则
流表中的规则是有优先级的,priority数值越大,优先级越高。流表中,优先级高的优先匹配,并执行匹配规则的actions。如果不匹配,继续匹配优先级低的下一条。
ovs-ofctl add-flow br0 \”priority=3, in_port=2, actions=drop\”
docker exec -it con2 sh
4. 跨网段连通性测试
在ip为10.10.2.4的con4上ping另一台主机上的con2 10.10.1.2
docker exec -it con4 sh
创建vxlan
主机一
ovs-vsctl add-port br0 vxlan1 — set interface vxlan1 type=vxlan options:remote_ip=192.168.3.248 options:key=flow
ovs-vsctl show
主机二
ovs-vsctl add-port br1 vxlan1 — set interface vxlan1 type=vxlan options:remote_ip=192.168.3.200 options:key=flow
ovs-vsctl show
添加流表规则
主机一
ovs-vsctl list interface \”vxlan1\”
ovs-ofctl add-flow br0 \”priority=6, in_port=1, actions=output:3\”
ovs-ofctl add-flow br0 \”priority=6, in_port=3, actions=output:1\”
ovs-ofctl dump-flows br0
主机二
ovs-vsctl list interface \”vxlan1\”
ovs-ofctl add-flow br1 \”priority=4, in_port=5, actions=output:6\”
ovs-ofctl add-flow br1 \”priority=4, in_port=6, actions=output:5\”
ovs-ofctl dump-flows br1
主机二 con4 上测试到主机一 con2的连通性
docker exec -it con4 sh
发现网络并不通,查看发现路由规则有问题,在主机二con4和主机一con2上添加默认路由规则,注意这里需要加选项privileged权限进入容器。
主机一
docker exec -it –privileged con2 sh
route -n
route add default dev eth0
主机二
docker exec -it –privileged con4 sh
route -n
route add default dev eth0
再次从主机二 con4上测试到主机一 con2的连通性
docker exec -it –privileged con4 sh