開始輸入,可搜尋發票、服務、域名、工單,以及 更多...
當獨立伺服器上的公網 IP 不夠分配,或者某些虛擬機器(資料庫、內部測試機、構建機)根本不需要公網 IP 時,最實用的做法就是給 Proxmox VE 配置 NAT 網路:新建一個不繫結物理網絡卡的 vmbr1 網橋作為內網,宿主機通過 iptables MASQUERADE 讓虛擬機器共享宿主機的公網 IP 上網,再用 DNAT 埠轉發把需要對外的埠對映進來。本文適用於 Proxmox VE 7.x / 8.x(基於 Debian),虛擬機器系統示例覆蓋 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux。
修改網路前先備份 /etc/network/interfaces,並確認預設路由走的是哪個網橋。遠端操作時寫錯配置可能導致宿主機失聯,建議準備好 IPMI/KVM 控制臺或聯絡客服協助。
cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ip -br addr
ip route | grep default
在 /etc/network/interfaces 末尾追加下面的 vmbr1 段落。bridge-ports none 表示它不連線任何物理網絡卡,是一個純內部交換機;post-up 中開啟 IPv4 轉發,並對來自 10.10.10.0/24、從 vmbr0 出去的流量做源地址偽裝(MASQUERADE)。
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
儲存後應用配置,並把 IP 轉發寫入 sysctl,保證重啟後依然生效:
ifreload -a
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-ip-forward.conf
sysctl --system
ip addr show vmbr1
iptables -t nat -S POSTROUTING
也可以在 PVE 網頁後臺“節點 → 系統 → 網路 → 建立 → Linux Bridge”中新增 vmbr1,但 MASQUERADE 規則仍需在配置檔案裡手動加入。
在虛擬機器的“硬體 → 網路裝置”中把網橋改為 vmbr1(或新增一塊 vmbr1 網絡卡),然後在虛擬機器系統內設定 10.10.10.x 的靜態地址,閘道器指向 10.10.10.1。不同發行版寫法如下:
# Debian (/etc/network/interfaces inside the VM)
auto ens18
iface ens18 inet static
address 10.10.10.101/24
gateway 10.10.10.1
dns-nameservers 1.1.1.1 8.8.8.8
# Ubuntu (/etc/netplan/50-nat.yaml, then: netplan apply)
network:
version: 2
ethernets:
ens18:
addresses: [10.10.10.102/24]
routes:
- to: default
via: 10.10.10.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
# CentOS / Rocky / AlmaLinux 8/9
nmcli con mod ens18 ipv4.method manual ipv4.addresses 10.10.10.103/24 \
ipv4.gateway 10.10.10.1 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli con up ens18
# test from the VM
ping -c 3 10.10.10.1
ping -c 3 1.1.1.1
能 ping 通 1.1.1.1 說明 NAT 出網已經正常;如果 ping 得通 IP 但域名無法解析,檢查 DNS 設定。
NAT 虛擬機器預設無法被外部主動訪問。需要遠端 SSH 或提供網站時,在宿主機上新增 DNAT 規則,把公網 IP 的某個埠轉發到內網虛擬機器的埠:
# public port 2201 -> VM 10.10.10.101:22 (SSH)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
# public port 8080 -> VM 10.10.10.102:80 (HTTP)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.102:80
iptables -t nat -L PREROUTING -n --line-numbers
直接執行的 iptables 命令重啟後會丟失。推薦兩種持久化方式任選其一:把規則寫入 vmbr1 的 post-up/post-down(與網橋同生命週期,最清晰),或者安裝 iptables-persistent 儲存當前規則。如果你在這些虛擬機器上啟用了 PVE 自帶防火牆,還需加上 conntrack zone 規則,否則 NAT 回包可能異常。
# Option A: add to the vmbr1 block in /etc/network/interfaces
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
# only if the Proxmox firewall is enabled on these VMs:
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
# Option B: save the current rules with iptables-persistent
apt update && apt install -y iptables-persistent
netfilter-persistent save
cat /etc/iptables/rules.v4
虛擬機器數量多時,逐臺寫靜態 IP 很麻煩。可以在宿主機安裝 dnsmasq,只監聽 vmbr1,為內網自動分配地址,並用 dhcp-host 為需要埠轉發的虛擬機器固定 IP:
apt install -y dnsmasq
cat > /etc/dnsmasq.d/vmbr1.conf <<'EOF'
interface=vmbr1
bind-interfaces
except-interface=lo
dhcp-range=10.10.10.100,10.10.10.200,255.255.255.0,12h
dhcp-option=option:router,10.10.10.1
dhcp-option=option:dns-server,1.1.1.1,8.8.8.8
# fixed lease for one VM (MAC from: qm config 101 | grep net0)
dhcp-host=BC:24:11:AA:BB:CC,10.10.10.101
EOF
systemctl restart dnsmasq
systemctl status dnsmasq --no-pager
依次檢查:cat /proc/sys/net/ipv4/ip_forward 是否為 1;iptables -t nat -S POSTROUTING 中是否有 MASQUERADE 規則且出口網絡卡名正確;宿主機自身能否訪問外網。
確認 DNAT 規則的 -i 網絡卡是公網網橋 vmbr0;虛擬機器內服務監聽在 0.0.0.0 而不是 127.0.0.1;虛擬機器自身防火牆放行了該埠;若啟用了 PVE 防火牆,記得新增 fwbr+ 的 conntrack zone 規則。
可以。帶公網 IP 的虛擬機器繼續使用 vmbr0,NAT 虛擬機器使用 vmbr1,也可以給同一台虛擬機器同時新增兩塊網絡卡。如需更多公網 IP,可聯絡 IMIDC 客服加購 IP。
如仍無法解決,可提交工單聯絡 IMIDC 7×24 技術支援:https://www.imidc.com/submitticket.php