基于lxd容器搭建简单网络
-
创建三个容器,一个安装ovs作交换机VAP,另外两个普通容器作host
-
宿主机为ubuntu18.04,执行
lxc network create b1
创建桥 -
执行
lxc network attach b1 host1 eth0
将桥绑定host1的eth0端口 -
同理执行
lxc network attach b1 VAP eth0
将桥绑定VAP的eth0端口 -
同样操作,创建桥b2,再分别绑定到host2的eth0以及VAP的eth1端口
-
分别进入host1、host2,在/etc/network/interfaces中设置静态ip,网关可以先不设(或者直接采用ip addr add给端口设置临时的ip地址也可以,只不过重启机器或者服务后,地址可能会变),修改完配置文件是需要重启服务才能生效的哈,我的ubuntu命令是
service networking restart
-
进入交换机VAP,创网桥
ovs-vsctl add-br br0
-
将VAP的eth0网卡挂载到网桥下
ovs-vsctl add-port br0 eth0
,同理挂载eth1
-
OpenFlow 控制器(可以不设)
添加控制器命令ovs-vsctl set-controller <bridge> <target...>
例如:
添加一个控制器ovs-vsctl set-controller br0 tcp:1.2.3.4:6633
设置多个controllerovs-vsctl set-controller br0 tcp:1.2.3.4:6633 tcp:4.3.2.1:6633
添加使用unix socket通信的controllerovs-vsctl set-controller br0 unix:/var/run/xx/xx.sock
移除控制器命令ovs-vsctl del-controller br0
查询 brige 上已配置的控制器命令ovs-vsctl get-controller br0
-
设置网桥工作模式:
ovs 交换机在连接不上控制器时(前提是设置了控制器)有一个fail_mode的标志,所谓fail_mode就是故障模式,意思是SDN控制器故障时,交换机未连接控制器时的模式。
fail_mode 故障模式有两种状态,一种是standalone,一种是secure状态。
(1)如果是配置了standalone mode,在三次探测控制器连接不成功后,此时ovs-vswitchd将会接管转发逻辑(后台仍然尝试连接到控制器,一旦连接则退出fail状态),OpenvSwitch将作为一个正常的mac学习的二层交换机。
(2)如果是配置了secure mode,则ovs-vswitchd将不会自动配置新的转发流表,OpenvSwitch将按照原先有的流表转发。
简单来说:
standalone(default):清除所有控制器下发的流表,ovs自己接管
secure:按照原来流表继续转发
但第一次创建ovs网桥,还没有添加控制器,应该是没有故障模式的,本文实验只是初学者用ovs作为正常的交换机使用,所以先设置故障模式,采用ovs-vsctl get-fail-mode br0
命令可以查看当前网桥br0的故障模式,未设置前应该会返回空值。采用ovs-vsctl set-fail-mode br0 standalone
就配置了standalone工作模式。可以再次查看当前网桥br0的故障模式,应该会输出standalone,如下图所示表示设置成功。
-
配置规则:
需要有流规则,两个host才能通。先讲知识:
1)添加普通流表命令ovs-ofctl add-flow br0 in_port=1,actions=output:2
意思是对网桥br0,从1进从2出。
其中的1、2均为OpenFlow的端口 id ,可以通过命令ovs-ofctl show br0
来查看 br0 中各端口的 OpenFlow 端口 id,该 id 并不一定是按顺序的。如图所示,每个端口前标有数字即其端口🆔
也可以手动设置端口id:
比如将已在ovs中的端口veth1的OpenFlow端口设置成100:
ovs-vsctl set interface veth1 ofport_request=100
或将端口veth1添加到bridge br0中,并将veth1的OpenFlow端口设置成200:
ovs-vsctl add-port br0 veth1 -- set interface veth1 ofport_request=200
2)删除所有流表命令
ovs-ofctl del-flows br0
3)按匹配项设置流表
ovs-ofctl del-flows br0 "in_port=1",<匹配项>,actions=<动作>
匹配项包括匹配ip、mac、vlan等等诸多选项,动作有设置转出接口、改变vlan id等
此篇文章介绍的比较详细,这里不再一一赘述
本文实验仅用最简单的普通流表,由于需要两端互通才行,故添加两条流表:
ovs-ofctl add-flow br0 in_port=1,actions=output:2
表示从1进的从2出,以及下面的从2进的从1出:
ovs-ofctl add-flow br0 in_port=2,actions=output:1
-
启动网卡
此时测试两个host还没有通,发现上面命令ovs-ofctl show br0
列出各端口状态中,均为PORT_DOWN,说明端口还没有启动,采用命令ip link set eth0 up
启动端口eth0,同理也启动eth1后查看状态发现已启动。
-
ping测试
host1 ip:192.168.10.11
host2 ip:192.168.10.12
进入host1中执行命令ping 192.168.10.12
,连通!
-
补充
1)OVS的internal port 可以配置IP地址,普通 port 上配置的IP地址是不起作用的。
在创建 br0 时会自动创建一个同名internal port br0,配置地址可以用于与controller等联系
可以通过ip addr add 192.168.10.88/24 dev br0
为它配置ip地址
#也可以手动创建internal port,同时将其设置为VLAN 10的access port
ovs-vsctl add-br br0 intbr tag=10 -- set interface intbr type=internal
然后添加地址
ip addr add 20.20.20.20/24 dev intbr
2)端口主要用到access端口以及trunk端口
配置端口为Access口:
设置br0中的端口eth0为VLAN 10的access口ovs-vsctl set port eth0 tag=10
添加eth1到指定bridge br0中,同时将其配置成指定VLAN 10的access端口
ovs-svctl add-port br0 eth1 tag=10
配置端口为Trunk口
在br0上添加port eth1为VLAN 9,10,11的trunk
ovs-vsctl add-port br0 eth1 trunk=9,10,11
暂时补充这些,后面随着学习会继续添加。