openstack通过Network Namespace和iptables实现租户私有网络互訪和L3路由功能
安装架构介绍
本文旨在通过自己搭建类似neutron (openvswitch + gre) 实现SDN 的环境,学习了解其工作原理,模拟核心原理。比方:同一租户自己定义网络 instance 互通,手动为instance 分配 floating ip 等相关内容。
虚拟网络
须要新建3个虚拟网络Net0、Net1和Net2。其在virtual box 中相应配置例如以下。
Net0:
Network name: VirtualBox host-only Ethernet Adapter#2
Purpose: administrator / management network
IP block: 10.20.0.0/24
DHCP: disable
Linux device: eth0
Net1:
Network name: VirtualBox host-only Ethernet Adapter#3
Purpose: public network
DHCP: disable
IP block: 172.16.0.0/24
Linux device: eth1
Net2:
Network name: VirtualBox host-only Ethernet Adapter#4
Purpose: Storage/private network
DHCP: disable
IP block: 192.168.4.0/24
Linux device: eth2
虚拟机
须要新建2个虚拟机VM1和VM2,其相应配置例如以下。
VM1:
Name : network1
vCPU:1
Memory :1G
Disk:30G
Network:net1,net2,net3
VM2:
Name: compute1
vCPU:1
Memory :1G
Disk:30G
Networks:net1,net2,net3
Linux
interface设置
network1
eth0:10.20.0.201 (management network)
eht1:172.16.0.201 (public/external network)
eht2:192.168.4.201 (private network,gre tunning)
compute1
eth0:10.20.0.202 (management network)
eht1:(disabled)
eht2:192.168.4.202 (private network,gre tunning)
模拟安装网络节点(Network1)
模拟Network 节点相关实现,比方L3、dhcp-agent实现。为了模拟多节点网络情况,这里Network同一时候也模拟一个计算节点,模拟M2 openvswitch 实现。上面执行instance1。
网络接口配置
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.20.0.201
NETMASK=255.255.255.0
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.16.0.201
NETMASK=255.255.255.0
vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.4.201
NETMASK=255.255.255.0
重新启动网络服务
service network restart
安装须要用到的包
yum install libvirt openvswitch python-virtinst xauth tigervnc -y
移除默认的libvirt 网络。方便清晰分析网络情况
virsh net-destroy default
virsh net-autostart --disable default
virsh net-undefine default
设置同意ipforwarding
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
马上生效
sysctl -p
启动openvswitch
service openvswitch start
chkconfig openvswitch on
创建一个linux bridge
brctl addbr qbr01
ip link set qbr01 up
创建一个instance,并连接到qbr01 Bridge,网络接口部分配置例如以下
<interface type='bridge'>
<source bridge='qbr01'/>
<target dev='tap01'/>
<model type='virtio'/>
<driver name='qemu'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
能够參考附件./gre/instance1.xml创建
cp ~/gre/ /var/tmp/
cd /var/tmp/gre
mv cirros-0.3.0-x86_64-disk.img instance1.img
virsh define instance1.xml
virsh start instance1
virsh vncdisplay instance1
vncviewer :0
启动console 以后,登录加入ip 地址 192.168.1.11
ip addr add 192.168.1.11/24 dev eth0
route add default gw 192.168.1.1
创建一个内部bridge br-int。 模拟 OpenStack integrated bridge
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.202
创建一个veth peer。连接Linux Bridge 'qbr01' 和 OpenvSwich Bridge 'br-ini'
ip link add qvo01 type veth peer name qvb01
brctl addif qbr01 qvb01
ovs-vsctl add-port br-int qvo01
ovs-vsctl set port qvo01 tag=100
ip link set qvb01 up
ip link set qvo01 up
查看如今network1上的 br-int
ovs-vsctl show
模拟安装计算节点(compute1)
网络接口配置
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.20.0.202
NETMASK=255.255.255.0
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.16.0.202
NETMASK=255.255.255.0
vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.4.202
NETMASK=255.255.255.0
重新启动网络服务
service network restart
安装须要用到的包
yum install libvirt openvswitch python-virtinst xauth tigervnc
移除libvirt 默认的网络
virsh net-destroy default
virsh net-autostart --disable default
virsh net-undefine default
设置同意ipforwarding
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
马上生效
sysctl -p
启动openvswitch
service openvswitch start
chkconfig openvswitch on
创建一个linux bridge
brctl addbr qbr02
ip link set qbr02 up
创建一个vm,并连接到qbr02
上gre文件夹到compute1 节点。能够參考附件./gre/instance2.xml创建
cp ~/gre/ /var/tmp/
cd /var/tmp/gre
mv cirros-0.3.0-x86_64-disk.img instance2.img
virsh define instance2.xml
virsh start instance2
virsh vncdesplay instance2
vncviewer :0
启动console 以后,登录加入ip得知 192.168.1.12
ip addr add 192.168.1.12/24 dev eth0
route add default gw 192.168.1.1
创建一个内部bridge br-int。 模拟 OpenStack integrated bridge
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int gre0 -- set interface gre0 type=gre options:remote_ip=192.168.4.201
创建一个veth peer。连接Linux Bridge 'qbr02' 和 OpenvSwich Bridge 'br-ini'
ip link add qvo02 type veth peer name qvb02
brctl addif qbr02 qvb02
ovs-vsctl add-port br-int qvo02
ovs-vsctl set port qvo02 tag=100
ip link set qvb02 up
ip link set qvo02 up
查看如今network1 上的 br-int
ovs-vsctl show
检查能否连通instance1,在instance2的控制台
ping 192.168.1.11
通过
Network Namespace 实现租户私有网络互訪
加入一个namespace,dhcp01用于隔离租户网络。
ip netns add dhcp01
为私有网络192.168.1.0/24 ,在命名空间dhcp01 中 创建dhcp 服务
ovs-vsctl add-port br-int tapdhcp01 -- set interface tapdhcp01 type=internal
ovs-vsctl set port tapdhcp01 tag=100
ip link set tapdhcp01 netns dhcp01
ip netns exec dhcp01 ip addr add 192.168.1.2/24 dev tapdhcp01
ip netns exec dhcp01 ip link set tapdhcp01 up
检查网络是否连通。在namespace 訪问instance1 和 instance2
ip netns exec dhcp01 ping 192.168.1.12
ip netns exec dhcp01 ping 192.168.1.11
通过
Network Namespace 和Iptables 实现L3 router
ovs-vsctl add-br br-ex
又一次配置eth1 和 br-ex
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
PROMISC=yes
MTU=1546
vi /etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPADDR0=172.16.0.201
PREFIX0=24
重新启动启动网络服务
ovs-vsctl add-port br-ex eth1 && service network restart
检查网络。配置后是否连通
ping 172.16.0.201
加入一个namespace。router01 用于路由和floating ip 分配
ip netns add router01
在br-int加入一个接口,作为私有网络192.168.1.0/24的网关
ovs-vsctl add-port br-int qr01 -- set interface qr01 type=internal
ovs-vsctl set port qr01 tag=100
ip link set qr01 netns router01
ip netns exec router01 ip addr add 192.168.1.1/24 dev qr01
ip netns exec router01 ip link set qr01 up
ip netns exec router01 ip link set lo up
在br-ex中加入一个接口,用于私网192.168.1.0/24设置下一跳地址
ovs-vsctl add-port br-ex qg01 -- set interface qg01 type=internal
ip link set qg01 netns router01
ip netns exec router01 ip addr add 172.16.0.100/24 dev qg01
ip netns exec router01 ip link set qg01 up
ip netns exec router01 ip link set lo up
模拟分配floating
ip 訪问instance1
为instance1 192.168.1.11 分配floating ip。172.16.0.101
ip netns exec router01 ip addr add 172.16.0.101/32 dev qg01
ip netns exec router01 iptables -t nat -A OUTPUT -d 172.16.0.101/32 -j DNAT --to-destination 192.168.1.11
ip netns exec router01 iptables -t nat -A PREROUTING -d 172.16.0.101/32 -j DNAT --to-destination 192.168.1.11
ip netns exec router01 iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -j SNAT --to-source 172.16.0.101
ip netns exec router01 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.0.100
測试floating ip
ping 172.16.0.101
假设须要清除nat chain
iptables -t nat -F
openstack通过Network Namespace和iptables实现租户私有网络互訪和L3路由功能的更多相关文章
- 一文搞懂 Linux network namespace
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 本文通过 IP ...
- network namespace连接的4种方法及性能
veth pair # add the namespaces ip netns add ns1 ip netns add ns2 # create the veth pair ip link add ...
- Netruon 理解(11):使用 NAT 将 Linux network namespace 连接外网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Netruon 理解(12):使用 Linux bridge 将 Linux network namespace 连接外网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 【转】linux network namespace 学习
原文地址:https://segmentfault.com/a/1190000004059167 介绍 在专业的网络世界中,经常使用到Virtual Routing and Forwarding(VR ...
- linux 网络虚拟化: network namespace 简介
linux 网络虚拟化: network namespace 简介 network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息.不管是虚拟机还是 ...
- 【转】理解Docker容器网络之Linux Network Namespace
原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...
- Linux ns 6. Network Namespace 详解
文章目录 1. 简介 1.1 Docker Network 桥接模式配置 2. 代码解析 2.1 copy_net_ns() 2.2 pernet_list 2.2.1 loopback_net_op ...
- 利用setns()将进程加入一个新的network namespace
1.首先使用docker创建一个容器,并获取该容器的network namespace monster@monster-Z:~$ docker run -itd --name test ubuntu ...
随机推荐
- 【POJ 3700】 Missile Defence System
[题目链接] http://poj.org/problem?id=3700 [算法] 对于每一枚导弹,有4种决策 : 1.新建一套递增的系统拦截它 2.新建一套递减的系统拦截它 3.在已经建好的递增拦 ...
- 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)
00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...
- ES6 Proxy 性能之我见
ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...
- C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- NFine平台去掉平台介绍页面出现的一系列问题
1.去掉平台介绍页面要做的操作:数值Index页面的下面两处内容 2.注释掉以上两处内容后出现的问题:•当打开多个页面后,最先打开的第一个页面(如下图1的位置)点击×号不能关闭页面:•当打开多个页面后 ...
- CI中的url相关函数以及路由设置和伪静态技术
当使用CI框架进行开发时,我们的一些数据传递的URL不应该写死,可以使用如下方法:比如说我们需要表单提交一个数据: 1.在controller控制器中我们需要先创建一个加载helper和视图的方法: ...
- 【Oracle】RAC控制文件多路复用
1.—关闭数据库,各个节点都要关闭: [oracle@rac1 ~]$ srvctl stop database -d racdb -o immediate 2.—启动任一节点到nomount状态: ...
- 【Oracle】ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
今天数据库在查询数据的时候显示了这个错误: ORA-01157: cannot identify/lock data file 201 - see DBWR trace file ORA-01110: ...
- 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0
前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...
- 编译OpenCV遇到Qmake问题
1.Ubuntu安装OpenCv,出现:qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or ...