Linux 網橋管理

来源:https://www.cnblogs.com/heyongshen/archive/2023/10/12/16417712.html
-Advertisement-
Play Games

網橋的概念 在生活中,橋是一種結構,用於連接兩個地方,允許行人、車輛等安全地跨越障礙物(如河流或高速公路) 在電腦網路技術中,網橋是一種工作在數據鏈路層的物理或邏輯設備,可以用於連接兩個或多個區域網段。它基於MAC地址來轉發或過濾幀,從而有效地劃分廣播域。 在Linux中,網橋是一個邏輯設備,用於 ...


網橋的概念

  • 在生活中,橋是一種結構,用於連接兩個地方,允許行人、車輛等安全地跨越障礙物(如河流或高速公路)

  • 在電腦網路技術中,網橋是一種工作在數據鏈路層的物理或邏輯設備,可以用於連接兩個或多個區域網段。它基於MAC地址來轉發或過濾幀,從而有效地劃分廣播域。

  • 在Linux中,網橋是一個邏輯設備,用於鏈接兩個或更多的網路介面(例如,eth0, eth1),使它們在邏輯上工作如同一個介面。在虛擬化技術中,就使用到了網橋技術,鏈接物理主機和虛擬機或不同的虛擬機。


網橋工作原理

1、網路介面的作用

  • 在Linux中,udev 是負責動態管理設備節點的守護進程。當硬體設備被插入或移除時,udev 會根據 /lib/udev/rules.d/ 目錄中定義的規則來生成或移除對應的設備節點,併進行相應的命名和管理。

  • 網路介面名稱(例如eth0、ens33)是由udev的規則指定的,這隻是一個邏輯名稱,用於在用戶空間中引用特定的網路設備。這個名稱本身並不直接指向物理設備,而是與內核中的網路設備數據結構關聯。

  • 所以用戶空間的相關工具(例如ifconfig、nmcli等)可以通過這個網路介面的名稱作為標識符來與內核的網路協議棧交互,這個介面名稱為工具和內核提供了一個明確的引用點,以便指定它們希望配置或查詢哪個特定的網路設備


虛擬網卡是一個邏輯上的網路介面(vnetX),它在Linux內核中表示為網路設備,但沒有與之對應的物理硬體。


2、網橋的成員介面

創建一個網橋設備時,這個網橋設備和虛擬網卡一樣,沒有對應的物理硬體,屬於邏輯上的設備。將物理網卡和虛擬網卡進行橋接,都會成為了橋的成員介面,此時eth0和vnetX直接通信的不再是內核,而是橋br0。但vnetX和eth0仍然可以在數據鏈路層上發送和接收幀。(不能直接向內核網路協議棧發送消息,而是只能接收來自網路協議棧的消息),一旦進行了橋接,vnetX和eth0就會共用相同的網路段。從邏輯上講,它們都連接到了同一個數據鏈路層子網。

可以簡單理解為,進行橋接後,物理網卡變成了一根網線,連接外部硬體設備。

說明:兩個網路介面(無論是物理的還是虛擬的)之間的橋接,通常需要一個橋接設備。不能直接將兩個網路介面橋接在一起而不創建一個橋接設備。


橋接說明:

  • 橋接後的數據流: 當物理網卡(例如,eth0)被添加到橋(例如,br0)時,它不再直接與網路協議棧進行通信。所有的數據鏈路層通信都通過橋介面來管理和轉發。此時,橋介面充當了一個虛擬交換機的角色,負責在其成員介面之間進行數據鏈路層的幀轉發。

  • IP地址分配: 當橋接配置完畢後,橋介面(如br0)成為與網路協議棧交互的主要介面,因此應當為其分配IP地址。這就解釋了為什麼將eth0橋接後,其原來的IP地址會被移除。同時,橋接成員介面(如vnetX)通常不需要IP地址,因為它們不再直接與網路協議棧交互,而是通過橋介面br0來進行數據傳輸。

  • 物理網卡的作用: 在橋接配置中,物理網卡可以被看作是一段傳輸介質或“電纜”,連接電腦硬體與外部網路。它確保橋介面及其成員可以與外部設備進行數據鏈路層的通信。


Linux 網橋管理

通過工具管理網橋

1、通過 brctl 創建網橋

brctl 是由 bridge-utils 軟體包提供的一個工具,可以通過這個工具來輕鬆創建網橋。但是隨著iproute2 套件的發展和普及,ip 命令開始提供了類似的功能,使得對網橋的管理brctl不再是首選的工具。

使用 brctl 創建的網橋在預設情況下是臨時的,重啟系統就失效了。

創建網橋:

# br0是創建的網橋介面名稱

$ sudo brctl addbr br0

給網橋添加成員介面:

# ens33和37是物理網卡
$ brctl addif ens33
$ brctl addif ens37

