天天看點

外網通路原理分析 - 每天5分鐘玩轉 OpenStack(105)

本節我們會将上節建立的 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。

本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1866583

繼續閱讀