云计算底层技术-虚拟网络设备(Bridge,VLAN)
openstack底層技術(shù)-各種虛擬網(wǎng)絡(luò)設(shè)備一(Bridge,VLAN)?
openstack底層技術(shù)-各種虛擬網(wǎng)絡(luò)設(shè)備二(tun/tap,veth)
- Linux Bridge
- Bridge與netfilter
- VLAN
- VLAN設(shè)備原理及配置
- VLAN在openstack中的應用
IBM網(wǎng)站上有一篇高質(zhì)量文章Linux 上的基礎(chǔ)網(wǎng)絡(luò)設(shè)備詳解。本文會參考文章部分內(nèi)容,本系列介紹OpenStack使用的這些網(wǎng)絡(luò)設(shè)備包括Bridge,VLAN,tun/tap, veth,vxlan/gre。本篇先介紹Bridge和VLAN相關(guān),其它在下一篇中介紹
OpenStack一般分為計算,存儲,網(wǎng)絡(luò)三部分。考慮構(gòu)建一個靈活的可擴展的云網(wǎng)絡(luò)環(huán)境,而物理網(wǎng)絡(luò)架構(gòu)一般是固定和難于擴展的,因此虛擬網(wǎng)絡(luò)將更有優(yōu)勢。Linux平臺上實現(xiàn)了各種不同功能的虛擬網(wǎng)絡(luò)設(shè)備,包括Bridge,Vlan,tun/tap,veth pair,vxlan/gre,...,這些虛擬設(shè)備就像一個個積木塊一樣,被OpenStack組合用于構(gòu)建虛擬網(wǎng)絡(luò)。 還有火熱的Docker,docker容器的隔離技術(shù)實現(xiàn)脫胎于Linux平臺上的namspace,以及更早的chroot。
文中會牽涉虛擬機,所以文中出現(xiàn)的”主機”一詞明確表示一臺物理機,”接口”指掛載到網(wǎng)橋上的網(wǎng)絡(luò)設(shè)備,環(huán)境如下:
CentOS Linux release 7.3.1611 (Core) Linux controller 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/LinuxOpenStack社區(qū)版 NewtonLinux Bridge
內(nèi)核模塊bridge
[root@controller ~]# modinfo bridge filename: /lib/modules/3.10.0-514.16.1.el7.x86_64/kernel/net/bridge/bridge.koBridge是Linux上工作在內(nèi)核協(xié)議棧二層的虛擬交換機,雖然是軟件實現(xiàn)的,但它與普通的二層物理交換機功能一樣。可以添加若干個網(wǎng)絡(luò)設(shè)備(em1,eth0,tap,..)到Bridge上(brctl addif)作為其接口,添加到Bridge上的設(shè)備被設(shè)置為只接受二層數(shù)據(jù)幀并且轉(zhuǎn)發(fā)所有收到的數(shù)據(jù)包到Bridge中(bridge內(nèi)核模塊),在Bridge中會進行一個類似物理交換機的查MAC端口映射表,轉(zhuǎn)發(fā),更新MAC端口映射表這樣的處理邏輯,從而數(shù)據(jù)包可以被轉(zhuǎn)發(fā)到另一個接口/丟棄/廣播/發(fā)往上層協(xié)議棧,由此Bridge實現(xiàn)了數(shù)據(jù)轉(zhuǎn)發(fā)的功能。如果使用tcpdump在Bridge接口上抓包,是可以抓到橋上所有接口進出的包
跟物理交換機不同的是,運行Bridge的是一個Linux主機,Linux主機本身也需要IP地址與其它設(shè)備通信。但被添加到Bridge上的網(wǎng)卡是不能配置IP地址的,他們工作在數(shù)據(jù)鏈路層,對路由系統(tǒng)不可見。不過Bridge本身可以設(shè)置IP地址,可以認為當使用brctl addbr br0新建一個br0網(wǎng)橋時,系統(tǒng)自動創(chuàng)建了一個同名的隱藏br0網(wǎng)絡(luò)設(shè)備。br0一旦設(shè)置IP地址,就意味著br0可以作為路由接口設(shè)備,參與IP層的路由選擇(可以使用route -n查看最后一列Iface)。因此只有當br0設(shè)置IP地址時,Bridge才有可能將數(shù)據(jù)包發(fā)往上層協(xié)議棧。
根據(jù)下圖來具體分析下Bridge工作過程
上圖主機有em1和em2兩塊網(wǎng)卡,有網(wǎng)橋br0。用戶空間進程有app1,app2等普通網(wǎng)絡(luò)應用,還有OpenVPN進程P1,以及一臺或多臺kvm虛擬機P2(kvm虛擬機實現(xiàn)為主機上的一個qemu-kvm進程,下文用qemu-kvm進程表示虛擬機)。此主機上使用到了多種虛擬網(wǎng)絡(luò)設(shè)備,在具體介紹某個虛擬網(wǎng)絡(luò)設(shè)備時,我們可以忽略其它網(wǎng)絡(luò)設(shè)備工作細節(jié),只專注于當前網(wǎng)絡(luò)設(shè)備。下面來具體分析網(wǎng)橋br0
Bridge處理數(shù)據(jù)包流程
圖中可以看到br0有N個tap類型接口(tap0,..,tapN),tap設(shè)備名稱可能不同,例如tap45400fa0-9c或vnet*,但都是tap設(shè)備。一個”隱藏”的br0接口(可設(shè)置IP),以及物理網(wǎng)卡em2的一個VLAN子設(shè)備em2.100(這里簡單看作有一個網(wǎng)卡橋接到br0上即可,VLAN下面會講),他們都工作在鏈路層(Link Layer)。
來看數(shù)據(jù)從外部網(wǎng)絡(luò)(A)發(fā)往虛擬機(P2)qemu-kvm這一過程,首先數(shù)據(jù)包從em2(B)物理網(wǎng)卡進入,之后em2將數(shù)據(jù)包轉(zhuǎn)發(fā)給其vlan子設(shè)備em2.100,經(jīng)過Bridge check(L)發(fā)現(xiàn)子設(shè)備em2.100屬于網(wǎng)橋接口設(shè)備,因此數(shù)據(jù)包不會發(fā)往協(xié)議棧上層(T),而是進入bridge代碼處理邏輯,從而數(shù)據(jù)包從em2.100接口(C)進入br0,經(jīng)過Bridging decision(D)發(fā)現(xiàn)數(shù)據(jù)包應當從tap0(E)接口發(fā)出,此時數(shù)據(jù)包離開主機網(wǎng)絡(luò)協(xié)議棧(G),發(fā)往被用戶空間進程qemu-kvm打開的字符設(shè)備/dev/net/tun(N),qemu-kvm進程執(zhí)行系統(tǒng)調(diào)用read(fd,...)從字符設(shè)備讀取數(shù)據(jù)。 這個過程中,外部網(wǎng)絡(luò)A發(fā)出的數(shù)據(jù)包是不會也沒必要進入主機上層協(xié)議棧的,因為A是與主機上的P2虛擬機通信,主機只是起到一個網(wǎng)橋轉(zhuǎn)發(fā)的作用
作為網(wǎng)橋的對比,如果是從網(wǎng)卡em1(M)進入主機的數(shù)據(jù)包,經(jīng)過Bridge check(L)后,發(fā)現(xiàn)em1非網(wǎng)橋接口,則數(shù)據(jù)包會直接發(fā)往(T)協(xié)議棧IP層,從而在Routing decision環(huán)節(jié)決定數(shù)據(jù)包的去向(A –> M –> T –> K)
Bridging decision
上圖中網(wǎng)橋br0收到數(shù)據(jù)包后,根據(jù)數(shù)據(jù)包目的MAC的不同,Bridging decision環(huán)節(jié)(D)對數(shù)據(jù)包的處理有以下幾種:
- 包目的MAC為Bridge本身MAC地址(當br0設(shè)置有IP地址),從MAC地址這一層來看,收到發(fā)往主機自身的數(shù)據(jù)包,交給上層協(xié)議棧(D –> J)
- 廣播包,轉(zhuǎn)發(fā)到Bridge上的所有接口(br0,tap0,tap1,tap…)
- 單播&&存在于MAC端口映射表,查表直接轉(zhuǎn)發(fā)到對應接口(比如 D –> E)
- 單播&&不存在于MAC端口映射表,泛洪到Bridge連接的所有接口(br0,tap0,tap1,tap…)
- 數(shù)據(jù)包目的地址接口不是網(wǎng)橋接口,橋不處理,交給上層協(xié)議棧(D –> J)
Bridge與netfilter
Linux防火墻是通過netfiler這個內(nèi)核框架實現(xiàn),netfiler用于管理網(wǎng)絡(luò)數(shù)據(jù)包。不僅具有網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)的功能,也具備數(shù)據(jù)包內(nèi)容修改、以及數(shù)據(jù)包過濾等防火墻功能。利用運作于用戶空間的應用軟件,如iptables/firewalld/ebtables等來控制netfilter。Netfilter在內(nèi)核協(xié)議棧中指定了五個處理數(shù)據(jù)包的鉤子(hook),分別是PRE_ROUTING、INPUT、OUTPUT、FORWARD與POST_ROUTING,通過iptables/firewalld/ebtables等用戶層工具向這些hook點注入一些數(shù)據(jù)包處理函數(shù),這樣當數(shù)據(jù)包經(jīng)過相應的hook時,處理函數(shù)就被調(diào)用,從而實現(xiàn)包過濾功能。這些用戶層工具中,iptables工作在IP層,只能過濾IP數(shù)據(jù)包;ebtables工作在數(shù)據(jù)鏈路層,只能過濾以太網(wǎng)幀(比如更改源或目的MAC地址)
當主機上沒有Bridge存在時,從網(wǎng)卡進入主機的數(shù)據(jù)包會依次穿過主機內(nèi)核協(xié)議棧,最后到達應用層交給某個應用程序處理。這樣我們可以很方便的使用iptables設(shè)置本主機的防火墻規(guī)則。進入數(shù)據(jù)包流向?qū)聢D路徑A --> L --> T --> ...
?
Bridge的出現(xiàn)使Linux上設(shè)置防火墻變得復雜,因為此時從物理網(wǎng)卡進入主機的數(shù)據(jù)包目的地可能是其上運行的一臺虛擬機。上圖是上面介紹的數(shù)據(jù)從外部網(wǎng)絡(luò)(A)發(fā)往虛擬機(P2)這一過程中數(shù)據(jù)包所經(jīng)過的防火墻鏈(文中的兩張圖可以對比來看)。物理網(wǎng)卡em2子設(shè)備em2.100從外部網(wǎng)絡(luò)A收到二層數(shù)據(jù)包,經(jīng)過bridge check后進入br0并穿越一系列防火墻鏈L --> D --> E,最終從Bridge上的另一個接口tap0發(fā)出。上圖紅色導向線可以很清楚看到整個過程中數(shù)據(jù)包是沒有進入主機內(nèi)核協(xié)議棧的,因此位于主機IP層(Network Layer)的iptables根本無法過濾L --> D --> E這一路徑的數(shù)據(jù)包。那有沒有辦法使iptables能夠過濾Bridge中的數(shù)據(jù)包呢?
-
ebtables只可以簡單過濾二層以太網(wǎng)幀,無法過濾ipv4數(shù)據(jù)包。
-
當然也可以在虛擬機內(nèi)使用iptables,但是一般不會這么玩,特別是在云平臺環(huán)境。 一個原因是如果一臺主機上運行有10臺虛擬機,那就需要分別登錄這10臺虛擬機設(shè)置其iptables規(guī)則,工作量會多很多。而且這么做意味著云平臺必須要能夠登錄用戶的虛擬機來設(shè)置iptables規(guī)則。 OpenStack中安全組也是iptables實現(xiàn),我們在虛擬機內(nèi)部并沒有發(fā)現(xiàn)有iptables規(guī)則存在。
-
解決辦法就是下文要講的bridge_netfilter
What is bridge-nf??
It is the infrastructure that enables {ip,ip6,arp}tables to see bridged IPv4, resp. IPv6, resp. ARP packets. Thanks to bridge-nf, you can use these tools to filter bridged packets, letting you make a transparant firewall. Note that bridge-nf is also referred to as bridge-netfilter and br-nf, the term bridge-nf should be preferred.
來自:Bridge-nf Frequently Asked Questions
為了解決上面提到的問題,Linux內(nèi)核引入了bridge_netfilter,簡稱bridge_nf。bridge_netfilter在鏈路層Bridge代碼中插入了幾個能夠被iptables調(diào)用的鉤子函數(shù),Bridge中數(shù)據(jù)包在經(jīng)過這些鉤子函數(shù)時,iptables規(guī)則被執(zhí)行(上圖中最下層Link Layer中的綠色方框即是iptables插入到鏈路層的chain,藍色方框為ebtables chain)。這就使得{ip,ip6,arp}tables能夠”看見”Bridge中的IPv4,ARP等數(shù)據(jù)包。這樣不管此數(shù)據(jù)包是發(fā)給主機本身,還是通過Bridge轉(zhuǎn)發(fā)給虛擬機,iptables都能完成過濾。
如何使用bridge_nf
從Linux 2.6.1內(nèi)核開始,可以通過設(shè)置內(nèi)核參數(shù)開啟bridge_netfilter機制。看名字就很容易知道具體作用
[root@controller ~]# sysctl -a |grep 'bridge-nf-' net.bridge.bridge-nf-call-arptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 ...然后在iptables中使用-m physdev引入相應模塊,以文中第一張圖上的虛擬機P2為例,它的虛擬網(wǎng)卡tap0橋接在br0上。我們在主機上設(shè)置如下iptables規(guī)則:丟棄從網(wǎng)橋br0的tap0接口進入的數(shù)據(jù)包。
#查看網(wǎng)橋 #brctl show bridge name bridge id STP enabled interfaces br0 8000.f8bc1212c3a0 no em1tap#操作對象是tap0 #ptables -t raw -A PREROUTING -m physdev --physdev-in tap0 -j DROP注意iptables?-m physdev操作對象是Bridge上的某個接口,因此規(guī)則的有效范圍是針對從此接口進出Bridge的數(shù)據(jù)包
還需要注意一點,這條命令是在主機上執(zhí)行的,從主機角度看,主機收到從tap0接口進入的數(shù)據(jù)包,因此使用--physdev-in。但是從虛擬機P2角度來看,它發(fā)出了數(shù)據(jù)包,發(fā)給主機上的網(wǎng)橋br0。因此上面這條iptables命令實際的作用是丟棄虛擬機P2發(fā)出的數(shù)據(jù)包,也就是禁止虛擬機P2訪問外網(wǎng)。方向要分清,后面講到/tun/tap設(shè)備時會細說
上面介紹了使用iptables過濾Bridge中數(shù)據(jù)包的方法,實際中如果直接使用iptables命令顯然太繁瑣,而且如果主機上有多臺虛擬機的話,網(wǎng)橋接口就會變多導致容易出錯,需要依靠工具去做這些。
使用libvirt提供的virsh工具
libvirt的virsh nwfilter-*系列命令提供了設(shè)置虛擬機防火墻的功能,它其實是封裝了iptables過濾Bridge中數(shù)據(jù)包的命令(-m physdev)。它使用多個xml文件,每個xml文件中都可以定義一系列防火墻規(guī)則,然后把某個xml文件應用到某虛擬機的某張網(wǎng)卡(Bridge中的接口),這樣就完成了對此虛擬機的這張網(wǎng)卡的防火墻設(shè)置。當然可以把一個定義好防火墻規(guī)則的xml文件應用到多臺虛擬機。
#查看用于設(shè)置 # virsh --help |grep nwfilternwfilter-define define or update a network filter from an XML filenwfilter-dumpxml network filter information in XMLnwfilter-edit edit XML configuration for a network filternwfilter-list list network filtersnwfilter-undefine undefine a network filter# 定義有防火墻規(guī)則的xml文件 # virsh nwfilter-dumpxml centos6.3_filter <filter name='centos6.3_filter' chain='root'><uuid>b1fdd87c-a44c-48fb-9a9d-e30f1466b720</uuid><rule action='accept' direction='in' priority='400'><tcp dstportstart='8000' dstportend='8002'/></rule><rule action='accept' direction='in' priority='400'><tcp srcipaddr='172.16.1.0' srcipmask='24'/></rule> </filter>#查看定義的防火墻xml文件 # virsh nwfilter-listUUID Name ------------------------------------------------------------------69754f43-0325-453f-bd53-4a6e3ab5d456 centos6.3_filter#在虛擬機xml文件中應用centos6.3_filter<interface type='bridge'><mac address='f8:c9:79:ce:60:01'/><source bridge='br0'/><model type='virtio'/><filterref filter='centos6.3_filter'/><address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/></interface>openstack中的安全組
像openstack等很多云平臺在web控制臺中都會提供有設(shè)置虛擬機防火墻功能(安全組),可以很方便的添加應用防火墻規(guī)則到云主機
在OpenStack部署中,若使用Bridge實現(xiàn)虛擬網(wǎng)絡(luò),其安全組功能就是依靠bridge_nf實現(xiàn),計算節(jié)點上iptables才能”看見”并過濾發(fā)往其上instance的數(shù)據(jù)包,如下是OpenStack計算節(jié)點上部分iptables規(guī)則,當啟用安全組時,OpenStack會自動設(shè)置net.bridge.bridge-nf-call-iptables = 1等內(nèi)核參數(shù),不用再明確設(shè)置。?tap10f15e45-aa為該計算節(jié)點上某instance網(wǎng)卡(tap設(shè)備)
... #針對虛擬網(wǎng)卡tap10f15e45-aa的部分規(guī)則 -A neutron-filter-top -j neutron-linuxbri-local -A neutron-linuxbri-FORWARD -m physdev --physdev-out tap10f15e45-aa --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain -A neutron-linuxbri-FORWARD -m physdev --physdev-in tap10f15e45-aa --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain ...Bridge+netfilter內(nèi)容很多,下次有時間會專門用一篇文章介紹OpenStack中的安全組實現(xiàn),關(guān)鍵字?iptables+bridge+netfilter+conntrack
Linux上還有一款虛擬交換機OVS,主要區(qū)別是OVS支持vlan tag以及流表(例如openflow)等一些高級特性,Bridge只是單純二層交換機也不支持vlan tag,OVS具體介紹參考這里openstack底層技術(shù)-使用openvswitch
VLAN
上面簡單介紹過Bridge和OVS區(qū)別,要在Linux上實現(xiàn)一個帶VLAN功能的虛擬交換機,OVS可以通過給不同port打不同tag實現(xiàn)vlan功能,而Bridge需要結(jié)合VLAN設(shè)備才能實現(xiàn)。
這部分先介紹VLAN設(shè)備原理及配置,然后介紹VLAN在openstack中的應用
VLAN設(shè)備原理及配置
VLAN又稱虛擬網(wǎng)絡(luò),其基本原理是在二層協(xié)議里插入額外的VLAN協(xié)議數(shù)據(jù)(稱為 802.1.q VLAN Tag),同時保持和傳統(tǒng)二層設(shè)備的兼容性。Linux里的VLAN設(shè)備是對 802.1.q 協(xié)議的一種內(nèi)部軟件實現(xiàn),模擬現(xiàn)實世界中的 802.1.q 交換機。詳細介紹參考文章開頭給出的IBM文章中”VLAN device for 802.1.q”部分,這里不再重復
下面使用VLAN結(jié)合Bridge實現(xiàn)文中第一張圖上的多個VLAN子設(shè)備VLAN 100, VLAN X, VLAN Y, ...以及多個網(wǎng)橋br0, brX, brY, ...(X Y都是小于2048的正整數(shù))。前提是此主機上有一塊網(wǎng)卡設(shè)備比如em2,不管em2為物理網(wǎng)卡或虛擬網(wǎng)卡,em2所連接的交換機端口必須設(shè)置為trunk。
添加VLAN子設(shè)備VLAN 100, VLAN X, VLAN Y, ...
#cat /etc/sysconfig/network-scripts/ifcfg-em2 TYPE=Ethernet BOOTPROTO=none IPV4_FAILURE_FATAL=no NAME=em2 UUID=4f2cfd28-ba78-4f25-afa1-xxxxxxxxxxxxx DEVICE=em2 ONBOOT=yes#添加vlan子設(shè)備em2.100 #cat /etc/sysconfig/network-scripts/ifcfg-em2.100 DEVICE=em2.100 BOOTPROTO=static ONBOOT=yes VLAN=yes#可以繼續(xù)添加多個帶不同vlan tag的子設(shè)備,比如VLAN X, VLAN Y, VLAN ... #vlan子設(shè)備em2.X #cat /etc/sysconfig/network-scripts/ifcfg-em2.X #DEVICE=em2.X #BOOTPROTO=static #ONBOOT=yes #VLAN=yes#vlan子設(shè)備em2.Y #cat /etc/sysconfig/network-scripts/ifcfg-em2.Y #DEVICE=em2.Y #BOOTPROTO=static #ONBOOT=yes #VLAN=yes#...#重啟網(wǎng)絡(luò) service network restart查看子設(shè)備em2.100,可以看到,其driver為VALN
#ethtool -i eth1.101 driver: 802.1Q VLAN Support version: 1.8 ...添加網(wǎng)橋br0, brX, brY, ...
#添加br0網(wǎng)橋 brctl addbr br0 #br0添加em2.100子設(shè)備 凡是橋接到br0上的數(shù)據(jù)包都會帶上tag 100 brctl addif br0 em2.100#可以繼續(xù)添加多個網(wǎng)橋brX, brY, ... #brctl addbr brX #凡是橋接到brX上的數(shù)據(jù)包都會帶上tag X #brctl addif brX em2.X#brctl addbr brY #brctl addif brY em2.Y#...#brctl show bridge name bridge id STP enabled interfaces br0 8000.525400315e23 no em2.100 tap0VLAN設(shè)備的作用是建立一個個帶不同vlan tag的子設(shè)備,它并不能建立多個可以交換轉(zhuǎn)發(fā)數(shù)據(jù)的接口,因此需要借助于Bridge,把VLAN建立的子設(shè)備例如em2.100橋接到網(wǎng)橋例如br0上,這樣凡是橋接到br0上的設(shè)備就自動加入了vlan 100子網(wǎng)。對比一臺帶有兩個vlan 100,X的物理交換機,這里br0網(wǎng)橋上所連接的接口相當于物理交換機上那些劃分到vlan 100的端口,而brX所連接的接口相當于物理交換機上那些劃分到vlan X的端口。因此Bridge加VLAN能在功能層面完整模擬現(xiàn)實世界里的802.1.q交換機。
參考文中第一張圖,我們從網(wǎng)橋br0上tap0接口(E)角度,來看下具體的數(shù)據(jù)收發(fā)流程:
- 數(shù)據(jù)從tap0接口進入,發(fā)往外部網(wǎng)絡(luò)A
tap0收到的數(shù)據(jù)被發(fā)送給br0(E) --> D --> br0把數(shù)據(jù)從em2.100接口發(fā)出(C) --> 母設(shè)備em2收到em2.100發(fā)來的數(shù)據(jù)(B) --> 母設(shè)備em2給數(shù)據(jù)打上100的vlan tag(因為來自em2.100) --> em2將帶有100 tag的數(shù)據(jù)發(fā)出到外部網(wǎng)絡(luò)(A) --> em2所連接的交換機收到數(shù)據(jù)(trunk口)
- 數(shù)據(jù)從em2網(wǎng)卡進入,發(fā)往tap0
em2從所連接的交換機收到tag 100的數(shù)據(jù) --> em2發(fā)現(xiàn)此數(shù)據(jù)帶有tag 100,移除數(shù)據(jù)包中tag --> 不帶tag的數(shù)據(jù)發(fā)給em2.100子設(shè)備 --> br0收到從em2.100進入的數(shù)據(jù)包 --> D --> br0轉(zhuǎn)發(fā)數(shù)據(jù)到tap0
上面忽略了對于數(shù)據(jù)包是否帶tag,以及數(shù)據(jù)包所帶tag的子設(shè)備是否存在的檢查。這些屬于vlan基礎(chǔ)知識
VLAN在openstack中的應用
openstack中虛擬機網(wǎng)絡(luò)使用VLAN模式的話,就會用到VLAN設(shè)備。openstack中配置vlan+bridge模式如下
#neutron-server節(jié)點(網(wǎng)絡(luò)節(jié)點)配置 #cat /etc/neutron/plugins/ml2/ml2_conf.ini [ml2] #neutron-server啟動時,加載flat,vlan兩種網(wǎng)絡(luò)類型驅(qū)動 type_drivers = flat,vlan #vlan模式不需要tenant_network,留空 tenant_network_types = #neutron-server啟動時加載linuxbridge和openvswitch網(wǎng)橋驅(qū)動 mechanism_drivers = linuxbridge,openvswitch[ml2_type_flat] #在命令行或控制臺新建flat類型網(wǎng)絡(luò)時需要指定的名稱,此名稱會配置映射到計算節(jié)點上某塊網(wǎng)卡,下面會設(shè)置 flat_networks = proext[ml2_type_vlan] #在命令行或控制臺新建vlan類型網(wǎng)絡(luò)時需要指定的名稱,此名稱會配置映射到計算節(jié)點上某塊網(wǎng)卡,下面會設(shè)置 network_vlan_ranges = provlan#重啟neutron-server服務 #使用Bridge+vlan網(wǎng)絡(luò)模式的nova-compute節(jié)點(計算節(jié)點)配置 #cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini [linux_bridge] #provlan名稱映射到此計算節(jié)點eth2網(wǎng)卡,因為使用vlan模式,eth2需要設(shè)置為trunk #proext名稱映射到此計算節(jié)點eth3網(wǎng)卡,我這個環(huán)境下eth3網(wǎng)卡為虛擬機連接外網(wǎng)接口 physical_interface_mappings = provlan:eth2,proext:eth3#重啟此計算節(jié)點nova-compute服務 #配置中只需要指定vlan要用的母設(shè)備eth2,后續(xù)控制臺新建帶tag的網(wǎng)絡(luò)時,neutron會自動建立eth2.{TAG}子設(shè)備并加入到網(wǎng)橋在控制臺新建一個vlan tag為1023的Provider network: subvlan-1023,使用此subvlan-1023網(wǎng)絡(luò)新建幾臺虛擬機,看下計算節(jié)點上網(wǎng)橋配置
[root@compute03 neutron]# brctl show bridge name bridge id STP enabled interfaces brq82405415-7a 8000.52540048b1a9 no eth2.1023tap10f15e45-aatapa659a214-b1 brqf5808b72-44 8000.5254001ac83d no eth3tapd3388a60-ae[root@compute03 neutron]# virsh domiflist instance-00000145 Interface Type Source Model MAC ------------------------------------------------------- tapa659a214-b1 bridge brq82405415-7a virtio fa:16:3e:bc:c9:e0虛擬機instance-00000145的網(wǎng)卡tapa659a214-b1橋接到brq82405415-7a。跟上面介紹的類似,橋接到brq82405415-7a上的接口設(shè)備就自動加入了vlan 1023子網(wǎng),因此從instance-00000145發(fā)出的數(shù)據(jù)包會帶有tag 1023(eth2.1023的母設(shè)備eth2負責添加或移除tag)
假如在控制臺或命令行再新建一個tag為1024的子網(wǎng),則網(wǎng)橋配置如下
[root@compute03 neutron]# brctl show bridge name bridge id STP enabled interfaces brq82405415-7a 8000.52540048b1a9 no eth2.1023tap10f15e45-aatapa659a214-b1 brq7d59440b-cc 8000.525400aabbcc no eth2.1024tap20ffafb2-1b brqf5808b72-44 8000.5254001ac83d no eth3tapd3388a60-ae[root@compute03 neutron]# virsh domiflist instance-00000147 Interface Type Source Model MAC ------------------------------------------------------- tap20ffafb2-1b bridge brq7d59440b-cc virtio fa:16:3e:bd:12:40虛擬機instance-00000147的網(wǎng)卡tap20ffafb2-1b橋接到brq7d59440b-cc,instance-00000147屬于vlan 1024子網(wǎng),這就實現(xiàn)了屬于不同vlan子網(wǎng)的instance-00000145與instance-00000147的隔離性。他們雖然在同一臺計算節(jié)點上,但彼此不互通,除非設(shè)置為兩個VLAN可以互通
感謝Bridge和VLAN設(shè)備,他們讓openstack配置vlan網(wǎng)絡(luò)成了可能,BUT!, Bridge+VLAN不是唯一的選擇,openstack也支持OVS,OVS中是靠給不同instance接口打不同tag來實現(xiàn)instance的多vlan環(huán)境,OVS模式除了配置部分跟Bridge+VLAN不同之外,使用上并沒有什么區(qū)別,這里的設(shè)置mechanism_drivers = linuxbridge,openvswitch加載相應驅(qū)動,屏蔽掉了底層操作的差別
與Bridge中provlan,proext映射到計算節(jié)點網(wǎng)卡的配置不同,OVS配置文件中映射關(guān)系為vlan類型網(wǎng)絡(luò)provlan映射到網(wǎng)橋br-vlan,flat類型網(wǎng)絡(luò)proext映射到網(wǎng)橋br-ext。至于br-vlan橋接eth2網(wǎng)卡,br-ext橋接eth3網(wǎng)卡則需要預先手動配置好,來看一個使用OVS的計算節(jié)點網(wǎng)橋
[root@compute01 neutron]# ovs-vsctl show dd7ccaae-6a24-4d28-8577-9e5e6b5dfbd3Manager "ptcp:6640:127.0.0.1"is_connected: trueBridge br-extController "tcp:127.0.0.1:6633"is_connected: truefail_mode: securePort phy-br-extInterface phy-br-exttype: patchoptions: {peer=int-br-ext}Port br-extInterface br-exttype: internalPort "eth3"Interface "eth3"Bridge br-vlanController "tcp:127.0.0.1:6633"is_connected: truefail_mode: securePort br-vlanInterface br-vlantype: internalPort phy-br-vlanInterface phy-br-vlantype: patchoptions: {peer=int-br-vlan}Port "eth2"Interface "eth2"Bridge br-intController "tcp:127.0.0.1:6633"is_connected: truefail_mode: securePort int-br-extInterface int-br-exttype: patchoptions: {peer=phy-br-ext}Port br-intInterface br-inttype: internalPort int-br-vlanInterface int-br-vlantype: patchoptions: {peer=phy-br-vlan}Port "qvo7d59440b-cc"tag: 1Interface "qvo7d59440b-cc"ovs_version: "2.5.0" [root@compute01 neutron]# brctl show bridge name bridge id STP enabled interfaces qbr7d59440b-cc 8000.26d03016fcf6 no qvb7d59440b-cctap7d59440b-cc#查看虛擬機網(wǎng)卡 [root@compute01 neutron]# virsh domiflist instance-00000149 Interface Type Source Model MAC ------------------------------------------------------- tap7d59440b-cc bridge qbr7d59440b-cc virtio fa:16:3e:12:ba:e6instance-00000149出數(shù)據(jù)流向為tap7d59440b-cc --> qbr7d59440b-cc --> qvo7d59440b-cc(tag 1) --> br-int --> br-vlan --> eth2。qvb7d59440b-cc 與 qvo7d59440b-cc 為一對veth設(shè)備
這其中牽涉OVS流表和OVS內(nèi)外部tag轉(zhuǎn)換問題,又足夠?qū)懸黄恼聛斫榻B了,本文暫不繼續(xù)介紹。還有一點,在使用OVS做網(wǎng)橋的同時又開啟安全組功能時,會多出一個Bridge網(wǎng)橋用于設(shè)置安全組,如上面的qbr7d59440b-cc, 因為目前iptables不支持OVS,只能在虛擬機與OVS網(wǎng)橋之間加進一個Bridge網(wǎng)橋用于設(shè)置iptables規(guī)則
其它網(wǎng)絡(luò)設(shè)備會在另一篇文章介紹,本文完
總結(jié)
以上是生活随笔為你收集整理的云计算底层技术-虚拟网络设备(Bridge,VLAN)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暴雪团队:《暗黑破坏神4》是给玩家的一封
- 下一篇: applyBinding Observ