http://www.tuicool.com/articles/mAn6ziB
前言
虚拟网络真的挺复杂的, 这次将所学的知识”大杂烩”一下, 必须要有一些基础的知识才能看懂, 比如 ip netns
, openvswitch
以后有机会再写这些基础的
–
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