ovs-docker配置网络
首先搬来了实验结构图:
正题:
一、辅助工作:
1. 安装openvswitch项目提供的支持Docker容器的辅助脚本ovs-docker:
wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker
chmod a+x ovs-docker
ps:该链接时好时坏,作者没有找到更好的下载方法,如果不成功多试几次
2. 安装Docker的辅助镜像,方便在容器里面使用linux命令:
service docker start 开启docker服务
docker pull busybox:latest 下载busybox镜像
准备工作做好了我们开始正式搭建网络,嘿嘿嘿
二、正式开始
1. 搭建网桥和docker容器:
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl show 查看已经搭建好的网桥信息,创建网桥时默认创建同名的网卡
ip link set br0 up 和创建的网卡设配相连
ip link set br1 up
加载两个无网络的docker容器:
注意:每创建完一个按ctrl+p,再按ctrl+q,这样就可以后台运行容器了!!!
docker run -it --privileged=true --net=none --name box1 busybox:latest /bin/sh
docker run -it --privileged=true --net=none --name box2 busybox:latest /bin/sh
这样就运行了两个容器box1和box2
2. 将网桥br0的一端和两个容器关联起来,并设置它们的ip、网关和vlan
ps:网关相当于后面要配置的netns,地址要相匹配
./ovs-docker add-port br0 eth0 box1 --ipaddress=10.0.0.1/24 --gateway=10.0.0.253
对应的参数依次是网桥、容器内的新接口名、对应容器,增加ip地址和网关
./ovs-docker set-vlan br0 eth0 box1 5 设置vlan号,实现vlan隔离
./ovs-docker add-port br0 eth0 box2 –ipaddress=10.0.0.2/24 –gateway=10.0.0.253
./ovs-docker set-vlan br0 eth0 box2 5
3. 将两个容器配置在了一个vlan下,测试两个容器的互通性
docker exec -it box1 /bin/sh 调出box1运行,在容器box1内pingbox2
ping 10.0.0.2
检查是否可以看到包的信息,如果失败检查一下自己的上述步骤,box2操作同上,但box1通了的话原理上box2pingbox1也是可以的
我们现在完成了网络结构图左上方的内容,下面我们需要和vlan外部通信了哦
4. 创建网络名称空间netns(相当于网关),实现网络隔离,并创建veth0和veth1网卡对来实现互连。
创建netns名称空间r1:
ip netns add r1
创建网卡对:
ip link add veth0.0 type veth peer name veth0.1
ip link add veth1.0 type veth peer name veth1.1
将网卡对的一端与netns互连,添加netns端的两个接口veth0.0和veth1.0:
ip link set veth0.0 netns r1
ip link set veth1.0 netns r1
在netns里启动两个接口:
ip netns exec r1 ip link set veth0.0 up
ip netns exec r1 ip link set veth1.0 up
给两个接口设置ip:
ip netns exec r1 ip addr add 192.168.2.221/24 dev veth0.0
给veth1.0配置两个浮动ip:
ip netns exec r1 ifconfig veth1.0:1 192.168.1.223/24 up
ip netns exec r1 ifconfig veth1.0:2 192.168.1.224/24 up
5. 将网卡对的另一边连接网桥,相当于配置网关
将网卡对的另外一端连接网桥:
ovs-vsctl add-port br0 veth0.1
ovs-vsctl add-port br1 veth1.1
ip link set veth0.1 up
ip link set veth1.1 up
配置veth0.1,地址要和之前设置的网网关地址相对应:
ip netns exec r1 ip addr add 10.0.0.253/24 dev veth0.1
设置veth0.1的vlan,保持和box1和box2的一致,即在同一个vlan里:
ovs-vsctl set port veth0.1 tag=5
到这个位置左边和下面就连通了,可以测试一下它们之间的联通性了。
进入容器box1或者box2,以1为例:
docker exec -it box1 /bin/sh
ping网关veth0.1:
ping 10.0.0.253 同一个vlan下可以ping通
pingveth0.0:
ping 192.168.1.221 不在一个vlan,原理上不可以Ping通,从而实现网络隔离
6. 配置br1
ifconfig br1 192.168.1.122
给br1配置本机的物理网卡ens33:
ovs-vsctl add-port br1 ens33
增加SNAT和DNAT规则是的容器和外网可以互相访问:
SNAT:使得box1(10.0.0.1)和box2(10.0.0.2)可以访问外网192.168.2.223、192.168.2.224(veth1.0)
ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.1/32 –j SNAT –-to-source 192.168.2.223
ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.2/32 –j SNAT –-to-source 192.168.2.224
DNAT:使得外网可以访问容器指定ip
ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.223/32 –j DNAT –-to-destination 10.0.0.1
ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.224/32 –j DNAT -–to-destination 10.0.0.2
整个网络架构基本完成,在br1这边也可以增加其他的vlan,从而实现网络隔离,下面可以测试整个网络的通信。
7. 测试
在容器box1:
可以ping通:
10.0.0.2(box2) 10.0.0.253(br0-veth0.1)
192.168.1.223(veth1.0) 192.168.1.224(veth1.0)
不可以ping通:
192.168.1.221(veth0.0) 192.168.1.122(br1)
以及本机ip
在本机:
可以ping通:
本机ip、192.168.1.122(br1)
192.168.1.223(veth1.0) 192.168.1.224(veth1.0)
192.168.1.221(veth0.0)
在br0所在vlan网里的都不行。
路很漫长,大家继续加油!!!