Linux網(wǎng)橋是網(wǎng)橋的軟件實(shí)現(xiàn),這是Linux內(nèi)核的內(nèi)核部分。與硬件網(wǎng)橋相類似,Linux網(wǎng)橋維護(hù)了一個(gè)2層轉(zhuǎn)發(fā)表(也稱為MAC學(xué)習(xí)表,轉(zhuǎn)發(fā)數(shù)據(jù)庫,或者僅僅稱為FDB),它跟蹤記錄了MAC地址與端口的對(duì)應(yīng)關(guān)系。當(dāng)一個(gè)網(wǎng)橋在端口N收到一個(gè)包時(shí)(源MAC地址為X),它在FDB中記錄為MAC地址X可以從端口N到達(dá)。這樣的話,以后當(dāng)網(wǎng)橋需要轉(zhuǎn)發(fā)一個(gè)包到地址X時(shí),它就可以從FDB查詢知道轉(zhuǎn)發(fā)到哪里。構(gòu)建一個(gè)FDB常常稱之為“MAC學(xué)習(xí)”或僅僅稱為“學(xué)習(xí)”過程。
成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司是一家服務(wù)多年做網(wǎng)站建設(shè)策劃設(shè)計(jì)制作的公司,為廣大用戶提供了網(wǎng)站制作、網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),一元廣告,成都做網(wǎng)站選成都創(chuàng)新互聯(lián),貼合企業(yè)需求,高性價(jià)比,滿足客戶不同層次的需求一站式服務(wù)歡迎致電。
你可以使用以下命令來檢查Linux網(wǎng)橋當(dāng)前轉(zhuǎn)發(fā)表或MAC學(xué)習(xí)表。
1.$ sudo brctl showmacs bridge-name
該命令將顯示一個(gè)學(xué)習(xí)到的MAC地址與關(guān)聯(lián)端口的列表。各個(gè)條目都有一個(gè)相關(guān)的附于其上的老化計(jì)時(shí)器,因此轉(zhuǎn)發(fā)條目可以在一定時(shí)間后刷新,以使MAC學(xué)習(xí)表更新到最新。
有五臺(tái)主機(jī)。其中一臺(tái)主機(jī)裝有l(wèi)inux ,安裝了網(wǎng)橋模塊,而且有四塊物理網(wǎng)卡,分別連接同一網(wǎng)段的其他主機(jī)。我們希望其成為一個(gè)網(wǎng)橋,為其他四臺(tái)主機(jī)(IP分別為192.168.1.2 ,192.168.1.3,192.168.1.4,192.168.1.5) 之間轉(zhuǎn)發(fā)數(shù)據(jù)包。同時(shí),為了方便管理,希望網(wǎng)橋能夠有一個(gè)IP(192.168.1.1),那樣管理員就可以在192.168.1.0/24網(wǎng)段內(nèi)的主機(jī)上telnet到網(wǎng)橋,對(duì)其進(jìn)行配置,實(shí)現(xiàn)遠(yuǎn)程管理。
前一節(jié)中提到,網(wǎng)橋在同一個(gè)邏輯網(wǎng)段轉(zhuǎn)發(fā)數(shù)據(jù)包。針對(duì)上面的拓?fù)?,這個(gè)邏輯網(wǎng)段就是192.168.1.0/24網(wǎng)段。我們?yōu)檫@個(gè)邏輯網(wǎng)段一個(gè)名稱,br0。首先需要配置這樣一個(gè)邏輯網(wǎng)段。# brctl addbr br0 (建立一個(gè)邏輯網(wǎng)段,名稱為br0) 實(shí)際上,我們可以把邏輯網(wǎng)段192.168.1.0/24看作使一個(gè)VLAN ,而br0則是這個(gè)VLAN的名稱。建立一個(gè)邏輯網(wǎng)段之后,我們還需要為這個(gè)網(wǎng)段分配特定的端口。在Linux中,一個(gè)端口實(shí)際上就是一個(gè)物理網(wǎng)卡。而每個(gè)物理網(wǎng)卡的名稱則分別為eth0,eth1,eth2,eth3。我們需要把每個(gè)網(wǎng)卡一一和br0這個(gè)網(wǎng)段聯(lián)系起來,作為br0中的一個(gè)端口。# brctl addif br0 eth0 (讓eth0成為br0的一個(gè)端口)# brctl addif br0 eth1 (讓eth1成為br0的一個(gè)端口)# brctl addif br0 eth0 (讓eth2成為br0的一個(gè)端口)# brctl addif br0 eth3 (讓eth3成為br0的一個(gè)端口) 網(wǎng)橋的每個(gè)物理網(wǎng)卡作為一個(gè)端口,運(yùn)行于混雜模式,而且是在鏈路層工作,所以就不需要IP了。# ifconfig eth0 0.0.0.0# ifconfig eth1 0.0.0.0# ifconfig eth2 0.0.0.0# ifconfig eth3 0.0.0.0 然后給br0的虛擬網(wǎng)卡配置IP:192.168.1.1。那樣就能遠(yuǎn)程管理網(wǎng)橋。# ifconfig br0 192.168.1.1 給br0配置了IP之后,網(wǎng)橋就能夠工作了。192.168.1.0/24網(wǎng)段內(nèi)的主機(jī)都可以telnet到網(wǎng)橋上對(duì)其進(jìn)行配置。以上配置的是一個(gè)邏輯網(wǎng)段,實(shí)際上Linux網(wǎng)橋也能配置成多個(gè)邏輯網(wǎng)段(相當(dāng)于交換機(jī)中劃分多個(gè)VLAN)。
Neutron 默認(rèn)使用 ML2 作為 core plugin,配置文件 /etc/neutron/neutron.conf 中 core_plugin
計(jì)算節(jié)點(diǎn)和控制節(jié)點(diǎn)都需要在各自的 neutron.conf 中配置 core_plugin
然后配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中 mechanism_drivers
mechanism_drivers 可以同時(shí)指定多個(gè)。這里只指定了一個(gè)。
查看 linuxbridge 進(jìn)程
控制節(jié)點(diǎn):
計(jì)算節(jié)點(diǎn):
在 Linux Bridge 環(huán)境中,一個(gè)數(shù)據(jù)包從 Instance 發(fā)送到物理網(wǎng)卡會(huì)經(jīng)過下面幾個(gè)類型的設(shè)備:
對(duì)于每個(gè) local network,ML2 linux-bridge 會(huì)創(chuàng)建一個(gè) bridge,Instance 的 tap 設(shè)備會(huì)連接到 bridge。位于同一個(gè) local network 的 Instance 會(huì)連接到相同的 bridge,這樣 Instance 之間就可以通訊了。
因?yàn)?local network 沒有與物理網(wǎng)卡相連,所以 Instance 無法與宿主機(jī)之外的網(wǎng)絡(luò)通信。
同時(shí)因?yàn)槊總€(gè) local network 有自己的 bridge,bridge 之間是沒有連通的,所以兩個(gè) local network 之間是不通的。
ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini
type_drivers ML2 加載網(wǎng)絡(luò)類型。
tenant_network_types 普通用戶在自己的 Tenant(Project)中創(chuàng)建網(wǎng)絡(luò)時(shí),默認(rèn)創(chuàng)建哪種 type 的網(wǎng)絡(luò)。
tenant_network_types = vlan, local 意思是當(dāng)沒有 vlan 可創(chuàng)建時(shí),使用 local。
檢測(cè) Neutron Agent 是否正常 管理員 -- 系統(tǒng) -- 系統(tǒng)信息 -- 網(wǎng)絡(luò)代理
從用戶管理創(chuàng)建網(wǎng)絡(luò)
創(chuàng)建網(wǎng)絡(luò) 項(xiàng)目 -- 網(wǎng)絡(luò) -- 網(wǎng)絡(luò)
填寫網(wǎng)絡(luò)名稱
填寫子網(wǎng)信息。 網(wǎng)關(guān) IP 可以不用填寫。默認(rèn)為子網(wǎng)地址的第一個(gè) IP。即:172.16.10.1
添加子網(wǎng) IP 范圍。
點(diǎn)擊網(wǎng)絡(luò)名稱,進(jìn)去相信信息,可以看到子網(wǎng)和端口信息等。
可以看到在端口中已經(jīng)創(chuàng)建了一個(gè) port,名為 “(c45b69e6-04ba)”,IP 為 172.16.10.2。連接設(shè)備為 "network:dhcp"。
打開控制節(jié)點(diǎn)終端,使用 brctl show 查看 linux bridge 的狀態(tài)。
可以看到 bridge 設(shè)備 brqd2fd4378-9e 和 tap 設(shè)備 tapc45b69e6-04
創(chuàng)建 Instance 并選擇剛剛創(chuàng)建的網(wǎng)絡(luò)。
創(chuàng)建 Instance 成功后可以發(fā)現(xiàn)已經(jīng)分配 IP 地址。
在底層中 Neutron 會(huì)在 subnet 中創(chuàng)建一個(gè) port,分配 IP 和 MAC 地址,并將 port 分配給 test。如下圖
點(diǎn)進(jìn)去可以看到詳情
在宿主機(jī)上執(zhí)行 brctl show 可以查看 bridge 的配置。
可以看到 bridge brqd2fd4378-9e 上連接了一個(gè)新的 tap 設(shè)備。
查看 Instance 信息。使用 virsh list 查看 Instance 運(yùn)行中的列表。
使用 virsh edit 1 查看配置信息。
配置信息省略很多。重要的放在上面。
mac address='fa:16:3e:19:e1:57'/ 是 Instance 網(wǎng)卡的 MAC 地址
target dev='tapb337d11f-54'/ 是 Instance 虛擬網(wǎng)卡信息
ping test1 的 IP 地址發(fā)現(xiàn)是可以 ping 通。
查看 brctl show
發(fā)現(xiàn) brqd2fd4378-9e 中又計(jì)入進(jìn)來一個(gè) VIF,因?yàn)閮蓚€(gè) VIF 掛載在同一個(gè) Linux Bridge 上,所以可以通訊。
結(jié)構(gòu)如下:
如果新分的 Instance 在計(jì)算節(jié)點(diǎn)中。不在控制節(jié)點(diǎn)。他們之間將不在互通。
因?yàn)?DHCP agent 在控制節(jié)點(diǎn)上運(yùn)行,test2 在計(jì)算節(jié)點(diǎn)的 local 網(wǎng)絡(luò)上,兩者位于不同物理節(jié)點(diǎn)。由于 local 網(wǎng)絡(luò)的流量只能局限在本節(jié)點(diǎn)之內(nèi),發(fā)送的請(qǐng)求無法到達(dá)計(jì)算節(jié)點(diǎn)。
上圖 物理網(wǎng)卡 eth1 橋接到 brqXXXX,為 Instance 提供 flat 網(wǎng)絡(luò)。
下圖 創(chuàng)建多個(gè) flat Network,就要準(zhǔn)備多個(gè)物理機(jī)網(wǎng)卡。
在 /etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 參數(shù)為 flat
:這里是指定普通用戶使用 flat。因?yàn)?flat 網(wǎng)絡(luò)與物理網(wǎng)卡一一對(duì)應(yīng)。一般情況下租戶網(wǎng)絡(luò)不采用 flat。
flat_networks 定義一個(gè) flat 網(wǎng)絡(luò),label 為 “default”
通過 physical_interface_mappings 指名 default 對(duì)應(yīng)的物理網(wǎng)卡為 ens35
例如:對(duì)于 label 為 “default” 的 flat network,節(jié)點(diǎn) A 可能使用 ens35,配置為:
而 B 節(jié)點(diǎn)則可以使用 ens33,配置為:
創(chuàng)建 flat 網(wǎng)絡(luò)
綁定子網(wǎng)
查看 控制節(jié)點(diǎn)網(wǎng)絡(luò)狀態(tài)
Neutron 自動(dòng)新建了 flat_net 對(duì)應(yīng)的網(wǎng)橋 brq9e3013c8-93,以及 dhcp 的 tap 設(shè)備 tap50802894-1a。
此時(shí) tap50802894-1a 和物理網(wǎng)卡 ens35 都已經(jīng)連接到網(wǎng)橋 brq9e3013c8-93 上。
可以看到 Instance 的 tap 設(shè)備 tapc1241c3f-cb 已經(jīng)連接到網(wǎng)橋
配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driver 和 interface_driver
dnsmasq 是一個(gè)提供 DHCP 和 DNS 服務(wù)的開源軟件。
在實(shí)現(xiàn)環(huán)境中使用 ps 命令可以查看到 dnsmasq 進(jìn)程。
DHCP agent 會(huì)為每個(gè) network 創(chuàng)建一個(gè)目錄 /opt/stack/data/neutron/dhcp/xxxx 用于存放該 network 的 dnsmasq 配置文件。
在二層網(wǎng)絡(luò)上,VLAN 可以將一個(gè)交換機(jī)分割成幾個(gè)獨(dú)立的虛擬交換機(jī)。
類似,在三層網(wǎng)絡(luò)上,Linux Network Namespace 可以將一個(gè)物理三層網(wǎng)絡(luò)分割成幾個(gè)獨(dú)立的虛擬三層網(wǎng)絡(luò)。
每個(gè) namespace 都有自己獨(dú)立的網(wǎng)絡(luò)棧,包括 route table,firewall rule,network interface device等
Neutron 通過 dnsmasq 為每個(gè) Network 提供單獨(dú)的 DHCP 和路由服務(wù)。
使用 ip 查看所有 namespcae
使用 neutron 查看 net-list
查看某個(gè) namespace 的詳細(xì)配置
3 個(gè) Instance 通過 tap 設(shè)備連接到名為 “vrqXXXX” 的 Linux Bridge。
在物理網(wǎng)卡 eth1 上創(chuàng)建 eth1.100 的 valn interface,eth1.100 連接到 brqXXXX。
這樣,Instance 通過 eth1.100 發(fā)送到 eth1 的數(shù)據(jù)包就會(huì)打上 vlan100 的 tag。
如果在創(chuàng)建個(gè) network vlan101,eth1 上就會(huì)相應(yīng)的創(chuàng)建多個(gè) vlan interface eht1.101 并連接新的 Linux Bridge “brqYYYY”。
配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中設(shè)置 tenant_network_types 的值為 vlan
配置 vlan 的范圍
意思是:配置定義了 lable 為 “default” 的 valn network,valn id 的范圍是 3001~4000。這里配置的是普通用戶使用的范圍。
admin 可以使用 1~4096 的 valn network
再次指定 vlan network 與物理網(wǎng)卡的對(duì)應(yīng)關(guān)系
配置子網(wǎng)
查看系統(tǒng)網(wǎng)橋
這里可以看到:
vlan100 對(duì)應(yīng)的網(wǎng)橋?yàn)?brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默認(rèn)網(wǎng)卡名 ens 開始的。)
DHCP 的 tap 設(shè)備是 tapf85d61d8-c3。
在 計(jì)算節(jié)點(diǎn)查看 網(wǎng)橋信息
可以發(fā)現(xiàn)創(chuàng)建的 Instance 已經(jīng)連接到 vlan100 對(duì)應(yīng)的網(wǎng)橋 brq2b85ebb9-a 上。因?yàn)橛?jì)算節(jié)點(diǎn)沒有 DHCP 服務(wù)所以沒有相應(yīng)的 tap 設(shè)備。
另外 網(wǎng)橋的名字與控制節(jié)點(diǎn)是一樣的,都是 brq2b85ebb9-a6,表示是在同一個(gè) network 上。
下圖是我創(chuàng)建 VLAN 后 兩臺(tái) Instance 分別在控制節(jié)點(diǎn)和計(jì)算機(jī)點(diǎn)的網(wǎng)絡(luò)圖
此時(shí)兩臺(tái) Instance 在同一 valn100 下。相互之間是可以 ping 通的。
如果在創(chuàng)建一個(gè) vlan101。如果兩臺(tái) Instance1 和 Instance2 分別連在 vlan100 和 vlan101。此時(shí)兩臺(tái) Instance 是不能 ping 通的。
如下圖兩個(gè) vlan
兩臺(tái) Instance1 和 Instance2 分別連在 vlan100 和 vlan101。此時(shí)兩臺(tái) Instance 是不能 ping 通的。
因?yàn)?vlan 在二層是隔離的。如果想要互通,只能在三層通過路由轉(zhuǎn)發(fā)。
1、建立網(wǎng)橋
touch /etc/sysconfig/network-scripts/ifcfg-br0
建立網(wǎng)橋配置文件ifcfg-br0
vi /etc/sysconfig/network-scripts/ifcfg-br0
2、添加網(wǎng)卡到網(wǎng)橋把eth0和eth1兩網(wǎng)卡添加到網(wǎng)橋中。修改eth1網(wǎng)卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改eth2網(wǎng)卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth2
3. 重啟網(wǎng)絡(luò)服務(wù)
service network restart