外网访问原理分析

本节咱们会将上节建立的 ext_net 链接到 router,并验证内外网的连通性。网络

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

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

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

点击 router_100_101 的 “Set Gateway” 按钮。3d

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

外网设置成功。blog

咱们须要看看 router 发生了什么变化。 点击 “router_100_101” 连接,打开 “Interfaces” 标签页接口

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

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

在 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

相关文章
相关标签/搜索