Ubuntu 24.04 Minimal Server 在 KVM/Libvirt Default NAT 下的網路排障與 Docker 佈署全紀錄
這篇是我把 Ubuntu 24.04 Minimal Server 放進 KVM/libvirt default NAT 網路時,從「apt update 完全失敗」一路排到「Docker Engine 正常運作」的完整紀錄。
重點不是只給一組指令,而是把每個檢查點都寫清楚,避免之後重建環境又卡在同一個地方。
Host 端虛擬化環境準備(CachyOS)
先在 Host 安裝虛擬化與網路相關套件。
Host:
|
|
用途:
virt-manager:圖形化管理 VM。qemu-desktop:KVM/QEMU hypervisor。libvirt:VM 與虛擬網路管理核心。edk2-ovmf:UEFI 韌體支援。dnsmasq:default NAT會用來做 DHCP/DNS。
啟動服務:
Host:
|
|
把目前使用者加入 libvirt 群組:
Host:
|
|
重新登入後生效。
Ubuntu 24.04 Minimal 安裝時要先勾的項目
在安裝流程中,至少確認:
- IPv4 有啟用。
- IPv6 有啟用。
- 勾選安裝 OpenSSH server。
- 網路模式選
libvirt default NAT。
如果一開始沒裝 OpenSSH server,後面只能先在 VM Console 打指令,操作效率會很差。
Minimal 版本的現實:工具很少是正常現象
安裝完看到下面狀態不用緊張,這就是 Minimal 的設計:
- 沒有
ping。 - 沒有
vim。 - 沒有
nano。 - 沒有
net-tools。 - 通常只有
ip可用。
所以最初排障核心會是 ip addr、ip route、/proc/net/route、/etc/resolv.conf。
問題起點:apt update 失敗
VM:
|
|
典型錯誤:
|
|
這個錯誤表面看起來像 DNS,但實務上常常是「路由 + DNS 同時壞掉」。
關鍵普查:先確認 Host/VM 連接現況再修
先確認 VM 網卡實際名稱
VM:
|
|
要抓到:
- 介面真名(例如
enp0s1、ens1、enp1s0)。 - 不要假設一定叫
eth0。
Ubuntu 24.04 在不同虛擬化平台,命名可能不一樣,指令裡寫錯介面名會讓後續設定全部失效。
IPv6 視覺誤區:看到 inet6 不代表可上網
在 ip addr 中常見情況是:
- 介面有
inet6。 - 卻沒有可用的
inet(IPv4)。
這通常代表 IPv4 DHCP 沒拿到地址,只剩 IPv6 link-local。它是「網路未完整對接」的警訊,不是正常可上網狀態。
檢查 VM 路由是否有 default gateway
VM:
|
|
如果 /proc/net/route 幾乎只剩表頭,或 ip route 沒有 default via ...,就代表 kernel 根本不知道封包要往哪裡送。
檢查 VM DNS
VM:
|
|
如果 nameserver 是空的、無效的,或指向不可達目標,apt 會直接卡在網域解析。
普查 Host 虛擬網橋與 gateway
Host:
|
|
找 virbr* 介面,通常是 virbr0,但名稱不保證固定。
再看它的 IPv4,例如:
|
|
這個位址就是 VM 的 gateway 候選值。
檢查 Host 端 forwarding 與 NAT
檢查 bridge 狀態:
Host:
|
|
檢查 IP forwarding:
Host:
|
|
如果是:
|
|
VM 幾乎不可能透過 Host 出網。
檢查 FORWARD chain:
Host:
|
|
要注意 policy 是否是 DROP,以及是否允許 virbr 封包轉送。
檢查 NAT POSTROUTING:
Host:
|
|
要看到類似:
|
|
沒有 MASQUERADE 的話,VM 即使有 gateway 也常常出不去外網。
Host 端修復(若上述普查不通)
啟用 IP forwarding:
Host:
|
|
把 FORWARD policy 調成 ACCEPT:
Host:
|
|
新增 NAT 規則:
Host:
|
|
重新驗證:
Host:
|
|
VM 端強制手動接通流程
先確認兩件事:
- VM 網卡名,例如
enp1s0。 - Host
virbrIP,例如192.168.122.1。
手動綁 IP:
VM:
|
|
建立同網段路由:
VM:
|
|
加預設閘道:
VM:
|
|
檢查路由:
VM:
|
|
要看到 default via 192.168.122.1 dev enp1s0。
強制注入 DNS:
VM:
|
|
連通測試:
VM:
|
|
只要這一步通了,後續工具與服務安裝就能接上。
SSH 遠端管理:解決 VM Console 不好用
常見痛點是 VM console 無法順暢複製貼上,長指令容易打錯。
先裝核心工具:
VM:
|
|
啟動 SSH:
VM:
|
|
從 Host 連入:
Host:
|
|
之後改用本機終端維運 VM,效率會高很多。
Docker 引擎佈署:選 Docker 官方來源而不是 docker.io
Ubuntu 內建倉庫的 docker.io 可用,但我這次改用 Docker 官方來源,原因是:
- 版本更新通常比較快。
buildx與compose v2插件整合更完整。- 安全更新節奏跟官方同步。
Docker 官方安裝流程(Ubuntu 24.04)
建立 keyring 目錄:
VM:
|
|
導入 Docker GPG:
VM:
|
|
加入 Docker repository:
VM:
|
|
安裝 Docker Engine 與插件:
VM:
|
|
設定免 sudo(目前使用者):
VM:
|
|
驗證:
VM:
|
|
最終驗收清單
Host 端:
libvirtd正常 running。virbr*bridge 存在且有 IPv4。net.ipv4.ip_forward = 1。- FORWARD 鏈可放行 VM 封包。
- NAT 有對 VM 網段做 MASQUERADE。
VM 端:
- 介面有有效 IPv4。
- 路由表有
default via <virbr IP>。 /etc/resolv.conf有可用 nameserver。apt update可成功。- SSH 可登入。
- Docker
hello-world可成功執行。
到這裡就完成「Minimal 初始不可用」到「可維運、可部署容器」的整條路徑。