首頁

目前文章總數:228 篇

  

最後更新:2026年 04月 18日

0027. Hyper-V 虛擬機器 - 固定 IP 的 3 種方案 (解決 DHCP 伺服器重新分配一個隨機網段的 IP 問題)

日期:2026年 04月 18日

標籤: Linux Ubuntu Docker C# Docker-Compose Container

摘要:資訊筆記


應用所需:1. 已安裝 Hyper-V
     2. 已安裝 VM 作業系統 (本篇範例使用 Ubuntu 22.04 LTS)
解決問題:每次電腦重新開機後,Hyper-V 上的 IP 都會被 DHCP 伺服器重新分配一個虛擬主機的 IP ,配置虛擬機固定 IP 可以避免重設定訪問路徑
基本介紹:本篇分為 4 大部分。
第一部分:問題描述
第二部分:方案一:建立「外部虛擬交換器」
第三部分:方案二:建立「內部交換器」+ 固定網段
第四部分:方案三:使用內部 mDNS ( .local 網域名稱 )






第一部分:問題描述

Step 1:Hyper-V 虛擬機 IP 浮動

Hyper-V 預設使用 Default Switch (本質上是內部 NAT 網路)
每次電腦重開機時 / 動態網路(主機)浮動變化,這時 DHCP 伺服器重新分配一個隨機網段的 IP 給虛擬機**
EX: 一開始啟動 Ubuntu 虛擬機:


上次虛擬機使用的 IP 與這次 DHCP 分配到的虛擬機 IP 不同,導致無法訪問


因此 : 配置虛擬機固定 IP 可以避免重設定訪問路徑,本篇要解決此問題,提出 3 種方案



Step 2:三種方案差異

比較項目 方案一:外部交換器 方案二:內部交換器 + 固定網段 方案三:mDNS (.local)
核心邏輯 虛擬機直接橋接實體網卡,成為區網成員 建立一條僅供主機與虛擬機通訊的私有路徑 透過名稱服務自動追蹤 IP 位址
IP 來源 實體路由器 (如 192.168.1.x) 手動指定私有網段 (如 192.168.100.x) 動態追蹤,不論 IP 為何都能透過名稱連線
存取範圍 全區域網路 (手機、平板、同事電腦) 僅限本機 Windows 與虛擬機交互 視基礎網路而定 (iOS/macOS 支援度最高)
網路穩定性 極高
網路穩定性補充 隨 WiFi 環境變化,換環境需改設定 完全不受外部網路環境變動影響 即使 IP 變動,名稱依然有效
應用情境 需要展示成果、讓外部裝置連線測試時 核心開發期、追求環境一致性、常移動筆電時 懶得記 IP 位址,追求快速存取時





第二部分:方案一:建立「外部虛擬交換器」

Step 1:虛擬機設定

開啟 Hyper-V -> 先將要設定的虛擬機(Ubuntu)關閉 -> 開啟右側的虛擬機交換器管理員


Step 2:虛擬機設定 - 新增虛擬機交換器

開啟後 -> 新增虛擬機交換器 -> 外部


Step 3:虛擬機設定 - 設定 Ubuntu 網路

回到 Hyper-V -> 選擇 Ubuntu 主機 -> 開啟右側 設定


Step 4:虛擬機設定 - 虛擬機網路交換器設定

開啟後 -> 左側 網路介面卡 -> 選擇剛剛建立的 外部虛擬交換器


Step 5:虛擬機 - 開啟 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




Step 6:虛擬機 - 替換成以下設定

設定以下配置後保存,可以讓 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


Step 7:虛擬機 - 應用設定

保存檔案後,在 Ubuntu 輸入以下 Shell 指令,應用配置結果

sudo netplan apply




Step 8:虛擬機 - 關閉並且重啟

重啟後,可以觀察到 eth0 抓到 192.168.68.150 我們配置的 IP


Step 9:驗證成果

嘗試訪問 Portainer 可以進入 192.168.68.150:9000 的 URL ,我們外部網路交換器已經配置成功
未來可避免重啟電腦導致虛擬機浮動 IP





第三部分:方案二:建立「內部交換器」+ 固定網段

Step 1:虛擬機設定

開啟 Hyper-V -> 先將要設定的虛擬機(Ubuntu)關閉 -> 開啟右側的虛擬機交換器管理員


Step 2:虛擬機設定 - 新增虛擬機交換器

開啟後 -> 新增虛擬機交換器 -> 內部


Step 3:虛擬機設定 - 新增虛擬機交換器

新增後 -> 設定名稱、附註 -> 連線類型:內部網路
※這邊範例名稱為 內部網路交換器


Step 4:虛擬機設定 - 設定 Ubuntu 網路

回到 Hyper-V -> 選擇 Ubuntu 主機 -> 開啟右側 設定


Step 5:虛擬機設定 - 新增網路介面卡

選擇 新增硬體 -> 網路介面卡 -> 新增


Step 6:虛擬機設定 - 設定新增的網路介面卡

新增後 -> 選擇剛剛新增的 網路介面卡 -> 選擇 虛擬交換器 -> 選擇 Step 2. 建立的虛擬機交換器 (※如圖我們命名的 : 內部網路交換器)


Step 7:Windows - 開啟網路和共用中心

因為 Hyper-V 是基於 Windows 作業系統下的管理虛擬機工具,因此我們要開啟 控制台 -> 網路和共用中心 -> 變更介面卡設定
選擇我們 Step2. 建立的虛擬交換器


Step 8:Windows - 設定網路和共用中心

依序如圖開啟 -> 網際網路通訊協定第 4 版 (TCP/IPv4) -> 內容 -> 設定參數如下:
使用下列的 IP 位址(S):

IP 位址(I):192.168.100.1
子網路遮罩:255.255.255.0


※IP 位址(I): 可以依照自己所需設定,要避免自己主機上已有使用此IP地址,否則會異常


Step 9:虛擬機 - 開啟 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




Step 10:虛擬機 - 添加第二張內部網卡設定

設定以下配置後保存,可以讓 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




Step 11:虛擬機 - 應用設定

保存檔案後,在 Ubuntu 輸入以下 Shell 指令,應用配置結果

sudo netplan apply




Step 12:Windows - 重啟 Hyper-V

為了避免 Hyper-V 有時會有緩存異常,因此關閉虛擬機 Ubuntu -> 重啟 Windows 的 Hyper-V


Step 13:虛擬機 - 開啟

可以觀察到再次開啟虛擬機後,有出現 192.168.100.10 的 IP 位址


Step 14:驗證成果

嘗試訪問 Portainer 可以進入 192.168.100.10:9000 的 URL ,我們內部網路交換器已經配置成功
未來可避免重啟電腦導致虛擬機浮動 IP





第四部分:方案三:使用內部 mDNS ( .local 網域名稱 )

Step 1:虛擬機 - 安裝 mDNS

進入 Ubuntu 主機,輸入以下指令安裝 mDNS

sudo apt install avahi-daemon


安裝會需一些時間


Step 2:虛擬機 - 查詢 Hostname

安裝完成後,輸入以下指令查詢您的虛擬機名稱

hostname


我這邊出現的是 louis


Step 3:驗證成果

接著輸入 http://louis.local:9000 可以發現 mDNS 會自動幫我們找到可以訪問的入口
可以變成域名解析的方式訪問內部 Portainer 容器
※不論你的實體網段變成了 192.168.1.x 還是 192.168.68.x,這個 louis.local 永遠都會指向正確的位址。


Step 4:mDNS 如何實現

傳統的 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。