導航:首頁 > 程序命令 > linuxbridge命令

linuxbridge命令

發布時間:2023-01-06 19:57:22

A. 如何在linux伺服器上配置網橋

1、建立網橋

touch /etc/sysconfig/network-scripts/ifcfg-br0

建立網橋配置文件ifcfg-br0

vi /etc/sysconfig/network-scripts/ifcfg-br0

3. 重啟網路服務

service network restart

B. 如何配置linux下雙網卡橋接

linux下雙網卡配置橋接如下
首先,配置linux伺服器端,將兩張網卡配置成橋接模式:
在/etc/sysconfig/network-scripts/文件夾下創建ifcfg-br0橋接介面配置文件,內容如下:
[root@N3 network-scripts]# vi ifcfg-br0
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=br0-----橋接介面命名為bro
TYPE=Bridge-----類型橋接模式
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.222----這部分是配置橋接介面的管理ip(類似svi口的ip)和網關等等。
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
NETWORK=192.168.1.0
將兩個介面加入橋接埠:
[root@N3 network-scripts]# vi ifcfg-eth0
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=eth4
BOOTPROTO=none
HWADDR=00:21:5E:47:31:98
ONBOOT=yes
BRIDGE=br0---加入橋接埠
IPV6INIT=no
PEERDNS=yes
NM_CONTROLLED=no
TYPE=Ethernet
USERCTL=no
[root@N3 network-scripts]# vi ifcfg-eth1
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=eth5
BOOTPROTO=none
HWADDR=00:21:5E:47:31:A0
ONBOOT=yes
BRIDGE=br0
IPV6INIT=no
PEERDNS=yes
NM_CONTROLLED=no
TYPE=Ethernet
USERCTL=no
配置完成後,需要重啟設備後,網卡橋接才能生效。
其次,在linux下開啟生成樹協議:
到目前為此我們可以看到,如果linux端配置成橋接模式,而交換機端也沒有開啟生成樹,整個網路是環路狀態。
我們要在交換機端開啟生成樹:spanning-tree
同時在linux端也開啟生成樹協議,通過如下命令開啟:
[root@SERVER2 ~]# brctl stp br0 on
可以通過如下命令查看linux伺服器生成樹狀態:brctl showstp br0
交換機端查看生成樹狀態:show spanning-tree summary
可以看到交換機端埠GI0/50被block了,兩端生成樹都生效了。
至此Linux下雙網卡橋接同時開啟生成樹保證網路拓撲不環路的方案就完成了。

C. 玩轉 OpenStack(八.1)Linux Bridge 實現 Neutron 網路之Local、Flat、VLAN、DHCP

Neutron 默認使用 ML2 作為 core plugin,配置文件 /etc/neutron/neutron.conf 中 core_plugin

計算節點和控制節點都需要在各自的 neutron.conf 中配置 core_plugin

然後配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中 mechanism_drivers

mechanism_drivers 可以同時指定多個。這里只指定了一個。

查看 linuxbridge 進程

控制節點:

計算節點:

在 Linux Bridge 環境中,一個數據包從 Instance 發送到物理網卡會經過下面幾個類型的設備:

對於每個 local network,ML2 linux-bridge 會創建一個 bridge,Instance 的 tap 設備會連接到 bridge。位於同一個 local network 的 Instance 會連接到相同的 bridge,這樣 Instance 之間就可以通訊了。

因為 local network 沒有與物理網卡相連,所以 Instance 無法與宿主機之外的網路通信。

同時因為每個 local network 有自己的 bridge,bridge 之間是沒有連通的,所以兩個 local network 之間是不通的。

ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini

type_drivers ML2 載入網路類型。
tenant_network_types 普通用戶在自己的 Tenant(Project)中創建網路時,默認創建哪種 type 的網路。
tenant_network_types = vlan, local 意思是當沒有 vlan 可創建時,使用 local。

檢測 Neutron Agent 是否正常 管理員 --> 系統 --> 系統信息 --> 網路代理

從用戶管理創建網路

創建網路 項目 --> 網路 --> 網路

填寫網路名稱

填寫子網信息。 網關 IP 可以不用填寫。默認為子網地址的第一個 IP。即:172.16.10.1

