2022年9月27日 星期二

電腦教室的 bridge 同名之亂

虛擬機通常躲在 host 的後面, 區網的其他機器看不到虛擬機的 IP。 這樣比較安全但也比較不方便。 我在電腦教室要叫學生互相檢查或攻擊同學的虛擬機, 這時就需要用 bridge (橋接器) 把虛擬機提升到跟 host 位於相同的區網。

觀念上來說, 需要做的事包含:

  1. 建立一個虛擬 bridge, 比方說叫做 brext 好了。
  2. 停用 eth0。
  3. 把實體網卡 eth0 接在 brext 底下。
  4. 透過 brext 對外尋求 dhcp 服務。 (Host 的網路又恢復連線。)
  5. 以後虛擬機的網路也都接在 brext 上。

指令上來說先前我用 bridge-utils 套件的 brctl 指令 (教學); 但是在 ubuntu 系列的作業系統裡面, 就必須用把預設的網路管理員 從 network manager 改成 networkd。 最近發現 network-manager 套件裡面有一個附帶的指令 nmcli 也可以 建立和設定 bridge 。 這樣就變得更簡單了: 不管在 ubuntu 系列或是在原生的 debian 系列的作業系統裡面, 採用 nmcli 的話, 就都可以繼續使用內建的 network manager, 而不必切換到 networkd。

但是當我把這樣的設定佈到電腦教室時, 發現了一個嚴重的問題: 教室裡的每一部電腦都有著相同的 mac address 好像一堆複製人連序號都一樣, 網路整個大打結 :-(

解決方法其實很簡單: 不要把上述的動作寫到 cdrom 的 iso 檔或是電腦教室的映像檔裡面, (新版的貴哥實驗室 g22B-lmde-elsie.iso 就是移除了 g22A 版的這個 bug) 而是等到上課時, 才叫學生各自手動建立自己的 bridge。 但是每位同學的 bridge 都要取獨一無二的名字:

nmcli con show
nmcli con add type bridge ifname br97085
nmcli con add type bridge-slave ifname eth0 master br97085
nmcli con up br97085

順帶一提: 用 nmcli 所建立的新連線設定都放在 /etc/NetworkManager/system-connections/ 裡面。 如果直接暴力刪除這裡的檔案再重開機, 效果跟 nmcli con del ... 好像一樣, 到目前為止, 我的系統還沒有因此而爛掉 :-)

在很多部電腦以及不同版本的 linux (mint、 LMDE、 slax、 grml) 測試的結果顯示: 系統如果只安裝 bridge-utils, 那麼用 brctl 指令重複地建立又刪除相同名稱的 bridge, 它的 mac address 都會改變; 但是如果同時安裝了 network-manager, 那麼 brctl 跟 nmcli 這兩個指令都會幫相同名稱的 bridge 產生相同的 mac address, 彷彿是用 bridge 名稱 (加上其他某些幾乎固定的資訊) 計算某種 hash 值去產生 mac address 一樣。 沒力氣研究了, 反正不論是用 brctl 或是 nmcli 指令, 同一個區網內的虛擬 bridge 都不要取相同的名稱就對了。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。