问题导读
1.如何查看网络名字空间?
2.网络名字空间开头的名字有什么规律?
3.dhcp服务是如何实现的?
4.router的实现是通过iptables进行的是否正确?
5.SNAT和DNAT规则有什么作用?

接上篇:
深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式

在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

可以用ip netns list命令来查看已经存在的名字空间。

[Bash shell] 纯文本查看 复制代码
01 $ ip net
02 qdhcp-ea3928dc-b1fd-4a1a-940e-82b8c55214e6
03 qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e

qdhcp开头的名字空间是dhcp服务器使用的,qrouter开头的则是router服务使用的。 可以通过 ip netns exec namespaceid command 来在指定的网络名字空间中执行网络命令,例如

[Bash shell] 纯文本查看 复制代码
01 # ip netns exec qdhcp-88b1609c-68e0-49ca-a658-f1edff54a264 ip addr
02 71: ns-f14c598d-98: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
03     link/ether fa:16:3e:10:2f:03 brd ff:ff:ff:ff:ff:ff
04     inet 10.1.0.3/24 brd 10.1.0.255 scope global ns-f14c598d-98
05     inet6 fe80::f816:3eff:fe10:2f03/64 scope link
06        valid_lft forever preferred_lft forever

可以看到,dhcp服务的网络名字空间中只有一个网络接口“ns-f14c598d-98”,它连接到br-int的tapf14c598d-98接口上。

DHCP 服务

dhcp服务是通过dnsmasq进程(轻量级服务器,可以提供dns、dhcp、tftp等服务)来实现的,该进程绑定到dhcp名字空间中的br-int的接口上。可以查看相关的进程。

[Bash shell] 纯文本查看 复制代码
01 # ps -fe | grep 88b1609c-68e0-49ca-a658-f1edff54a264
02 nobody   23195     1  0 Oct26 ?        00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=ns-f14c598d-98 --except-interface=lo --pid-file=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/host --dhcp-optsfile=/var/lib/neutron/dhcp/88b1609c-68e0-49ca-a658-f1edff54a264/opts --dhcp-script=/usr/bin/neutron-dhcp-agent-dnsmasq-lease-update --leasefile-ro --dhcp-range=tag0,10.1.0.0,static,120s --conf-file= --domain=openstacklocal
03 root     23196 23195  0 Oct26 ?        00:00:00 dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interf

路由服务

首先,要理解什么是 router,router是提供跨 subnet 的互联功能的。比如用户的内部网络中主机想要访问外部互联网的地址,就需要router来转发(因此,所有跟外部网络的流量都必须经过router)。目前router的实现是通过iptables进行的。

同样的,router服务也运行在自己的名字空间中,可以通过如下命令查看:

[Bash shell] 纯文本查看 复制代码
01 sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e ip addr
02 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
03     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
04     inet 127.0.0.1/8 scope host lo
05        valid_lft forever preferred_lft forever
06     inet6 ::1/128 scope host
07        valid_lft forever preferred_lft forever
08 49: qr-694450d6-f6: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
09     link/ether fa:16:3e:5d:18:10 brd ff:ff:ff:ff:ff:ff
10     inet 10.0.0.1/24 brd 10.0.0.255 scope global qr-694450d6-f6
11        valid_lft forever preferred_lft forever
12     inet6 fe80::f816:3eff:fe5d:1810/64 scope link
13        valid_lft forever preferred_lft forever
14 50: qg-e76de35e-90: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
15     link/ether fa:16:3e:70:24:92 brd ff:ff:ff:ff:ff:ff
16     inet 9.186.100.2/24 brd 9.186.100.255 scope global qg-e76de35e-90
17        valid_lft forever preferred_lft forever
18     inet 9.186.100.129/32 brd 9.186.100.129 scope global qg-e76de35e-90
19        valid_lft forever preferred_lft forever
20     inet6 fe80::f816:3eff:fe70:2492/64 scope link
21        valid_lft forever preferred_lft forever

可以看出,该名字空间中包括两个网络接口。

第一个接口 qr-694450d6-f6(10.0.0.1)跟 br-int 上的接口相连。即任何从 br-int 来的找 10.0.0.1 (租户的私有网段)的网包都会到达这个接口。

第二个接口 qg-e76de35e-90 连接到 br-ex 上的接口,即任何从外部来的网包,询问 9.186.100.2(默认的静态 NAT 外部地址)或 9.186.100.129(租户申请的 floating IP 地址),都会到达这个接口。

查看该名字空间中的路由表:

[Bash shell] 纯文本查看 复制代码
01 sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e ip route
02 default via 9.186.100.1 dev qg-e76de35e-90
03 9.186.100.0/24 dev qg-e76de35e-90  proto kernel  scope link  src 9.186.100.2
04 10.0.0.0/24 dev qr-694450d6-f6  proto kernel  scope link  src 10.0.0.1

默认情况,以及访问外部网络的时候,休会从 qg-xxx 接口发出,经过 br-ex 发布到外网。

访问租户内网的时候,会从 qr-xxx 接口发出,发给 br-int。