添加子網 IP 范圍。

點擊網路名稱,進去相信信息,可以看到子網和埠信息等。

可以看到在埠中已經創建了一個 port,名為 「(c45b69e6-04ba)」,IP 為 172.16.10.2。連接設備為 "network:dhcp"。

打開控制節點終端,使用 brctl show 查看 linux bridge 的狀態。

可以看到 bridge 設備 brqd2fd4378-9e 和 tap 設備 tapc45b69e6-04

創建 Instance 並選擇剛剛創建的網路。

創建 Instance 成功後可以發現已經分配 IP 地址。

在底層中 Neutron 會在 subnet 中創建一個 port,分配 IP 和 MAC 地址,並將 port 分配給 test。如下圖

點進去可以看到詳情

在宿主機上執行 brctl show 可以查看 bridge 的配置。

可以看到 bridge brqd2fd4378-9e 上連接了一個新的 tap 設備。
查看 Instance 信息。使用 virsh list 查看 Instance 運行中的列表。
使用 virsh edit 1 查看配置信息。

配置信息省略很多。重要的放在上面。
<mac address='fa:16:3e:19:e1:57'/> 是 Instance 網卡的 MAC 地址
<target dev='tapb337d11f-54'/> 是 Instance 虛擬網卡信息

ping test1 的 IP 地址發現是可以 ping 通。

查看 brctl show

發現 brqd2fd4378-9e 中又計入進來一個 VIF,因為兩個 VIF 掛載在同一個 Linux Bridge 上,所以可以通訊。

結構如下:

如果新分的 Instance 在計算節點中。不在控制節點。他們之間將不在互通。
因為 DHCP agent 在控制節點上運行,test2 在計算節點的 local 網路上,兩者位於不同物理節點。由於 local 網路的流量只能局限在本節點之內,發送的請求無法到達計算節點。

上圖 物理網卡 eth1 橋接到 brqXXXX,為 Instance 提供 flat 網路。

下圖 創建多個 flat Network,就要准備多個物理機網卡。

在 /etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 參數為 flat

:這里是指定普通用戶使用 flat。因為 flat 網路與物理網卡一一對應。一般情況下租戶網路不採用 flat。

flat_networks 定義一個 flat 網路,label 為 「default」

通過 physical_interface_mappings 指名 default 對應的物理網卡為 ens35

例如:對於 label 為 「default」 的 flat network,節點 A 可能使用 ens35,配置為:

而 B 節點則可以使用 ens33,配置為:

創建 flat 網路

綁定子網

查看 控制節點網路狀態

Neutron 自動新建了 flat_net 對應的網橋 brq9e3013c8-93,以及 dhcp 的 tap 設備 tap50802894-1a。
此時 tap50802894-1a 和物理網卡 ens35 都已經連接到網橋 brq9e3013c8-93 上。

可以看到 Instance 的 tap 設備 tapc1241c3f-cb 已經連接到網橋

配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driver 和 interface_driver

dnsmasq 是一個提供 DHCP 和 DNS 服務的開源軟體。
在實現環境中使用 ps 命令可以查看到 dnsmasq 進程。

DHCP agent 會為每個 network 創建一個目錄 /opt/stack/data/neutron/dhcp/xxxx 用於存放該 network 的 dnsmasq 配置文件。

在二層網路上,VLAN 可以將一個交換機分割成幾個獨立的虛擬交換機。
類似,在三層網路上,Linux Network Namespace 可以將一個物理三層網路分割成幾個獨立的虛擬三層網路。
每個 namespace 都有自己獨立的網路棧,包括 route table,firewall rule,network interface device等

Neutron 通過 dnsmasq 為每個 Network 提供單獨的 DHCP 和路由服務。

使用 ip 查看所有 namespcae

使用 neutron 查看 net-list

查看某個 namespace 的詳細配置

3 個 Instance 通過 tap 設備連接到名為 「vrqXXXX」 的 Linux Bridge。
在物理網卡 eth1 上創建 eth1.100 的 valn interface,eth1.100 連接到 brqXXXX。
這樣,Instance 通過 eth1.100 發送到 eth1 的數據包就會打上 vlan100 的 tag。

