Linux – Bridge

老實說是用過虛擬化-Xen 之後才發現有 Linux 下網路的模式有一個東西叫做 Bridge mode,有點像將多個 NIC Adapter ports 透過一個虛擬出來的 Bridge(Switch) 全部串在一起,再透過一個虛擬出來的網路裝置出去,這簡直就像是把 Linux 當成一個 switch 來使用了.

除了虛擬化 Xen 的環境預設已經使用一個 Bridge 外,在一般的 Linux 環境下的方法也很簡單,我們也可以透過下面幾個簡單的指令來產生自己所需要的 Bridge 裝置出來.

下面的圖示你可以很清楚的看出來虛擬 NIC 和實體 NIC 是如何透過 bridge 模式串接在一起.
bridge_mode

  1. 目標是用 eth0 / eth1 / eth2 來產生一個 bridge (bri0)
    [root@benjr ~]# ifconfig eth0 0.0.0.0
    [root@benjr ~]# ifconfig eth1 0.0.0.0
    [root@benjr ~]# ifconfig eth2 0.0.0.0
    [root@benjr ~]# brctl addbr bri0
    [root@benjr ~]# brctl addif bri0 eth0 eth1 eth2
    
  2. 看這一些 eth 是在哪一個 bridge 上.
    [root@benjr ~]# brctl show
    bridge name     bridge id               STP enabled     interfaces
    bri0            8000.001517785dd6       no              eth2
                                                                                     eth1
                                                                                     eth0
    virbr0          8000.000000000000       yes
    

    virbr0 是 RedHat 5 預設的 bridge 而 bri0 是剛剛透過 brctl 工具所建立出來的.

  3. 設定一組 IP ,方便遠端管理使用.
    [root@benjr ~]# ifconfig bri0 192.8.1.3
    [root@benjr ~]# ifconfig bri0
    bri0      Link encap:Ethernet  HWaddr 00:15:17:78:5D:D6 
              inet addr:192.8.1.3  Bcast:192.8.1.255  Mask:255.255.255.0
              inet6 addr: fe80::215:17ff:fe78:5dd6/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:14767 errors:0 dropped:0 overruns:0 frame:0
              TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:679328 (663.4 KiB)  TX bytes:9626 (9.4 KiB)
    
  4. 最後 Allow IP forwarding
    要讓 IP Forwarding 生效最快的方式就是直接更改 /proc/sys/net/ipv4/ip_forward 的值,但這方式在下次開機後會失效.

    [root@benjr ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
    

    還是要更改設定檔,這樣下次開機一樣有效,並使用指令 sysctl -p 讓他立即生效.

    [root@benjr ~]# vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    [root@benjr ~]# sysctl –p
    

    之後所有插在 eth0 / eth1 /eth2 的 Hosts 都可以互通了!!可以將剛剛的步驟寫在 /etc/rc.local,讓他在開機時候就會生效.

    一開始你可能會對於 Bridge 和 Bonding 這兩東西有所困惑,感覺功能都是將多個 NIC ports 綁在一起來使用,但是最後功能上又不是很像.其實Bridge mode 的功能是將 linux 模擬成一個 Bridge(switch)來使用.凡是 Bridge 上的 NIC ports 實體網路埠都會透過一個虛擬的網路裝置出去,這就相當於是一個交換機(switch) 一樣,每個實體網路埠都有專屬的 MAC.不像是 Bonding 外面看來所有的 NIC 的 MAC 都是一樣.

    還有一點要注意的 bridge 是不能實現 bonding 的負載平衡(load-balancing),容錯(fault-tolerance)的功能.如果你把 Brctl (Bridge) 的 NIC ports 實體網路埠都接到同一交換機 (Switch),那麼就會出現 Loop 環路(預設都是沒有將 STP 開啟).接下來大概你的 switch 因為廣播風暴就掛了.關於 Linux – Bonding 請參考: http://benjr.tw/233

4 thoughts on “Linux – Bridge

  1. 太好了,正好解决了一直困扰我的问题:bridge实现不了bonding的負載平衡、容錯
    也就是说如果不开启STP会出现环路,启动STP就会阻断其它的通路,总之是没有办法让bond的网卡同时工作,对吧?

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料