啟動網橋:預設網橋是down狀態的

ifconfig br_name up 或  ip link set br_name up

刪除網橋:

 brctl delbr br_name

移除子介面:

brctl delif br_name device_name

開啟stp功能

brctl stp br_name on

2、通過NetworkManager 配置網橋

一般是通過 NetworkManager 提供的命令行工具nmcli來管理網橋。因為現在的Linux發行版系統中,大多數是使用NetworkManager來作為網路管理工具,當使用nmcli進行配置時,NetworkManager會將這些配置寫入其配置文件,以便在系統重啟後仍然有效。這些配置文件通常位於/etc/NetworkManager/system-connections/目錄下。

創建網橋:

nmcli con add type bridge con-name br0 ifname br0

添加成員介面到網橋:

# con-name 物理網卡在橋接中的連接名稱
nmcli con add type bridge-slave con-name br0-eth1 ifname eth1 master br0

# 刪除成員介面
nmcli con delete 物理網卡的連接名稱

啟動或停止網橋:

nmcli con up br0
nmcli con down br0

刪除網橋:

nmcli con delete br0

查看網橋的配置:

nmcli con show | grep bridge

說明:
連接名稱是 NetworkManager 的一個核心概念,實現更方便地管理各種網路設置,而不僅僅是通過網路介面名稱。在 NetworkManager 中,每一個網路配置(無論是有線、橋接等)都被視為一個“連接”(connection)。這個連接有一個名字,通常被稱為“連接名稱”(connection name),名稱任意,用於後續識別和管理該特定的連接。

啟動stp功能:

nmcli con modify br_name bridge.stp yes

3、通過ip命令管理網橋

ip命令是由iproute2 套件來提供的,提供了ip、ss等命令。使用ip命令來配置網橋也是臨時生效的哦。要使這些配置在重啟後依然生效,需要將這些命令添加到系統的啟動腳本或使用專門的網路配置文件來持久化設置。

創建網橋;

ip link add name br0 type bridge

添加成員介面:

ip link set dev eth1 master br0

啟動或停止網橋;

# up
ip link set dev br0 up

# down
ip link set dev br0 down

刪除網橋:

ip link delete dev br0 type bridge

刪除成員介面;

ip link set dev eth1 nomaster

查看網橋的配置:

ip link show type bridge

啟動stp功能:

sudo ip link set br_name type bridge stp_state 1

網橋配置IP地址

創建一個網橋並將一個或多個網路介面添加為其成員時,成員介面上的IP地址配置通常會失效。此時,所以要為網橋介面本身配置IP地址,以便它可以參與網路通信。

這個時候直接將網橋設備當成一個普通的網路介面(例如eth0)進行配置就行了,記得還需要配置路由

例如;

# 網路介面配置
ip addr add 192.168.1.10/24 dev br0

# 路由配置
ip route add default via 192.168.1.1 dev br0

通過配置文件管理網橋

1、centos7:

前提:檢查bridge模塊是否載入,如果沒有載入需要手動進行載入並設置持久生效

lsmod  | grep bridge
bridge                151336  0
stp                    12976  1 bridge
llc                    14552  2 stp,bridge

# 載入模塊
modeprobe bridge

# 持久生效
vim /etc

1、創建網橋配置文件
配置文件位於:創建網橋配置文件 /etc/sysconfig/network-scripts/ifcfg-br_name

vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.0.20
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=180.76.76.76
DNS2=223.6.6.6
STP=on  # 開啟stp功能

2、修改物理網卡介面的配置文件
例如將eth0和eth1這兩個物理介面作為網橋br0的子介面

vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
BRIDGE=br0  # 表示當前網路介面(如 eth0)應該被添加到名為 br0 的網橋作為一個成員介面

eth0:

eth1:

3、重啟服務
centos7是預設使用NetworkManager作為網路管理服務。通過使用傳統的 network 腳本配置的網路,你仍然可以利用 NetworkManager 來管理和應用這些配置。

systemctl restart NetworkManager

2、ubuntu1604:

前提:

需要載入bridge模塊

sudo modeprobe bridge

sudo vim /etc/modules
bridges

需要安裝bridge-utils這個工具包,比較舊的一些版本bridge-utils 包是必要的

sudo apt install bridge-utils 

1、修改配置文件

sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
    address 192.168.14.108
    netmask 255.255.248.0
    gateway 192.168.12.1
    dns-nameserver 180.76.76.76
    bridge_ports ens33 ens37
    bridge_stp on

auto ens33
iface ens33 inet manual
    up ip link set $IFACE up
    down ip link set $IFACE down

auto ens37
iface ens37 inet manual
    up ip link set $IFACE up
    down ip link set $IFACE down

