Contents

網路 Bridge 和 NAT 差異

之前架設 KVM 網路是用預設 NAT架構,在連線上外面是連不到 VM的。但我都需要在預設閘道路由表多設定 192.168.122.x/24指定到 VM 路由上面。這個做法感覺不是很方便,然後還要特別設定路由去連,前正子剛好在找 KVM 可以直接讓電腦網路方法,剛好看到用 Bridge 可以解決我這個問題。但是 BridgeNAT 他們架構圖分不是很清楚,這邊就先做個簡單整理。

一般常見虛擬網路三種模式

常見模式有三種:

  1. Bridge(橋接)
    一般可以把它當作Hub,設備連接就能連線。
  2. NAT 網路地址轉換 (Network Address Translation)
    出去流量都會做SNAT,出去IP 都會被做置換。外面 IP 是進不來的。通常會要有人做 DHCP 分配 IP,但大多 VM 都幫你做好了。
    Warning
    其實還是有方法可以進來的,VM Host 通常有轉發功能,只要在路由表設定 VM IP 路由區段導向 VM Host主機,簡單來說就是把安裝 VM 那台主機當作路由器,但通常不會這樣做,可能管理上也不好管理,我家一開始用這個方法,但被我懂網路朋友吐槽這個不是很優的方案。
  3. Host-only
    主機跟 VM 相連,這個有點跟之前做 veth pair差不多原理。每建一台 VM 用這個模式,你電腦都會多一個網路卡。

這邊不打算深入介紹,簡單說明我了解部分。建議可以看虛擬機的網路模式(Host-only,Bridged,NAT) - HackMD備份圖

Info
以前玩VM都不是很了解這三種模式,什麼方案可以讓 VM 吃到外面網路,一堆網路操作感覺都很複雜,不過最近了解BridgeNAT就了解了是用什麼原理讓網路連線。Host-only每次建立完,怎麼控制台會多個介面卡??一直都不是很懂,現在都了解了。

三種模式差異

其實之前介紹就能看出差異,從虛擬機的網路模式(Host-only,Bridged,NAT) - HackMD這篇裡面可以看到簡單理解這三種模式差異。

https://user-images.githubusercontent.com/6058558/257046945-34ffe666-0fbe-4577-845d-a0e07d4b9536.png

Bridged NAT Host-only
是否可以連到外網 可以 可以 不行
主機與虛擬機是否在同一網段 相同 不同 不同
IP設置 手動 DHCP自動配發 DHCP自動配發

我一開始看這篇 bridge 和 NAT 不知差異在哪邊。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|                         ↑                           ↑          |
|.........................|...........................|..........|
|                         ↓                           ↓          |
|        +------+     +--------+     +-------+    +-------+      |
|        |      |     | .3.101 |     |       |    | .3.102|      |
|        +------+     +--------+     +-------+    +-------+      |
|        | eth0 |<--->|   br0  |<--->| veth0 |    | veth1 |      |
|        +------+     +--------+     +-------+    +-------+      |
|            ↑                           ↑            ↑          |
|            |                           |            |          |
|            |                           +------------+          |
|            |                                                   |
+------------|---------------------------------------------------+
     Physical Network

上面圖我跟你說這是Bridge圖。
本來我還覺得我可以在 br0 上面的 eth0加上IP,再設定 iptable 做 NAT 大錯特錯想法。NAT圖是不是長這樣的

https://user-images.githubusercontent.com/6058558/257049013-358096d3-a8d4-4c69-bdc0-4f9c1b2270c5.png

下面有NAT 圖樣子

Tip

之前說 bridge 不能設定 IP,但是br0可以設定 IP,有點推翻之前說的。雖然我沒有爬到原因,但我猜測 host 看到的 br0是指 host 的孔,我原本以為還要自己建 veth去跟 br0 做連接,看來是不用的。

我目前在想 br0能設定 IP,其實這算是 bridge的 wlan孔?假如是這個概念,那所有bridge設定 gateway到那邊去也是很合理,然後送出封包照 host 路由表做派送。

我後來又仔細想想 bridge 孔,br0應該是指 Bridge 網卡,後來爬到一篇文章,說網路恐有設定 IP 的話,會跟Newwork Protocol Stack最連結。

當然這篇 裡面也有 NAT 架構圖。這邊我們看 br0 設定一個 IP,eth0不是接到br上面,這邊看 VM 和 docker0 橋接器都是這樣做的。

下面這個就是 NAT 圖示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|                          Host                                  |              Container 1                |              Container 2                |
|                                                                |                                         |                                         |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|       |             Newwork Protocol Stack             |       |       |  Newwork Protocol Stack |       |       |  Newwork Protocol Stack |       |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|            ↑             ↑                                     |                   ↑                     |                    ↑                    |
|............|.............|.....................................|...................|.....................|....................|....................|
|            ↓             ↓                                     |                   ↓                     |                    ↓                    |
|        +------+     +--------+                                 |               +-------+                 |                +-------+                |
|        |.3.101|     |  .9.1  |                                 |               |  .9.2 |                 |                |  .9.3 |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|        | eth0 |     |   br0  |<--->|  veth |                   |               | eth0  |                 |                | eth0  |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|            ↑             ↑             ↑                       |                   ↑                     |                    ↑                    |
|            |             |             +-------------------------------------------+                     |                    |                    |
|            |             ↓                                     |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |         |  veth |                                 |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |             ↑                                     |                                         |                    |                    |
|            |             +-------------------------------------------------------------------------------|--------------------+                    |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
     Physical Network  (192.168.3.0/24)

