文档章节

外网访问原理分析 - 每天5分钟玩转 OpenStack(105)

CloudMAN
 CloudMAN
发布于 2016/10/28 07:53
字数 717
阅读 251
收藏 1

本节我们会将上节创建的 ext_net 连接到 router,并验证内外网的连通性。

更重要的,我们会分析隐藏在表象之下的原理。

将外网连接到 Neutron 的虚拟路由器,这样 instance 才能访问外网。

点击菜单 Project -> Network -> Routers 进入 router 列表。

点击 router_100_101 的 “Set Gateway” 按钮。

在 “External Network” 下拉列表中选择 ext_net,点击 “Set Gateway”。

外网设置成功。

我们需要看看 router 发生了什么变化。 点击 “router_100_101” 链接,打开 “Interfaces” 标签页

router 多了一个新的 interface,IP 为 10.10.10.2。 该 interface 用于连接外网 ext_net。

查看控制节点的网络结构,外网 bridge 上已经连接了 router 的 tap 设备 tapb8b32a88-03。

在 router 的 namespace 中查看 tapb8b32a88-03 的 veth pair 设备。

该 veth pair 命名为 qg-b8b32a88-03,上面配置了 IP 10.10.10.2。

router 的每个 interface 在 namespace 中都有对应的 veth。 如果 veth 用于连接租户网络,命名格式为 qr-xxx,比如 qr-d568ba1a-74 和 qr-e17162c5-00。 如果 veth 用于连接外部网络,命名格式为 qg-xxx,比如 qg-b8b32a88-03。

查看 router 的路由表信息。

可以看到默认网关为 10.10.10.1。 意味着对于访问 vlan100 和 vlan101 租户网络以外的所有流量,router_100_101 都将转发给 ext_net 的网关 10.10.10.1。

现在 router_100_101 已经同时连接了 vlan100, vlan101 和 ext_net 三个网络,如下图所示:

下面我们在 cirros-vm3 上测试一下。

cirros-vm3 位于计算节点,现在已经可以 Ping 到 ext_net 网关 10.10.10.1 了。 通过 traceroute 查看一下 cirros-vm3 到 10.10.10.1 的路径

数据包经过两跳到达 10.10.10.1 网关。 1. 数据包首先发送到 router_100_101 连接 vlan101 的 interface(172.16.101.1)。 2. 然后通过连接 ext_net 的 interface(10.10.10.2) 转发出去,最后到达 10.10.10.1。

当数据包从 router 连接外网的接口 qg-b8b32a88-03 发出的时候,会做一次 Source NAT,即将包的源地址修改为 router 的接口地址 10.10.10.2,这样就能够保证目的端能够将应答的包发回给 router,然后再转发回源端 instance。

可以通过 iptables 命令查看 SNAT 的规则。

当 cirros-vm3(172.16.101.3) Ping 10.10.10.1 时,可用通过 tcpdump 分别观察 router 两个 interface 的 icmp 数据包来验证 SNAT 的行为。

vlan101 interface qr-e17162c5-00 的 tcpdump 输出:

ext_net interface qg-b8b32a88-03 的 tcpdump 输出:

SNAT 让 instance 能够直接访问外网,但外网还不能直接访问 instance。
因为 instance 没有外网 IP。 这里 “直接访问 instance” 是指通信连接由外网发起,例如从外网 SSH cirros-vm3。

这个问题可以通过 floating IP 解决,下一节我们将讨论浮动 IP。

 

blob.png

© 著作权归作者所有

CloudMAN
粉丝 536
博文 360
码字总数 221704
作品 0
海淀
私信 提问
实践 Network Policy - 每天5分钟玩转 Docker 容器技术(172)

为了演示 Network Policy,我们先部署一个 httpd 应用,其配置文件 为: httpd 有三个副本,通过 NodePort 类型的 Service 对外提供服务。部署应用: 当前没有定义任何 Network Policy,验证...

cloudman6
2018/05/24
0
0
查看 Secret - 每天5分钟玩转 Docker 容器技术(156)

可以通过 查看存在的 secret。 显示有两个数据条目, 查看条目的 Key: 如果还想查看 Value,可以用 : 然后通过 base64 将 Value 反编码: 下节学习如何在 Pod 中使用 Secret。 书籍: 1.《...

cloudman6
2018/04/17
0
0
环境变量方式使用 Secret - 每天5分钟玩转 Docker 容器技术(158)

通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret。 Pod 配置文件示例如下: 创建 Pod 并读取 Secret。 通过环境变量 和 成功读取到...

cloudman6
2018/04/22
0
0
用 k8s 管理机密信息 - 每天5分钟玩转 Docker 容器技术(155)

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。 Secret 会以密文的方式存储数据...

cloudman6
2018/04/15
0
0
部署 Helm - 每天5分钟玩转 Docker 容器技术(162)

本节我们将安装和部署 Helm 客户端和 Tiller 服务器。 Helm 客户端 通常,我们将 Helm 客户端安装在能够执行 命令的节点上,只需要下面一条命令: curl https://raw.githubusercontent.com/k...

cloudman6
2018/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sync 包讲解

sync.Once Once 的作用是多次调用但只执行一次,Once 只有一个方法,Once.Do(),向 Do 传入一个函数,这个函数在第一次执行 Once.Do() 的时候会被调用,以后再执行 Once.Do() 将没有任何动作...

李琼涛
26分钟前
4
0
java中的byte占一字节或4字节

https://www.jianshu.com/p/2f663dc820d0

南桥北木
40分钟前
5
0
Cassandra 常用命令

Linux控制台命令 #进入Cassandra的安装目录 cd /home/db/cassandra/cassandra #进入Cassandra 无密码 ./bin/cqlsh localhost(IP)有密码 ./bin/cqlsh localhost(IP)-u 用户名 #显示所...

最菜最菜之小菜鸟
45分钟前
6
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
53分钟前
5
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部