導(dǎo)讀
- 物理拓撲圖
- 邏輯拓撲圖
- 部署方案
- OpenStack的約束
物理拓撲圖
- 兩個計算節(jié)點,一個網(wǎng)絡(luò)節(jié)點的OpenStack集群
- 物理交換機、IPS、防火墻、路由器等

物理拓撲圖
邏輯拓撲圖
- 兩個租戶網(wǎng)絡(luò)的邏輯拓撲,通過vNF實現(xiàn)租戶隔離

邏輯拓撲圖
部署方案
- 準備OpenStack虛擬化版本的vNF鏡像
- 為每個租戶啟動一個vNF,并且為vNF綁定兩塊位于不同子網(wǎng)的網(wǎng)卡。其中,下行網(wǎng)卡與對應(yīng)租戶的VM處于一個子網(wǎng),上行網(wǎng)卡所處的子網(wǎng)用于與OpenStack vRouter傳輸數(shù)據(jù)
注 經(jīng)測試,在OpenStack GUI啟動VM時,不能指定網(wǎng)卡處于同一個租戶網(wǎng)絡(luò)內(nèi)哪個子網(wǎng)。這個功能可能需要在OpenStack后臺操作,命令如下:
# 創(chuàng)建一個租戶網(wǎng)絡(luò)net1中子網(wǎng)subnet1的port,且指定IP地址為172.16.0.1,port名字為port1
# 根據(jù)具體OpenStack網(wǎng)絡(luò)拓撲替換下面命令中的net1, subnet1, ip-address
openstack port create --network net1 --fixed-ip subnet=subnet1,ip-address=172.16.0.1 port1
- 配置租戶所有的VM的默認路由為vNF的下行網(wǎng)口的IP,配置vNF的默認路由為上行網(wǎng)口對應(yīng)的vRouter內(nèi)部的IP
- vRouter配置靜態(tài)路由或策略路由:
- 東西向流量,策略路由,下一跳為另一個租戶vNF的上行網(wǎng)卡的IP
- 南北向流量,默認路由
OpenStack的約束
- OpenStack Neutron的安全組默認會對每個網(wǎng)口開啟MAC/IP過濾功能(防arp欺騙),不是該網(wǎng)口的MAC/IP發(fā)出的包會被宿主機丟棄。這種限制會導(dǎo)致vNF的上行網(wǎng)口轉(zhuǎn)發(fā)的數(shù)據(jù)包被丟棄,無法到達vRouter。關(guān)閉安全組有兩種方法
- 第一種是整體關(guān)閉
# /etc/neutron/plugins/ml2/openvswitch_agent.ini
firewall_driver=None
整體關(guān)閉的弊端是所有的端口不在受安全組保護,私有云尚且可以,公有云會帶來安全隱患
- 局部關(guān)閉
OpenStack Neutron的MAC/IP過濾是利用宿主機的iptables實現(xiàn)的,因此可以通過修改iptables配置來達到局部關(guān)閉的效果,具體步驟如下:- 為每個租戶創(chuàng)建完畢vNF后,從后臺進入宿主機,找到對應(yīng)網(wǎng)口的tap設(shè)備,記下tap后面的id,例如
sc5695d00-9。 -
iptables --line-numbers -nvL | grep ${id}查看對應(yīng)的條目 - 利用
iptables -D ...刪除掉對應(yīng)條目
- 為每個租戶創(chuàng)建完畢vNF后,從后臺進入宿主機,找到對應(yīng)網(wǎng)口的tap設(shè)備,記下tap后面的id,例如
注 另一種比較優(yōu)雅的局部關(guān)閉方法是使用OpenStack Cli,可以關(guān)閉指定的port的安全組:
opnestack port set --no-security-group <port>
openstack port set --disable-port-security <port>
也可以為port添加允許通過的MAC/IP
openstack port set --allowed-address ip=address=<ip-address>, mac-address=<mac-address> <port>
- OpenStack vRouter是利用Linux內(nèi)核轉(zhuǎn)發(fā)和路由表實現(xiàn)的,因此受到Linux反向路由過濾的限制。所謂的反向路由過濾,就是指網(wǎng)卡處理數(shù)據(jù)包之前,Linux會檢驗反向數(shù)據(jù)包的下一跳是否是從該網(wǎng)卡發(fā)出。如果不是,則丟棄。
回到邏輯拓撲圖可知,租戶網(wǎng)絡(luò)之間的東西向流量的反向路由方向并不是與vNF同網(wǎng)段的網(wǎng)口,因此在開啟反向路由過濾的情況下,數(shù)據(jù)包轉(zhuǎn)發(fā)會失敗。
關(guān)閉方法:
# 在網(wǎng)絡(luò)節(jié)點,查看vRouter namespace的名稱
$ ip netns
qdhcp-*
...
qrouter-*
...
$ ip netns exec qrouter-* sysctl -w net.ipv4.conf.all.rp_filter=0
$ ip netns exec qrouter-* sysctl -w net.ipv4.conf.default.rp_filter=0