網路孔不是每個孔都能設定 IP

https://user-images.githubusercontent.com/6058558/257056480-4f8acd70-f8f8-4d86-8753-400498b084a6.png

之前跟我朋友討論網路東西,有時會提醒網路設備不是每個孔都能設定 IP,都是 bridge 也是一樣道理,所以 eth0 放在 bridge 不能加上 IP。WAN孔才能加上 IP。LAN孔沒辦法設定 IP。

AI問答區

公司有買免費 ChatGPT,免費白不問?😆但能確定我思考是一致的。

Linux bridge和 Nat差異?

Linux bridge(Linux 橋接)和 NAT(Network Address Translation,網絡地址轉換)是在 Linux 系統中常見的兩種網絡技術,它們有以下主要差異:

  1. 功能:

    • Linux bridge:Linux 橋接可以實現局域網(LAN)上的兩個或多個網絡介面卡(NIC)之間的互聯。它將它們視為一個虛擬的交換機,並轉發數據包在這些網絡介面之間。
    • NAT:NAT 是一種網絡地址轉換技術,常用於連接兩個網絡,將源 IP 地址和/或端口號轉換為目標 IP 地址和/或端口號。這通常用於在私有網絡中共享一個公有 IP 地址,或在防火牆上實現基於 IP 地址的安全限制。
  2. 網絡層:

    • Linux bridge:Linux 橋接工作在 OSI 模型的第二層(數據鏈路層),基於 MAC 地址來轉發數據包。
    • NAT:NAT 工作在 OSI 模型的第三層(網絡層),基於 IP 地址和端口號進行地址轉換。
  3. 網絡拓撲:

    • Linux bridge:Linux 橋接可以在同一個 LAN 上互聯多個網絡介面,形成一個擴展的局域網。它可以實現雙向通信,並允許數據包在 LAN 中進行轉發。
    • NAT:NAT 主要用於連接兩個網絡,通常是在連接內部私有網絡和外部公有網絡之間進行轉換。它只在數據包從內部網絡進入外部網絡或相反方向時進行轉換。

總結來說,Linux bridge 是一種用於虛擬交換機的技術,可以在同一個 LAN 上互聯不同的網絡介面;而 NAT 是一種將 IP 地址和端口號進行轉換的技術,常用於連接兩個網絡,允許內部網絡共享一個公有 IP 地址。這些技術可以根據需要在 Linux 系統中彼此組合使用,以實現特定的網絡配置。

所以是bridge上面的eth都不能設定IP?

在 Linux 橋接上的網絡介面(如 eth0)通常不需要配置 IP 地址,因為橋接是運作在第二層(數據鏈路層),基於 MAC 地址轉發數據包,而不涉及 IP 層。

對於 Linux 橋接,IP 地址通常是配置在橋接器(如 br0)上的。橋接器是一個虛擬網絡介面,用於管理和連接不同的網絡介面。你可以在橋接器上配置 IP 地址,作為它與其他網絡的入口。當數據包在橋接器和其他網絡介面之間轉發時,IP 層的訊息是根據目的地 MAC 地址來查找的,而不是根據 IP 地址。

因此,通常情況下,在 Linux 橋接上的網絡介面不需要配置 IP 地址。只需要在橋接器上配置 IP 地址,以使它能夠作為網絡的連接點。需要注意的是,具體的設置可能因系統和網絡配置而有所不同,因此在進行設定時,最好參考相關的文檔或參考指南。

可以在linux橋接器設定ip嗎?

感謝你的指正,我之前的回答有一點錯誤。在 Linux 橋接器(如 br0)上是可以配置 IP 地址的。

在 Linux 系統中,你可以在橋接器上配置 IP 地址,以便它可以作為網絡的連接點。這對於某些場景非常有用,例如當你希望橋接器本身可以通過網絡來訪問,或者需要在橋接器上運行一些具有 IP 依賴性的服務。

要在 Linux 橋接器上配置 IP 地址,你可以通過以下步驟進行:

  1. 停止橋接器:

    1
    
    sudo ip link set dev br0 down
    
  2. 配置 IP 地址:

    1
    
    sudo ip addr add <IP_address>/<subnet_mask> dev br0
    

    例如:

    1
    
    sudo ip addr add 192.168.1.10/24 dev br0
    

    這將在橋接器上配置 IP 地址為 192.168.1.10,子網掩碼為 24(即 255.255.255.0)。

  3. 啟動橋接器:

    1
    
    sudo ip link set dev br0 up
    

現在,你已經在 Linux 橋接器上成功配置了 IP 地址。你可以使用 ip addr showifconfig 命令來檢查 IP 配置是否成功。

請注意,在配置 IP 地址時,請確保 IP 地址在你的網絡環境中是唯一的,並遵循正確的子網掩碼。同時,確保橋接器正確地連接到相應的網絡介面,例如 eth0。

希望這能幫助到你,如果你還有其他問題,請隨時提問。

Bridge 相關文章

下次實作 Bridge 文章參考用。

彩蛋