如果在創建個 network vlan101,eth1 上就會相應的創建多個 vlan interface eht1.101 並連接新的 Linux Bridge 「brqYYYY」。

配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中設置 tenant_network_types 的值為 vlan

配置 vlan 的范圍

意思是:配置定義了 lable 為 「default」 的 valn network,valn id 的范圍是 3001~4000。這里配置的是普通用戶使用的范圍。
admin 可以使用 1~4096 的 valn network

再次指定 vlan network 與物理網卡的對應關系

配置子網

查看系統網橋

這里可以看到:
vlan100 對應的網橋為 brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默認網卡名 ens 開始的。)
DHCP 的 tap 設備是 tapf85d61d8-c3。

在 計算節點查看 網橋信息

可以發現創建的 Instance 已經連接到 vlan100 對應的網橋 brq2b85ebb9-a 上。因為計算節點沒有 DHCP 服務所以沒有相應的 tap 設備。

另外 網橋的名字與控制節點是一樣的,都是 brq2b85ebb9-a6,表示是在同一個 network 上。

下圖是我創建 VLAN 後 兩台 Instance 分別在控制節點和計算機點的網路圖

此時兩台 Instance 在同一 valn100 下。相互之間是可以 ping 通的。

如果在創建一個 vlan101。如果兩台 Instance1 和 Instance2 分別連在 vlan100 和 vlan101。此時兩台 Instance 是不能 ping 通的。

如下圖兩個 vlan

兩台 Instance1 和 Instance2 分別連在 vlan100 和 vlan101。此時兩台 Instance 是不能 ping 通的。

因為 vlan 在二層是隔離的。如果想要互通,只能在三層通過路由轉發。

D. Linux Bridge模擬在docker中的應用

Bridge是一種虛擬網路設備,所以具備虛擬網路設備的所有特性,比如可以配置 IP、MAC 等。除此之外,Bridge 還是一個虛擬交換機,具有交換機所有的功能。

對於普通的網路設備,就像一個管道,只有兩端,數據從一端進,從另一端出,如物理網卡從外面網路中收到數據轉發給內核網路協議棧,從網路協議棧過來的數據轉發到外部網路。而 Bridge 有多個埠,數據可以從多個埠進,從多個埠出,原理和交換機類似。

Bridge 的這個特性讓它可以接入其他的網路設備,比如物理設備、虛擬設備。Bridge 通常充當主設備,其他設備為從設備,這樣的效果就等同於物理交換機的埠連接了一根網線。Bridge是和主機的網路協議棧相連的,也就是說通過bridge的網路數據,是要經過host主機的內核協議棧的進行處理的(我的理解就是net_filter通過iptables設置的rules進行處理)

veth-pair 就是一對的虛擬設備介面,它都是成對出現的。一端連著協議棧,一端彼此相連著

正因為有這個特性,它常常充當著一個橋梁,連接著各種虛擬網路設備。例如在docker中,他們連接容器所處網路namespace和bridge。

此圖中veth-pair一個是連接在bridge上的veth,另一個是連接在容器網路namespace上的eth0。veth和eth0彼此相連,veth通過bridge與host的網路協議棧相連,eth0通過容器namespace和容器的網路協議棧相連。這里的容器是在host內部的容器,不考慮跨節點的容器。

安裝docker成功後,我們可以看到docker在host機器上默認的創建一個docker0的bridge,這個bridge也是容器的默認的連接方式。在這里我們將用將創建網路namespace來模擬容器,讓namespace和我們創建好的bridge連接起來,容器之間可以相互訪問,容器可以和host所在網路訪問。

首先我們要打開host機器上的ip_forwarding功能,這樣host的物理網卡和bridge之間才能forward數據包。IP_FORWARD可以使連接在同一個網路協議棧上的網路介面間進行數據包的轉發,適合host上有多塊物理網卡,虛擬設備介面,結合iptables的 forward鏈一起使用。例如主機網路協議棧上連接了30.0/24這個物理網卡和88.0/24這個bridge虛擬設備,一個數據包從30.0/24這塊網卡進入網路協議棧,數據包的destination是88.0/24這個網段上的某一個IP地址,內核協議棧發現這個包是去bridge子網的,於是就會把這個數據包forward給bridge連在網路協議棧上的埠並進行處理。如果forward功能沒有打開,數據包無法轉發到bridge,只能在drop掉。

