
上一節完我們建立了外部網絡 ext_net,接下來需要将其連接配接到 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,對應的 br-ex 的 port “qg-cf54d3ea-6a”。
在 router 的 namespace 中查可以看到 qg-cf54d3ea-6a 已經配置了 IP 10.10.10.2。
router interface 的命名規則如下:
1. 如果 interface 用于連接配接租戶網絡,命名格式為 qr-xxx。
2. 如果 interface 用于連接配接外部網絡,命名格式為 qg-xxx。
檢視 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-cf54d3ea-6a 發出的時候,會做一次 Source NAT,将包的源位址修改為 router 的接口位址 10.10.10.2,這樣就能夠保證目的端能夠将應答的包發回給 router,然後再轉發回源端 instance。
有關 Source NAT 的詳細分析可以參考 Linux Bridge 中 router 的相關章節。
通過 SNAT 使得 instance 能夠直接通路外網,但外網還不能直接通路 instance。
直接通路 instance 指的是通信連接配接由外網發起,例如從外網 SSH instance。
如果需要從外網直接通路 instance,可以利用 floating IP。
Open vSwitch driver 環境中 floating IP 的實作與 Linux Bridge driver 完全一樣:
都是通過在 router 提供網關的外網 interface 上配置 iptables NAT 規則實作。
有關 floating IP 的詳細分析可以參考 Linux Bridge 中 floating IP 的相關章節。
至此,OVS 的路由服務就讨論完了,下一節我們将開始學習 Neutron VxLAN 的 OVS 實作。