沒有子網路時,額外 IPv4 怎麼橋到 Proxmox 客體?

每台機器含 1 個 IPv4。這個管理位址留在宿主機,SSH 只用它。客體要自己的公網位址時,按個加購,每個每月 $2,最多再加 255 個。加購的不是一段前綴。客體使用其中一個位址的 /32。一個額外位址都沒有時,只轉送連接埠。

vmbr0 橋接或 NAT,先數位址

常見教學把客體接到 vmbr0,或在宿主機做 NAT。兩種都能把客體開起來。這台機器要先看位址清單。控制台可能把多個位址寫在同一串,以逗號、空白或分號分開。切開以後,第一個是管理位址,SSH 只用這一個。後面的才可以交給客體。

已含的那一個不能同時當宿主機登入位址和客體唯一的公網位址。把它從 vmbr0 挪進客體,宿主機的 SSH 會一起消失。每個額外位址只給一台客體。額外數量是 0 時,客體只持有私網位址,外部從管理位址上的指定連接埠進來,這就是 NAT。有額外位址時,不要把客體直接接到 vmbr0 去共用一段訂單裡沒有的前綴。另建一條不接實體網卡的內部橋,把該位址以 /32 交出來。

vmbr0只留管理位址
/32每一個額外位址
連接埠轉送沒有額外位址時
訂單上的位址客體接在對外方式
只有管理位址內部橋 vmbr1私網位址,由宿主機轉送連接埠
按個加購的 IPv4同一條 vmbr1其中一個公網位址,遮罩 /32
教學裡的 /28 或 /29不要這樣接這張訂單沒有該前綴

位址要分給哪個站點或憑證,見額外位址按個分到業務。這一篇只寫進 Proxmox 客體的路徑。

管理位址留在宿主機

下單時選 Proxmox VE 8 或 Proxmox VE 9。兩份都在系統映像清單裡,交付後直接 SSH 到管理位址。不需要再用 USB 安裝,也不必在安裝程式裡重選網卡。

先讀現況再改檔案。ip -4 addr 裡,SSH 用的位址應在 vmbr0。ip route show default 的 via 是閘道,dev 應為 vmbr0。這組是映像已經寫好的管理設定。前綴不一定是 /32,保持原樣,不要改成教學裡的 /24 或 /28。實體網卡名稱以 /etc/network/interfaces 裡 vmbr0 的 bridge-ports 為準。除非 ip link 確實顯示 eth0 或 ens3,否則不要替換。

額外位址有時已是同一座橋上的別名,有時只出現在交付說明。全域 IPv4 的個數應等於 1 加上訂單的額外數量。少了就先停,用工單核對,不要借用別台機器的位址。數量相符後,把要交給客體的位址從宿主機設定移除,只留管理位址。同一個位址不能同時寫在宿主機別名和客體網卡上,否則入站先到宿主機,客體裡的服務收不到連線。

先不要改 vmbr0 的位址、前綴或閘道。管理位址寫錯,這次 SSH 會斷。控制台裡的圖形接入不依賴這次 SSH,檔案改壞時可以從那裡改回。下面的步驟不改 vmbr0 上的管理位址。

照子網路教學做,客體為何出不去

通用教學假設機房已把一整段前綴放到 vmbr0,閘道是這段的第一個位址,客體從剩下的位址挑一個,遮罩與宿主機相同。客體網卡會顯示已啟動,因為位址已經寫上介面。出站時客體依遮罩認為閘道在同一鏈路,於是送出 ARP。這段前綴在這台機器上並不存在,ARP 沒有回應,預設路由不會生效。從外面看,客體已開機,連接埠卻沒有服務。

另一種寫法把客體接到 vmbr0,位址填額外 IPv4,閘道抄宿主機,遮罩仍寫 /24 或 /28。額外位址是逐個提供的,不是可以再切的前綴。上游把這些位址送到這台機器,而不是送到客體自己的 MAC 去搶閘道。客體在 vmbr0 上的 ARP 到不了真正的下一跳,或者回包仍落在宿主機原來的別名。介面上看得到位址,ping 出不去。