這個重啟後就失效了,要想永久有效請修改文件/etc/sysctl.conf

創建一個bridge br0,激活這個device,並給他分配一個IP地址及掩碼192.168.88.1/24。

創建一個網路的namespace ns0,然後在這個網路namespace中執行bash命令(另外起一個terminal做這個事情),如果你還不清楚什麼是linux內核namespace,請google相關資料。

執行命令後,我這個terminal已經進入到ns0這個namespace了,這和docker容器的網路namespace是一致的。通過ip命令查詢,現在這個命令空間裡面只有一個loopback的網路設備,沒有其他網路設備相連。然後通過命令使loopback設備active

接下來我們就要創建veth pair,一邊和這個ns0連接,一邊和br0連接,並給他們分配IP地址。(這些操作不要在ns0里執行bash命令的terminal裡面做)

這里創建一個veth pair,veth0和veth0p,並且把veth0和ns0相連,並分配和br0同一個網段的IP地址192.168.88.2,啟動veth0p這個設備。返回到ns0下bash的terminal,可以看到多出一個網卡信息並分配到IP地址,但是這個dev是處於LOWERLAYDOWN的狀態,這是由於pair另一端還沒有接入到br0.

接下來就是把veth0連接到br0上,並啟動這個設備。

我們可以看到br0上有一個veth設備連接上來,返回去看ns0下的bash,我們可以看到veth0p的狀態已經變成UP。

現在br0的IP是192.168.88.1,ns0的IP地址為192.168.88.2,我們可以在ns0下去ping 192.168.88.1是可以通的,我們可以通過同樣的步驟在創建另外一個namespace ns1並分配IP192.168.88.3。ns0,ns1, br0都是可以相互連接的,這里就不重復創建了。

目前為止連接在bridge上的namespace都是可以相互訪問,這個體現了bridge虛擬交換機的功能。如果我們還需要容器能訪問host所在的網路,我們需要繼續配置下面步驟。

在ns0下的bash命令行下設置默認路由,不屬於192.168.88.0/24這個網段的數據包全部路由到默認網關br0 192.168.88.1.

由於192.168.88.0/24這個網段和host所在的網路不是一個網路,一切從88.0/24這個網路的數據包要訪問外部網路都是要通過host的主機IP去訪問的,對於遠端服務連接它是不知道88.0/24這個網路的,他接收的數據包的src地址都是host的IP地址,在這里我們需要對88.0/24這個網段的數據包做SNAT。在host的terminal下通過iptables的命令設置。

iptables必須是enable的,並對NAT table的POSTROUTING chain添加一條規則,所有src地址為88.0/24這個網段的數據包,全部走host機器上的物理網卡,通過MASQUERADE選項修改src地址為網卡eno16777736的IP地址。你也可以用SNAT這個參數代替指定一個特殊IP地址。

請自行參考iptables的用法和原理,如果你的host主機上實現設置了其他iptables rules從而阻止了88.0/24這個網路的forward或者routing,需要自行檢查一下,每一個機器的網路狀態是不一樣的沒辦法全部覆蓋。這里推薦一個系列博客很詳細的講解了 iptables 。 

這里可以看到我們在ns0下的bash命令行,可以ping通host所在網路的機器30.134和internet上的。現在就完成了整個模擬實驗。

E. linux 3.10 kernel bridge 泛洪包會發到包的入口介面上嗎

