实现一个可以从外部访问到的网络命名空间

前言

写这篇文档是为了更好理解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以及路由之后。即可与外部互相通信。

你可能感兴趣的:(实现一个可以从外部访问到的网络命名空间)