Neutron 對虛擬三層網絡的實現(xiàn)是通過其 L3 Agent (neutron-l3-agent)
該 Agent 利用 Linux IP 棧、route 和 iptables 來實現(xiàn)內網內不同網絡內的虛機之間的網絡流量,以及虛機和外網之間網絡流量的路由和轉發(fā)
為了在同一個Linux 系統(tǒng)上支持可能的 IP 地址空間重疊,它使用了 Linux network namespace 來提供隔離的轉發(fā)上下文
基礎知識
Linux network namespace
概念及操作
在二層網絡上,VLAN 可以將一個物理交換機分割成幾個獨立的虛擬交換機
在三層網絡上,Linux network namespace(netns) 可以將一個物理三層網絡分割成幾個獨立的虛擬三層網絡
Network namespace (netns)從 Linux 2.6.24 版本開始添加,直到 2.6.29 添加完成。每個 netns 擁有獨立的 (virtual)network devices, IP addresses, IP routing tables, /proc/net directory, ports 等等。新創(chuàng)建的 netns 默認只包含 loopback device。除了這個設備,每個 network device,不管是物理的還是虛擬的網卡還是網橋等,都只能存在于一個 netns。而且,連接物理硬件的物理設備只能存在于 root netns。其它普通的網絡設備可以被創(chuàng)建和添加到某個 netns
namespace 間的通信
- 一種簡單的方式是使用 Linux veth pair 來實現(xiàn)兩個 network namespace 之間的通信
- 當有兩個以上的 network namespace 之間需要通信時,需要使用一個虛機交換機,和兩個 veth pair
傳統(tǒng)的方式是 Linux bridge,也可以使用 Open vSwitch - 再一種方式是使用 Open vSwitch 和 OVS internal ports
veth (virtual Ethernet interfaces) 設備:這是一種成對出現(xiàn)的特殊網絡設備,它們象一根管道一樣連接在一起
VETH 設備總是成對出現(xiàn),送到一端請求發(fā)送的數據總是從另一端以請求接受的形式出現(xiàn)
創(chuàng)建并配置正確后,向其一端輸入數據,VETH 會改變數據的方向并將其送入內核網絡核心,完成數據的注入。在另一端能讀到此數據
iptables
netfilter/iptables 基本概念
netfilter/iptables(簡稱為iptables)組成 Linux 平臺下的包過濾防火墻
iptables 是一個 linux 用戶空間(userspace)模塊,位于/sbin/iptables,用戶可以使用它來操作防火墻表中的規(guī)則
真正實現(xiàn)防火墻功能的是 netfilter,它是一個 linux 內核模塊,做實際的包過濾
netfilter 使用表(table)和 鏈(chain)來組織網絡包的處理規(guī)則(rule)
iptables
iptables 是一個 CLI 類型的 Linux 用戶空間工具,它使得系統(tǒng)管理員能夠配置netfile 表(tables)中的鏈和規(guī)則
NAT的實現(xiàn)
可以使用 iptables nat 表來實現(xiàn)網絡地址轉換(NAT)。NAT 包括 SNAT (源地址轉換)和 DNAT (目的地址轉換)。兩者的區(qū)別在于做地址轉換是在路由前還是路由后
SNAT:路由 - 轉換 - 發(fā)出
數據經過時, 源地址發(fā)生改變,目的地址不變
- 封包先經過 PREROUTING,檢查目的 IP 是不是本網段的地址。是的話,走路徑A。
- 如果不是,則開始查詢路由表,查找到相應路由條目后(查找路由的過程在 PREROUTING 和 FORWARD 之間),經過 FORWARD 鏈進行轉發(fā),再通過 postrouting 時進行NAT轉換
DNAT:轉換 - 路由- 發(fā)出
DNAT 的功能正好和 SNAT 相反,源地址不變,目的地址發(fā)生改變
DNAT 可以用作 PNAT,可以將一個 IP 的端口轉換成另一個IP的另外一個端口號,經常用于內網服務器映射到公網,用來隱藏服務器的真實地址
- 在 DNAT 中,NAT 是在 PREROUTING 上做的。在數據進入主機后,路由選擇過程是在 PREROUTING 和 FORWARD 之間的,所以應該先做地址轉換之后,再進行路由選擇,而后經過 FORWARD,最后從 POSTROUTING 出去
- 要做 DNAT,需要添加 PREROUTING 規(guī)則,使用 “-j DNAT --to-destination”
route(Linux路由表)
Linux 系統(tǒng)的 route 命令用于顯示和操作 IP 路由表,它的主要作用是創(chuàng)建一個靜態(tài)路由來指定一個主機或者一個網絡通過一個網絡接口,如eth0
路由器的輔助(Secondary) IP
路由器有個 Secondary IP 的概念,這個特性可以創(chuàng)建邏輯子網,也就是說在一個物理網口上連接兩個子網,比如這個網口接到一臺交換機上,如 果這個網口沒有配置Secondary IP的話,那么這臺交換機只能連接一個網段的主機,比如 192.168.1.1/24,但是,如果它配置了Secondary IP,那么就可以連接兩個網段的主機,比如 192.168.1.1/24 和 10.0.0.1/24
Gratuitous ARP
Gratuitous ARP不同于一般的ARP請求,它并非期待得到IP對應的MAC地址,而是當主機啟動的時候,將發(fā)送一個Gratuitous arp請求,即請求自己的IP地址的MAC地址
- Change of L2 address:通告自己改變了 MAC 地址
- Duplicate address detection:重復 MAC 地址檢測
- Virtual IP:用于一組服務器做 failover 時通知周圍的機器新生效的 IP 地址的 MAC
Neutron L3 Agent 的實現(xiàn)原理
每個 L3 Agent 運行在一個 network namespace 中,每個 namespace 由 qrouter-<router-UUID>命名,比如 qrouter-e506f8fe-3260-4880-bd06-32246225aeae
網絡節(jié)點如果不支持 Linux namespace 的話,只能運行一個 Virtual Router
Neutron L3 Agent 負責路由(routing)、浮動 IP 分配(floatingip allocation), 地址轉換(SNAT/DNAT)和 Security Group 管理
Router 作為浮動 IP 地址的ARP Proxy
虛機的浮動 IP 其實不是真實網卡的 IP 地址,而是一個虛擬地址
路由(Routing)
一個 Virtual Router 連接幾個 subnet 就會有幾個 virtual interface
每個 interface 的地址是該 subnet 的 gateway 地址
虛機的 IP 棧在發(fā)現(xiàn)數據包的目的虛機的 IP 地址不在自己網段的話,會將其發(fā)到 Router 上對應其 subnet 的 Virtual Interface
然后,Virtual Router 根據配置的路由規(guī)則和目的IP地址,將包轉發(fā)到目的端口發(fā)出
源地址轉換 SNAT
用于從內部網絡發(fā)起的目的是外部網絡的連接
目的地址轉換 DNAT
要使外網內的機器能訪問虛機,需要設置虛機的浮動IP