還有一種疊法:宿主機開了來源位址轉換,客體又以為自己持有公網位址。出去的封包被改寫成管理位址,回來的連線對不上客體上的工作階段。要獨立公網位址時,這個額外位址不能再做來源轉換。要轉送連接埠時,客體就不要再設定公網位址。兩種做法不要疊在同一個位址上。

額外位址以 /32 交到內部橋

內部橋命名為 vmbr1。它不接實體網卡,只連接宿主機與客體。加在 /etc/network/interfaces 末尾。私網段可以改,但兩邊必須同一段。若 10.10.10.0/24 已經在用,換成另一段私網。下文的 203.0.113.20 是文件用例,換成訂單裡的某一個額外位址,一個位址一行。

宿主機這一段要有 auto vmbr1、address 10.10.10.1/24、bridge-ports none、bridge-stp off、bridge-fd 0。每個額外位址加一行 post-up ip route add 203.0.113.20/32 dev vmbr1。不要 via 到一個尚未出現的客體位址。路由指向橋本身之後,持有該 /32 的客體會在橋上回應 ARP。

轉送與反向路徑寫進 /etc/sysctl.d/99-guest-route.conf,再執行 sysctl --system。三類設定是 net.ipv4.ip_forward=1、net.ipv4.conf.all.rp_filter=2,以及 vmbr0 與 vmbr1 上同樣的 rp_filter=2。轉送關閉時,宿主機自己到得了客體,客體與外部之間仍然不通。反向路徑維持嚴格模式時,核心會丟掉這種封包:額外位址在客體上,回包卻從 vmbr0 離開,嚴格檢查認為來源不屬於這個出口。寬鬆模式只處理這一項,不代替防火牆。

用 ifreload -a 套用介面檔。套用後在原來的 SSH 再執行一次指令,確認管理位址仍在 vmbr0。ip route get 203.0.113.20 應顯示 dev vmbr1。只在目前工作階段執行 ip route add、沒有寫進檔案,重新開機後路由會消失,客體又會出不去。

客體虛擬網卡在 Proxmox 選橋接 vmbr1,型號用 VirtIO。這裡沒有 NAT 開關。客體系統把該公網位址寫成 /32,對端與預設閘道都是 10.10.10.1。Debian 系介面檔寫 address 203.0.113.20/32、pointopoint 10.10.10.1、gateway 10.10.10.1。Ubuntu 若用 netplan,位址同樣是 /32,預設路由的 via 是 10.10.10.1,並加上 on-link: true。只在 Proxmox 的 Cloud-Init 欄填 /32 和閘道,常常缺少這條直連路由,客體仍會去 ARP 一個不在鏈路上的閘道。寫進客體自己的網路檔,重開客體後再看 ip route。

需要獨立公網位址的客體使用一個額外位址。下一台客體使用下一個額外位址,仍接 vmbr1,再加一條 /32 路由。不要把多台客體配進同一個虛構的 /28。在客體執行 ip route get 1.1.1.1,src 應是該公網位址,而不是 10.10.10.2。來源仍是私網時,外面看到的是管理位址,這一步還沒完成。

這一層不要對該公網位址做來源轉換。來源轉換只留給下一節、沒有額外位址的客體。公網位址已經在客體上時,宿主機只負責轉送。

沒有額外位址時,只轉送連接埠

額外數量是 0 時,不要給客體設定公網位址。vmbr1 仍用 10.10.10.1/24,客體用同一段的一個私網位址,例如 10.10.10.2/24,閘道 10.10.10.1。客體沒有獨立的公網身分。外部要連客體上的服務,就把管理位址上的某一個連接埠轉到這個私網位址。

