开始输入,可搜索发票、服务、域名、工单,以及 更多...
当独立服务器上的公网 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