使用OpenVSwitch、netns构建复杂的虚拟网络

http://www.tuicool.com/articles/mAn6ziB

前言

虚拟网络真的挺复杂的, 这次将所学的知识”大杂烩”一下, 必须要有一些基础的知识才能看懂, 比如 ip netnsopenvswitch 以后有机会再写这些基础的

OpenVSwitch是基于Apache License 2.0的, 在Linux中实现多层虚拟交换机的软件。可通过编程实现大规模的网络自动化, 还支持标准的管理接口和协议(如xFlow, NetFlow, IPFIX, RSPAN, CLI…) OpenVSwitch的特性  http://openvswitch.org/features/

实验拓扑

<span style="font-family: 微软雅黑, 'Microsoft YaHei';">右击点开大图查看!</span>

准备工作:

shell> yum install qemu-kvm
shell> yum install iproute   # CentOS6需要使用特定yum源更新
shell> yum install openvswitch  #node3只需要安装这一个包, 需要特定的yum源
shell> service openvswitch start  #在各个节点启动openvswitch
node1> ovs-vsctl add-br k-br   #添加虚拟网桥, 供VM1,VM2连接

通过ip netns创建一个路由器提供dhcp

node1> ip netns add r1   #添加一个名称空间
node1> ip link add sin type veth peer name rin  #创建一对虚拟网卡
node1> ip link set sin up   #开启sin
node1> ip link set rin netns r1  #将rin添加到r1
node1> ip netns exec r1 ip link set rin up
node1> ip netns exec r1 ifconfig rin 10.0.1.10/24 up
node1> ip netns exec r1 dnsmasq -F 10.0.1.20,10.0.1.30 -O option:router,10.0.1.254
node1> ovs-vsctl add-port k-br sin  

开启VM测试


node1> vim /etc/ifup   #创建虚拟网卡启动文件
#!/bin/bash
#
bridge=k-br

if [ -n "$1" ]; then
    ip link set $1 up
    ovs-vsctl add-port $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo "Error"
    exit 1
fi


node1> vim /etc/ifdown  #创建虚拟网卡关闭文件
#!/bin/bash
#
bridge=k-br

if [ -n "$1" ]; then
    ip link set $1 down
    ovs-vsctl del-port $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo "Error"
    exit 1
fi
node1> chmod +x /etc/if*   #给网卡添加执行权限
node1> wget ftp://172.16.1.1/cirros1.img   #下载cirros, 我这个实在本地的yum源
node1> cp cirros1.img cirros2.img


#启动虚拟机实例, VM1和VM2
node1> qemu-kvm -m 256 -smp 1 -name "N1-cirros1" -drive file=cirros1.img,media=disk,format=qcow2,if=virtio  -net nic,macaddr=52:53:54:55:5a:01,model=virtio -net tap,ifname=vif0.1,script=/etc/ifup,downscript=/etc/ifdown -daemonize

node1> qemu-kvm -m 256 -smp 2 -name "N2-cirros2" -drive file=cirros2.img,media=disk,format=qcow2,if=virtio -net nic,macaddr=52:53:54:55:5a:02,model=virtio -net tap,ifname=vif0.2,script=/etc/ifup,downscript=/etc/ifdown -daemonize

测试
能够正常获取地址

#node2配置步骤

node2> ovs-vsctl add-br k-br  #添加虚拟网桥
node2> scp -p 192.168.2.1:/etc/if* /etc/  #复制网卡启动文件

#启动虚拟机实例
node2> qemu-kvm -m 256 -smp 1 -name "N2-cirros1" -drive file=cirros1.img,media=disk,format=qcow2,if=virtio -net nic,macaddr=52:53:54:55:5b:01,model=virtio -net tap,ifname=vif0.1,script=/etc/ifup,downscript=/etc/ifdown -daemonize

node2> qemu-kvm -m 256 -smp 2 -name "N2-cirros2" -drive file=cirros2.img,media=disk,format=qcow2,if=virtio -net nic,macaddr=52:53:54:55:5b:02,model=virtio -net tap,ifname=vif0.2,script=/etc/ifup,downscript=/etc/ifdown --daemonize

