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