規則寫在宿主機 vmbr1 的 post-up,重新開機後還在。入站示例:iptables -t nat -A PREROUTING -d 管理位址 -p tcp --dport 443 -j DNAT --to-destination 10.10.10.2:443。出站示例:iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE。Proxmox VE 8 與 9 上,這兩條經 iptables-nft 生效。先用 -C 檢查,已存在就不要再 -A,否則每次 ifreload 都會再疊一條。

不要把管理位址的 TCP 22 轉走,那是宿主機的 SSH。網站、介面或客體自己的遠端桌面使用別的外部連接埠。Windows 客體需要 RDP 時,可以把管理位址上選定的連接埠轉到該客體的 3389,宿主機的 22 保持不動。客體上的服務要聽在私網位址或所有位址。只聽在一個並未設定的公網位址時,轉送過去也沒有行程接收。

連接埠轉送不增加位址,也不提高頻寬。250M、1G、2G 是另一項,三檔都不限流量。十台客體若都從管理位址出去,外面看到的來源仍是這一個。對方白名單若要求每個服務一個來源,就回到上一節按個購買額外位址,而不是在轉送規則裡假裝有一段子網路。

從機房以外核對三次

  1. 管理位址仍能登入

    從辦公室或家裡的網路 SSH 到第一個位址。工作階段應落在宿主機,而不是某一台客體。控制台裡的位址串不要整段貼進 SSH。

  2. 額外位址落在對應客體

    對每個準備啟用的額外位址存取一次實際服務。宿主機上 ip route get 指向 vmbr1。客體上 ip -4 addr 能看到這個 /32。只在宿主機上 curl 自己的位址,常常走本地回環,看不出外部路徑。

  3. 沒有額外位址時核對連接埠

    從外部存取轉送後的連接埠,回應應來自客體。再存取宿主機的 22,回應應仍是宿主機。兩條都通,才算轉送沒有把登入入口換掉。

  4. 重新開機再看一遍

    重新啟動宿主機。管理位址、內部橋、/32 路由或連接埠轉送都應還在。sysctl net.ipv4.ip_forward 應為 1。缺任何一項,就回到介面檔,不要只在這次工作階段補指令。

位址和路由都對、外部仍不通時,再看防火牆。資料中心或節點的防火牆打開時,轉送鏈可能被預設原則丟掉。排查時可以先在這一張客體網卡上關閉防火牆,路徑通了再按連接埠寫允許規則。不要為了省事把整台宿主機的過濾長期清空。

客體裡面的網卡名稱可能是 ens18 或 eth0,以該客體的 ip link 為準。名稱寫錯時位址不會出現,路由指令也不會回報「子網路不存在」。先看介面是否起來,再看預設路由的下一跳是不是 10.10.10.1。

個數和月租一起算

額外 IPv4 每個每月 $2,訂單填的是個數,不是前綴長度。4 個是每月 $8,20 個是每月 $40。加上已含的 1 個,合計不超過 256 個。這些位址與主機、磁碟、頻寬、系統加在同一個月租,再乘週期月數。季繳是月租的 3 倍,半年繳 6 倍,年繳 12 倍,不另打折。無安裝費。

128GB 這一檔月租 $455,已含 1 個 IPv4 和 250M。256GB 這一檔月租 $612,位址規則相同。兩檔都是 AMD EPYC 7543P,32 核 64 執行緒,記憶體是 DDR4-3200 ECC RDIMM。要 256GB 就選那一檔,不能在 128GB 的機器上再加記憶體。記憶體檔不附帶更多位址。頻寬升到 1G 每月加 $248,位址個數不變。

機器部署在日本東京。宿主機登入用 SSH,管理位址在控制台。選了 Windows 的客體使用 RDP,那是客體自己的接入,不替換宿主機的管理位址。Proxmox VE 8 和 9 都在免費系統清單裡,按映像交付,不另做安裝媒介。

額外位址按個橋進客體。

$455 / 月起