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

接上篇:
深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式
在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。
可以用ip netns list命令来查看已经存在的名字空间。
[Bash shell] 纯文本查看 复制代码
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 |
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 网络实现(3):VXLAN 模式
问题导读1.VXLAN 模式下,网络的架构跟 GRE 模式类似,他们的不同点在什么地方?2.网络节点的作用是什么?3.tap-xxx.qr-xxx是指什么? 接上篇:深入理解 Neutron -- O ...
- 深入理解 Neutron -- OpenStack 网络实现(2):VLAN 模式
问题导读 1.br-int.br-ethx的作用是什么?2.安全组策略是如何实现的?3.VLAN 模式与GRE模式有哪些不同点?流量上有哪些不同?4.L3 agent实现了什么功能? 接上篇深入理解 ...
- 深入理解 Neutron -- OpenStack 网络实现(1):GRE 模式
问题导读1.什么是VETH.qvb.qvo?2.qbr的存在的作用是什么?3.router服务的作用是什么? 如果不具有Linux网络基础,比如防火墙如何过滤ip.端口或则对openstack ovs ...
- 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 ...
- Neutron 理解 (1): Neutron 所实现的虚拟化网络 [How Netruon Virtualizes Network]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 【openstack N版】——网络服务neutron
一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...
- 【openstack N版】——网络服务neutron(flat扁平网络)
一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...
- OpenStack 网络服务 Neutron 多网卡(提供者网络)(十八)
OpenStack 网络服务 Neutron 多网卡,分为内部网络.外部网络 使用vmware模拟两张网卡 添加网卡 网卡配置 cd /etc/sysconfig/network-scripts cp ...
随机推荐
- mysql分页查询语句怎么写?
ref: http://www.dashen100.com/question/500 是用limit函数 取前5条数据 select * from table_name limit 0,5 或者 se ...
- MATLAB错误:下标索引必须是正整数类型或者逻辑类型
背景: Matlab R2015b 问题: 在运行BP算法时出现错误: 下标索引必须是正整数类型或者逻辑类型 output( i , class( i ) ) = 1 ; 解决办法: 根目录下运行, ...
- 如何能延长windows server 2008 R2激活期 .
当windows server 2008 R2使用已经到期的时候,要求激活,我们可以通过以下命令,延长激活期. 在运行中输入:slmgr.vbs -rearm 重新启动windows server 2 ...
- 和我一起学《HTTP权威指南》——Web服务器
Web服务器 Web服务器会做些什么 1.建立连接(接受或关闭一个客户端连接) 2.接收请求(读取HTTP报文) 3.处理请求(解释请求报文并采取行动) 4.访问资源 5.构建响应(创建带有正确首部的 ...
- Android学习之——切换应用主题实现日间和夜间效果的更换
前言 智能手机的迅速普及,大大的丰富了我们的娱乐生活.现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害. 因此,如今的应用往往开发了日间和夜间两种模式供用户切 ...
- 【QT学习】QT GUI应用程序的框架,文件分析
有几个名字,项目名,类名,界面对象名. 1.项目文件 项目名.pro(MyHelloQt.pro) 主要包括项目用到的模块,项目包含哪些源码文件,头文件,窗体文件,生成应用程序的名称. 由QT自动生成 ...
- zabbix-agents客户端安装
Windows下zabbix客户端的安装 记得关windows上的防火墙 1.首先需要下载zabbix_agents.rar文件 点击这里进行下载 当然也可以在www.zabbix.com进行下载 2 ...
- linux环境中,read命令的使用?
需求描述: 今天有一个需求主要是从一个文件中夺取内容,文件中每行呢又是有多个字段,中间通过空格来分隔的.那么这样的话,就是用到了read命令 在这里记录下read的使用方法. 命令说明:read命令就 ...
- teamviwer安装提示 Verification of your Teamviewer version failed!.
打开cmd输入 regsvr32 c:\windows\SysWOW64\wintrust.dll 就可以了.
- 表单验证<AngularJs>
经常使用的表单验证指令 1. 必填项验证 某个表单输入是否已填写,仅仅要在输入字段元素上加入HTML5标记required就可以: <input type="text" re ...