由于我们没有配置GRE, 所以N2-Cirros1,2并不能通过Node1上的r1获取到ip地址, 所以我们现在要配置Node1和Node2之间的GRE

node1> ovs-vsctl add-port k-br gre0 -- set interface gre0 type=gre options:remote_ip=192.168.2.2
node2> ovs-vsctl add-port k-br gre0 -- set interface gre0 type=gre options:remote_ip=192.168.2.1

此时我们就能够获取到IP地址了

通过GRE获取地址测试

网络节点的配置

nodeNet> ovs-vsctl add-br k-br   #添加k-br设备, 不懂可以看拓扑图
nodeNet> ovs-vsctl add-br k-br eth1
nodeNet> ifconfig k-br 192.168.2.3

创建VirtualRouter sr:

nodeNet> ip netns add sr
nodeNet> ip link add sin1 type veth peer name rin1
nodeNet> ip link set sin1 up
nodeNet> ovs-vsctl add-port k-br sin1   #将sin1加入k-br, 即将sr连接到k-br
nodeNet> ip link set rin1 netns sr 
nodeNet> ip netns exec sr ifconfig rin1 10.0.1.254

配置GRE:

#在网络节点上配置
nodeNet> ovs-vsctl add-port k-br gre1 -- set interface gre1 type=gre options:remote_ip=192.168.2.2
nodeNet> ovs-vsctl add-port k-br gre2 -- set interface gre1 type=gre options:remote_ip=192.168.2.1

#在node1和node2上配置
node1> ovs-vsctl add-port k-br gre1 -- set interface gre1 type=gre options:remote_ip=192.168.2.3
node2> ovs-vsctl add-port k-br gre1 -- set interface gre1 type=gre options:remote_ip=192.168.2.3

测试节点是否能够正常连接,这里如果node1,node2,nodeNET都接在一个交换机上,会出现环路,原本可以互相ping通的node1和node2上的虚拟机不通了,会提示DUP包,此时需要在三个节点的k-br上打开stp:ovs-vsctl set bridge k-br stp_enable=true,等一会即可恢复

桥接外网及SNAT,DNAT配置

#添加k-br2
nodeNet> ovs-vsctl add-br k-br2
nodeNet> ifconfig eth0 0  
nodeNet> ovs-vsctl add-port k-br2 eth0
nodeNet> ifconfig k-br2 172.16.1.4

#再次添加一对网卡:
nodeNet> ip link add sin2 type veth peer name rin2
nodeNet> ip link set sin2 up
nodeNet> ovs-vsctl add-port k-br2 sin2
nodeNet> ip link set rin2 netns sr
nodeNet> ip netns exec sr ifconfig rin2 172.16.1.9/24 up

#添加SNAT规则
nodeNet> ip netns exec sr sysctl -w net.ipv4.ip_forward=1
nodeNet> ip netns exec sr iptables -A POSTROUTING -t nat -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j SNAT --to-source 172.16.1.9

#添加DNAT规则
nodeNet> ip netns exec sr ifconfig rin2:0 172.16.1.20
nodeNet> ip netns exec sr iptables -A PREROUTING -t nat -i rin2 -d 172.16.1.20/32 -j DNAT --to-destination 10.0.1.23

添加完SNAT后,如果cirros1无法访问外网,看下netns sr里的路由,如果没有默认网关,则设置一下通向外网的默认网关:route add default gw x.x.x.x

最终测试

cirros1即可以访问外网, 外网也可以通过172.16.1.20访问cirros1

总结

其实只要画好图, 虚拟网络并不难, 只是配置较为繁琐,这个实验做了八个小时左右。。。

文章内容浅尝辄止, 大家有更好的见解可以提出, 觉得我写的不错, 可以点一波赞~(≧▽≦)/~ 
作者: AnyISaIln QQ: 1449472454 
感谢: MageEdu

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值