分享程式代碼相關筆記
目前文章總數:228 篇
最後更新:2026年 04月 18日
Hyper-V 預設使用 Default Switch (本質上是內部 NAT 網路)
每次電腦重開機時 / 動態網路(主機)浮動變化,這時 DHCP 伺服器重新分配一個隨機網段的 IP 給虛擬機**
EX: 一開始啟動 Ubuntu 虛擬機:
上次虛擬機使用的 IP 與這次 DHCP 分配到的虛擬機 IP 不同,導致無法訪問
因此 : 配置虛擬機固定 IP 可以避免重設定訪問路徑,本篇要解決此問題,提出 3 種方案
| 比較項目 | 方案一:外部交換器 | 方案二:內部交換器 + 固定網段 | 方案三:mDNS (.local) |
|---|---|---|---|
| 核心邏輯 | 虛擬機直接橋接實體網卡,成為區網成員 | 建立一條僅供主機與虛擬機通訊的私有路徑 | 透過名稱服務自動追蹤 IP 位址 |
| IP 來源 | 實體路由器 (如 192.168.1.x) | 手動指定私有網段 (如 192.168.100.x) | 動態追蹤,不論 IP 為何都能透過名稱連線 |
| 存取範圍 | 全區域網路 (手機、平板、同事電腦) | 僅限本機 Windows 與虛擬機交互 | 視基礎網路而定 (iOS/macOS 支援度最高) |
| 網路穩定性 | 中 | 極高 | 高 |
| 網路穩定性補充 | 隨 WiFi 環境變化,換環境需改設定 | 完全不受外部網路環境變動影響 | 即使 IP 變動,名稱依然有效 |
| 應用情境 | 需要展示成果、讓外部裝置連線測試時 | 核心開發期、追求環境一致性、常移動筆電時 | 懶得記 IP 位址,追求快速存取時 |
開啟 Hyper-V -> 先將要設定的虛擬機(Ubuntu)關閉 -> 開啟右側的虛擬機交換器管理員
開啟後 -> 新增虛擬機交換器 -> 外部
回到 Hyper-V -> 選擇 Ubuntu 主機 -> 開啟右側 設定
開啟後 -> 左側 網路介面卡 -> 選擇剛剛建立的 外部虛擬交換器
開啟 Ubuntun 主機 -> 開啟 Netplan 的 Ubuntu 網路卡設定
/etc/netplan/00-installer-config.yaml
開啟後,預設用第一個網路卡,我們要調整該設定
# This is the network config written by 'subiquity'
network:
ethernets:
eth0:
dhcp4: true
version: 2
設定以下配置後保存,可以讓 eth0 : 透過自己的路由器配置固定的網路交換器 IP
# This is the network config written by 'subiquity'
network:
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.68.150/22 # 注意:因為我的機器遮罩是 255.255.252.0,所以是 /22
routes:
- to: default
via: 192.168.68.1 # 這是你的 TP-Link 路由器
nameservers:
addresses: [192.168.68.1, 8.8.8.8]
version: 2
補充:要先從自己的 Windows 作業系統下指令查詢路由器IP
ipconfig/all
並且可以觀察到遮罩為 : 255.255.255.0
保存檔案後,在 Ubuntu 輸入以下 Shell 指令,應用配置結果
sudo netplan apply
重啟後,可以觀察到 eth0 抓到 192.168.68.150 我們配置的 IP
嘗試訪問 Portainer 可以進入 192.168.68.150:9000 的 URL ,我們外部網路交換器已經配置成功
未來可避免重啟電腦導致虛擬機浮動 IP
開啟 Hyper-V -> 先將要設定的虛擬機(Ubuntu)關閉 -> 開啟右側的虛擬機交換器管理員
開啟後 -> 新增虛擬機交換器 -> 內部
新增後 -> 設定名稱、附註 -> 連線類型:內部網路
※這邊範例名稱為 內部網路交換器
回到 Hyper-V -> 選擇 Ubuntu 主機 -> 開啟右側 設定
選擇 新增硬體 -> 網路介面卡 -> 新增
新增後 -> 選擇剛剛新增的 網路介面卡 -> 選擇 虛擬交換器 -> 選擇 Step 2. 建立的虛擬機交換器 (※如圖我們命名的 : 內部網路交換器)
因為 Hyper-V 是基於 Windows 作業系統下的管理虛擬機工具,因此我們要開啟 控制台 -> 網路和共用中心 -> 變更介面卡設定
選擇我們 Step2. 建立的虛擬交換器
依序如圖開啟 -> 網際網路通訊協定第 4 版 (TCP/IPv4) -> 內容 -> 設定參數如下:
使用下列的 IP 位址(S):
IP 位址(I):192.168.100.1
子網路遮罩:255.255.255.0
※IP 位址(I): 可以依照自己所需設定,要避免自己主機上已有使用此IP地址,否則會異常
開啟 Ubuntun 主機 -> 開啟 Netplan 的 Ubuntu 網路卡設定
/etc/netplan/00-installer-config.yaml
開啟後,預設用第一個網路卡,因此我們要再添加第二個網路卡對應
# This is the network config written by 'subiquity'
network:
ethernets:
eth0:
dhcp4: true
version: 2
設定以下配置後保存,可以讓 eth1 : 讀取到內部網卡位址
# This is the network config written by 'subiquity'
network:
ethernets:
eth0:
dhcp4: true
eth1:
addresses:
- 192.168.100.10/24
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2
保存檔案後,在 Ubuntu 輸入以下 Shell 指令,應用配置結果
sudo netplan apply
為了避免 Hyper-V 有時會有緩存異常,因此關閉虛擬機 Ubuntu -> 重啟 Windows 的 Hyper-V
可以觀察到再次開啟虛擬機後,有出現 192.168.100.10 的 IP 位址
嘗試訪問 Portainer 可以進入 192.168.100.10:9000 的 URL ,我們內部網路交換器已經配置成功
未來可避免重啟電腦導致虛擬機浮動 IP
進入 Ubuntu 主機,輸入以下指令安裝 mDNS
sudo apt install avahi-daemon
安裝會需一些時間
安裝完成後,輸入以下指令查詢您的虛擬機名稱
hostname
我這邊出現的是 louis
接著輸入 http://louis.local:9000 可以發現 mDNS 會自動幫我們找到可以訪問的入口
可以變成域名解析的方式訪問內部 Portainer 容器
※不論你的實體網段變成了 192.168.1.x 還是 192.168.68.x,這個 louis.local 永遠都會指向正確的位址。
傳統的 DNS 需要一台「伺服器」來記錄誰是誰,但 mDNS 是透過「廣播」實現的:
當你在 Windows 輸入 louis.local 時,Windows 會對整個區域網路大喊:「誰是 louis.local?」
安裝了 avahi-daemon 的 Ubuntu 聽到後會立刻回應:「是我!我的 IP 現在是 192.168.x.x。」
Windows 收到後就自動幫你連過去了。
詳細流程:
| 1. 開機/設定生效時 | Ubuntu 啟動或執行 netplan apply 後,系統核心(Kernel)會把 eth0 或 eth1 的 IP 準備好。 |
| 2. Avahi 監聽硬體 | avahi-daemon 會持續監控系統的網卡介面。只要它發現 eth1 有了 192.168.100.10,它就會立刻記在心裡。 |
| 3. Avahi 對外宣告 | Avahi 會主動在區域網路中發送封包說:「大家好,我是 louis.local,我的分身分別在 192.168.100.10 和 192.168.68.150。」 |
| 4. Windows 端請求 | 當你在 Windows 輸入 louis.local 時,Windows 其實是發出一個「詢問廣播」。 |
| 5. Avahi 即時回應 | avahi-daemon 聽到廣播後,直接從記憶體抽出的 IP 回傳給 Windows。 |