ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
虛擬化與母雞

Proxmox VE NAT 網路配置教程:vmbr1 內網、iptables MASQUERADE 與埠轉發

6 個步驟 11 分鐘閱讀 17 次閱讀 0
本文目錄

當獨立伺服器上的公網 IP 不夠分配,或者某些虛擬機器(資料庫、內部測試機、構建機)根本不需要公網 IP 時,最實用的做法就是給 Proxmox VE 配置 NAT 網路:新建一個不繫結物理網絡卡的 vmbr1 網橋作為內網,宿主機通過 iptables MASQUERADE 讓虛擬機器共享宿主機的公網 IP 上網,再用 DNAT 埠轉發把需要對外的埠對映進來。本文適用於 Proxmox VE 7.x / 8.x(基於 Debian),虛擬機器系統示例覆蓋 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux。

本文假設公網網橋是 vmbr0(PVE 預設安裝即是),內網規劃為 10.10.10.0/24,宿主機內網地址 10.10.10.1。如果你的公網網橋名稱不同,請把命令中的 vmbr0 替換掉。PVE 的安裝與給虛擬機器分配公網 IP,可參考幫助中心已有的“PVE 安裝”和“PVE 虛擬機器分配 IP”教程。

步驟 1:備份 PVE 網路配置並確認公網網橋

修改網路前先備份 /etc/network/interfaces,並確認預設路由走的是哪個網橋。遠端操作時寫錯配置可能導致宿主機失聯,建議準備好 IPMI/KVM 控制臺或聯絡客服協助。

cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ip -br addr
ip route | grep default

步驟 2:建立 vmbr1 NAT 內網網橋並啟用 iptables MASQUERADE

在 /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 規則仍需在配置檔案裡手動加入。

步驟 3:虛擬機器接入 NAT 網路並配置內網 IP

在虛擬機器的“硬體 → 網路裝置”中把網橋改為 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 設定。

步驟 4:用 DNAT 做埠轉發,對外暴露虛擬機器服務

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
不要把宿主機自己正在使用的埠(22、8006 等)轉發出去,否則會導致無法登入宿主機或 PVE 後臺。轉發的埠如果宿主機開啟了防火牆,也要同時放行。

步驟 5:持久化 iptables 埠轉發規則

直接執行的 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

步驟 6(可選):用 dnsmasq 為 NAT 內網提供 DHCP

虛擬機器數量多時,逐臺寫靜態 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
dnsmasq 只繫結 vmbr1,不會向公網網絡卡傳送 DHCP 應答,不會影響機房網路。

常見問題

虛擬機器能 ping 通 10.10.10.1,但無法訪問外網?

依次檢查: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 規則。

NAT 虛擬機器和帶公網 IP 的虛擬機器可以共存嗎?

可以。帶公網 IP 的虛擬機器繼續使用 vmbr0,NAT 虛擬機器使用 vmbr1,也可以給同一台虛擬機器同時新增兩塊網絡卡。如需更多公網 IP,可聯絡 IMIDC 客服加購 IP。

如仍無法解決,可提交工單聯絡 IMIDC 7×24 技術支援:https://www.imidc.com/submitticket.php

這篇文章有幫助嗎?

相關教程