網橋介面的混雜模式取決於三個因素,一個是自身的混雜模式設置;第二是vlan過濾是否開啟;最後是處於自動狀態(auto_port)的子介面的數量。網橋的混雜模式管理函數br_manage_promisc如下:
void br_manage_promisc(struct net_bridge *br)
{
if ((br->dev->flags & IFF_PROMISC) || !br_vlan_enabled(br))
set_all = true;

list_for_each_entry(p, &br->port_list, list) {
if (set_all) {
br_port_set_promisc(p);
} else {
if (br->auto_cnt == 0 ||
(br->auto_cnt == 1 && br_auto_port(p)))
br_port_clear_promisc(p);
else
br_port_set_promisc(p);
}
}
}
混雜模式設置
如下通過命令設置網橋br_2為混雜模式,此時,所有網橋子介面都將處於混雜模式(eth1與eth2 promiscuity mode):
ip link add br_2 type bridge
ip link set eth1 master br_2
ip link set eth2 master br_2
通過ip命令設置介面的混雜模式:
ip link set br_2 promisc on
或者ioctl系統調用設置混雜模式:
int set_bridge_promiscuity(void)
{
sockfd = socket(AF_INET, SOCK_DGRAM, 0);

strncpy(ifr.ifr_name, "br_2", IFNAMSIZ);
ioctl(sockfd, SIOCGIFFLAGS, &ifr);

ifr.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifr);
}
VLAN過濾
如果網橋的VLAN filtering過濾功能沒有開啟,即使網橋沒有設置混雜模式,也需開啟所有子介面的混雜模式。
/sys/devices/virtual/net/br_2/bridge/vlan_filtering
自動狀態介面AUTO_PORT
內核中對自動狀態介面的定義如下,即設置了學習(learning)或者單播泛洪(flood)標志的介面。
#define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING)
#define br_auto_port(p) ((p)->flags & BR_AUTO_MASK)
可通過bridge或者ip命令設置網橋介面的flood/learning等標志:
bridge link set dev eth1 flood on/off
bridge link set dev eth1 learning on/off
ip link set dev eth1 type bridge_slave flood on/off
ip link set dev eth1 type bridge_slave learning on/off
網橋添加網路設備時,新介面的flags賦值為BR_LEARNING與BR_FLOOD標志,即新介面為自動狀態介面。
static struct net_bridge_port *new_nbp(struct net_bridge *br, struct net_device *dev)
{
struct net_bridge_port *p;
p->flags = BR_LEARNING | BR_FLOOD;
}
BR_LEARNING標志,在函數br_handle_frame_finish中判斷,用來決定是否使用數據包的源MAC地址更新網橋的FDB轉發表。
int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
struct net_bridge *br;

br = p->br;
if (p->flags & BR_LEARNING)
br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false);
}
BR_FLOOD標志用來控制是否在介面上泛洪單播數據包,如果沒有設置此標志,不能在此介面泛洪單播包。
void br_flood(struct net_bridge *br, struct sk_buff *skb, ...)
{
struct net_bridge_port *p;

list_for_each_entry_rcu(p, &br->port_list, list) {
switch (pkt_type) {
case BR_PKT_UNICAST:
if (!(p->flags & BR_FLOOD))
continue;
break;
}
網橋結構體中保存了自動狀態介面的數量auto_cnt,在向網橋添加介面或者刪除介面的時候,調用nbp_update_port_count更新自動狀態介面的數量。通過遍歷網橋的介面列表,獲取自動介面數量。
static void nbp_update_port_count(struct net_bridge *br)
{
struct net_bridge_port *p;
u32 cnt = 0;

list_for_each_entry(p, &br->port_list, list) {
if (br_auto_port(p))
cnt++;
}
if (br->auto_cnt != cnt) {
br->auto_cnt = cnt;
br_manage_promisc(br);
}
}
所謂非自動介面,即此介面不自動學習數據包的源MAC地址,或者不泛洪單播包。對於此類介面,要正常轉發報文,必須靜態指定其在FDB轉發表中的轉發表項。由上文br_manage_promisc函數中的條件判斷可知,當網橋下都是非自動介面時(auto_cnt=0),關閉混雜模式,因為此時所有介面都已經配置好了轉發表項,不需要混雜模式。當只有一個介面時自動介面的時候,從這個介面接收到的數據包無非是要轉發到系統剩餘的其它介面,而其它介面都是非自動的,這就反向決定了此自動介面的轉發路徑也被確定下了,此時也不需要混雜模式。
所以當自動介面大於1時,開啟混雜模式。
更多Linux信息可參考《Linux就該這么學》

閱讀全文

與linuxbridge命令相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163