[Bash shell] 纯文本查看 复制代码
01 sudo ip net exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e iptables -t nat -S
02 -P PREROUTING ACCEPT
03 -P INPUT ACCEPT
04 -P OUTPUT ACCEPT
05 -P POSTROUTING ACCEPT
06 -N neutron-postrouting-bottom
07 -N neutron-vpn-agen-OUTPUT
08 -N neutron-vpn-agen-POSTROUTING
09 -N neutron-vpn-agen-PREROUTING
10 -N neutron-vpn-agen-float-snat
11 -N neutron-vpn-agen-snat
12 -A PREROUTING -j neutron-vpn-agen-PREROUTING
13 -A OUTPUT -j neutron-vpn-agen-OUTPUT
14 -A POSTROUTING -j neutron-vpn-agen-POSTROUTING
15 -A POSTROUTING -j neutron-postrouting-bottom
16 -A neutron-postrouting-bottom -j neutron-vpn-agen-snat
17 -A neutron-vpn-agen-OUTPUT -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
18 -A neutron-vpn-agen-POSTROUTING ! -i qg-e76de35e-90 ! -o qg-e76de35e-90 -m conntrack ! --ctstate DNAT -j ACCEPT
19 -A neutron-vpn-agen-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
20 -A neutron-vpn-agen-PREROUTING -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
21 -A neutron-vpn-agen-float-snat -s 10.0.0.2/32 -j SNAT --to-source 9.186.100.129
22 -A neutron-vpn-agen-snat -j neutron-vpn-agen-float-snat
23 -A neutron-vpn-agen-snat -s 10.0.0.0/24 -j SNAT --to-source 9.186.100.2

其中SNAT和DNAT规则完成外部 floating ip (9.186.100.129)到内部 ip(10.0.0.2) 的映射:

[Bash shell] 纯文本查看 复制代码
01 -A neutron-vpn-agen-OUTPUT -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
02 -A neutron-vpn-agen-PREROUTING -d 9.186.100.129/32 -j DNAT --to-destination 10.0.0.2
03 -A neutron-vpn-agen-float-snat -s 10.0.0.2/32 -j SNAT --to-source 9.186.100.129

另外有一条SNAT规则把所有其他的内部IP出来的流量都映射到外部IP 9.186.100.2。这样即使在内部虚拟机没有外部IP的情况下,也可以发起对外网的访问。

[Bash shell] 纯文本查看 复制代码
01 -A neutron-vpn-agen-snat -s 10.0.0.0/24 -j SNAT --to-source 9.186.100.2

深入理解 Neutron -- OpenStack 网络实现(4):网络名字空间的更多相关文章

  1. 深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式

    问题导读1.VXLAN 模式下,网络的架构跟 GRE 模式类似,他们的不同点在什么地方?2.网络节点的作用是什么?3.tap-xxx.qr-xxx是指什么? 接上篇:深入理解 Neutron -- O ...

  2. 深入理解 Neutron -- OpenStack 网络实现(2):VLAN 模式

    问题导读 1.br-int.br-ethx的作用是什么?2.安全组策略是如何实现的?3.VLAN 模式与GRE模式有哪些不同点?流量上有哪些不同?4.L3 agent实现了什么功能? 接上篇深入理解 ...

  3. 深入理解 Neutron -- OpenStack 网络实现(1):GRE 模式

    问题导读1.什么是VETH.qvb.qvo?2.qbr的存在的作用是什么?3.router服务的作用是什么? 如果不具有Linux网络基础,比如防火墙如何过滤ip.端口或则对openstack ovs ...

  4. Neutron 理解 (9): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的 [How Nova Implements Security Group and How Neutron Implements Virtual Firewall]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  5. Neutron 理解 (1): Neutron 所实现的虚拟化网络 [How Netruon Virtualizes Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  6. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  7. 【openstack N版】——网络服务neutron

    一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...

  8. 【openstack N版】——网络服务neutron(flat扁平网络)

    一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...

  9. OpenStack 网络服务 Neutron 多网卡(提供者网络)(十八)

    OpenStack 网络服务 Neutron 多网卡,分为内部网络.外部网络 使用vmware模拟两张网卡 添加网卡 网卡配置 cd /etc/sysconfig/network-scripts cp ...

随机推荐

  1. unity----------------------四元数的概念

    作者:Yang Eninala链接:https://www.zhihu.com/question/23005815/answer/33971127来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  2. Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理

    首先,白话一下RBAC模型.RBAC是基于角色的访问控制(Role-Based Access Control)的简称.RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,wh ...

  3. winform c#中子窗体关闭刷新父窗体

    父窗体Form1 子窗体Form2 Form1中有一个datagridview控件和一添加按钮,Form2中有一个Text控件和一个保存按钮 要求点击Form1窗体上的添加按钮,弹出Form2,再te ...

  4. 关于Struts2的文件下载

    首先先来说下关于文件下载的原理: 服务端为客户端提供了一个下载服务,所以服务端需要一个输出流(把客户请求下载的文件输出),相对于服务端来说,客户端需要下载接收一个文件,所以它需要一个输入流(接收文件) ...

  5. javascript报错集锦

    1.JS 异常之 missing ) after argument list 错误释疑报错原因:不是字符串就输出啦

  6. 怎么解决BarTender因为未检测到IIS安装失败的问题

    个别小伙伴在安装BarTender条码标签设计软件的时候,遇到“未检测到IIS,无法安装BarTender Web Print Server配套程序”导致安装失败的问题,本文小编给大家分享解决BarT ...

  7. linux 安装 Django 安装

    下载源码包:https://www.djangoproject.com/download/ 输入以下命令并安装: tar xzvf Django-X.Y.tar.gz # 解压下载包 cd Djang ...

  8. mongo文件空间

    mongo的文件空间,是由一个一个的文件空间组成,如下图 在mongodb刚安装完成时只有一个指定的db都只有一个文件空间而已,例如这里的db是filedb 那么他的第一个文件空间为filedb.0, ...

  9. python monkey 猴子补丁技术编程,修改python json dumps方法。

    1.猴子补丁就是不改变原有模块的内容的前提下,给原有模块新增方法或者修改原有模块. 一个模块的函数,如果希望改变函数的功能,不改变函数名,通常是库模块,你不可能去修改三方库的源码的,实施起来不方便,而 ...

  10. aspose导出excel文件

    using Aspose.Cells; using System; using System.Collections.Generic; using System.Data; using System. ...