实现一个可以从外部访问到的网络命名空间
前言
写这篇文档是为了更好理解openstack neutron组件中的弹性ip实现(在外部可以ping通qrouter中的qg网卡)。
这篇文章不在赘述基本知识。
环境介绍
一台vmware虚拟机:
- 虚拟机操作系统:centos7任意版本
- 虚拟机网卡:ens33,10.10.10.134
- 网关是vmware的 10.10.10.2。
实验目标:从宿主机ping通网络命名空间。
openstack neutron用到了ovs以及linux bridge。许多文档介绍是因为引入了安全组所以多了一层网桥。这里简化操作使用linux bridge + network namespace。
环境准备
关闭防火墙
如果你对防火墙有些了解的话,略过此步骤。
systemctl stop firewalld
systemctl stop iptables
安装软件
yum install -y tcpdump
yum install -y bridge-utils
yum install -y net-tools
开始
1. 网络命名空间
创建网络命名空间:
ip netns add ns2
查看网络命名空间:
ip netns
image.png
可以看到刚刚创建的ns2
2. 网卡对(veth pair)
网卡对类似一条网线。两个端口,并且端口之间保持连通。
创建网卡对:
ip link add veth-b-0 type veth peer name veth-b-1
这里的 veth-b-0 和 veth-b-1 是两个端口的名称,自定义。
查看网卡对:
ip link list
image.png
可以看到两个带有@标志的网卡。@之后的信息是为了告知这个网卡与谁组成一对,@之前的信息为网卡名称。
激活网卡对
ip link set veth-b-0 up
使用网卡对连接虚拟机与虚拟机上的网络命名空间:
将veth-b-1放入网络命名空间ns2中
ip link set veth-b-1 netns ns2
查看网络命名空间中的网卡信息:
ip netns exec ns2 ip a
image.png
配置网络命名空间中的网卡信息
为网络空间中的veth-b-1网卡添加外部网段的ip地址(注意地址冲突):
ip netns exec ns2 ifconfig veth-b-1 10.10.10.45/24 up
为网络命名空间添加默认路由为外部真实网关:
ip netns exec ns2 route add default gw 10.10.10.2
3. 网桥
注意创建网桥的过程中,网卡信息会有变动,因此外部的ssh连接会暂时中断,这里最好vmware控制台操作虚拟机。配置完成以后,ssh可以重新连接上。
创建网桥:
brctl addbr br2
将物理网卡添加到网桥下
将物理网卡的ip赋予网桥,我这里物理网卡的ip为10.10.10.134。注意替换成你自己的。
brctl addif br2 ens33
ifconfig ens33 0.0.0.0
ifconfig br2 10.10.10.134/24 up
此时ssh已经可以连接,但是ping baidu会失败。因为这里的默认路由因网卡信息的改变而被删除了。
添加上默认路由:
route add default gw 10.10.10.2
将网卡对接入网桥
veth-b-1已接入网络命名空间,还剩veth-b-0,这里将veth-b-0接入网桥当中。
brctl addif br2 veth-b-0
4. ping测试
稍微等待一小会。可以先尝试从虚拟机ping,再从windows ping。
此时从windows机器ping虚拟机中的网络命名空间中的veth-b-1网卡。ip为10.10.10.45
扩展
openstack qrouter 上的qg网卡多个ip实现
我们也可以为网络命名空间中的veth-b-1赋予多个ip:
ip netns exec ns2 ip addr add 10.10.10.46/24 dev veth-b-1
这个地址当然也是可以从外部ping通的。
还记得,前面装了一个tcpdump吗,如果不确定流量是否真的是到达了网络命名空间中的veth-b-1网卡上,我们可以利用这个工具抓包:
ip netns exec ns2 tcpdump -i veth-b-1 icmp
然后在windows机器上ping这个网卡的ip,可以看到抓包情况。
image.png
网络命名空间可以使用物理网卡吗?
实际测试,可以将物理网卡直接配置进网络命名空间中,配置好ip以及路由之后。即可与外部互相通信。