說明:

  1. 在配置文件中添加auto ens33和auto ens37目的是為了保證網路介面開機自啟動

  2. 給ens33和ens37配置 up 和down的命令是為了確保介面能正確上下線(系統啟動或重新啟動網路服務時)

  3. 物理網路介面使用手動(manual)模式是為了確保系統知道這些介面存在,並且不會嘗試自動為它們分配IP地址

  4. bridge_stp需要設置為on,特別是網橋的成員介面位於同一個交換機,不開啟會發生環路的問題;

  5. $IFACE是一個特殊的變數,它自動引用當前被配置的網路介面的名稱

2、重啟服務

sudo systemctl restart networking

3、ubuntu2004

前提:需要載入bridge模塊

# 檢查模塊是否載入
lsmod | grep bridge

# 載入模塊
sudo modprobe bridge

# 持久化配置
sudo vim /etc/modules
bridge

1、編輯配置文件

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
    ens34:
      dhcp4: no

  bridges:
    br0:
      interfaces: [ens33, ens34]
      dhcp4: yes
      parameters:
        stp: true
        forward-delay: 4

2、配置生效

編輯了 netplan 的配置文件後,這些更改並不會立即生效。為了使這些更改生效,需要運行 sudo netplan apply。這樣,netplan 會讀取修改後的配置文件並調用底層的網路管理工具(例如 networkd 或 NetworkManager)來應用這些配置更改。

sudo netplan apply

3、檢查是否生效

bridge link show br0

stp功能介紹

stp是Spanning Tree Protocol(生成樹協議)的縮寫,作用就是用來防止二層環路的,用在二層交換機上面。網橋就相當於是一個交換機,所以在網橋將成員介面(物理網卡)加入時,需要開啟stp協議才行。不然如果兩個物理網卡是連接在一個交換機上面,就會產生廣播風暴。導致整個區域網出現網路不穩定的問題。

當配置一個網橋並啟用STP協議後,為了避免可能的網路環路,每個加入到該網橋的埠(一個埠就是一個物理網卡)會經歷幾個狀態變遷,以確定網路的拓撲結構,並確定哪些埠應該被放入轉髮狀態,哪些埠應該被阻塞。首先進入阻塞狀態。從阻塞狀態轉移到轉髮狀態前,埠需要經歷兩個中間狀態:

  • 監聽 (Listening):在此狀態中,埠會監聽可能的衝突的橋接數據包,但不會學習MAC地址。此狀態預設持續15秒(這是Forward Delay的一半)。

  • 學習 (Learning):在此狀態中,埠開始學習MAC地址,從而構建其轉發資料庫,但仍然不轉發楨。此狀態同樣持續15秒(這是Forward Delay的另一半)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start': (.text+0x24): undefined reference to `main' coll ...
  • 最近懷疑自己用了個假的VS Code, 同門的能絲滑跳轉定義、跳轉引用,自己的偏偏不行(合著這麼爽的功能我從來沒享受到(。﹏。*)),網上各種教程試了個遍都不行,最後自己摸索出瞭解決方案。記錄在此備忘。 ...
  • ASP.NET Core使用Hangfire實現定時任務 前言 也是上了5天班,終於迎來了休息,抽空更新下博客,然後就是下周一公司會對我進行考核,希望考核能通過吧!!! 然後我想給博客添加一個定時發佈文章的功能,其實這個功能對於我的博客是沒什麼作用的,什麼時候發都沒什麼人看。但是咱還是要有這個功能。 ...
  • 用的是express模板。下載的是阿裡雲Nginx證書。配完nginx.conf,可以用 nginx -t; 檢查一下,只要提示is ok和successful就行, 然後重啟用 sudo service nginx reload; 如果提示‘Redirecting to /bin/systemct ...
  • 【學習課程】:【【小白入門 通俗易懂】2021韓順平 一周學會Linux】 https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e054 ...
  • 通用快捷鍵 tab按鍵補全,雙擊tab展示所有可能性 :set nu 顯示行號 上下鍵切換寫過的命令 開關機 reboot重啟 poweroff 關機; shutdown –h now 立刻關機 ctrl+c 強制停止命令的運行,退出當前命令的輸入 ctrl+d退出或登出 history查看歷史命令 ...
  • 目錄上電測試製作boot.sd編譯Linux內核multi.its 上電測試 在上一篇,我們構建了fip.bin。讓我們繼續用以前的boot.sd。我們插上電源, U-Boot 2021.10 (Oct 15 2023 - 14:17:51 +0800)cvitek_cv180x DRAM: 63. ...
  • 目錄構建riscv64-unknown-linux-musl編譯工具鏈直接下載官方工具鏈嘗試自己編譯T-head Gcc下載編譯binutils編譯交叉gcc編譯musl手動合成fip.bin和boot.sd編譯u-boot生成cvi_board_memmap.h,cvipart.h和imgs.h繼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...