ESC

开始输入,可搜索发票、服务、域名、工单,以及 更多...

搜索... Ctrl+K
虚拟化与母鸡

Proxmox VE NAT 网络配置教程:vmbr1 内网、iptables MASQUERADE 与端口转发

6 个步骤 11 分钟阅读 3 次阅读 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

这篇文章有帮助吗?

相关教程