一、确认公网网关和物理网卡

在 PVE 宿主机执行:

ip route

示例:default via 103.254.63.1 dev enp3s0

记录以下信息:

  • 公网网卡:enp3s0
  • 公网 IP:103.254.63.80/25
  • 公网网关:103.254.63.1

二、配置 PVE 网络

  • 执行,然后清空内容
nano /etc/network/interfaces
  • 把示例配置内容,修改为你的!
  • 公网网卡:enp3s0
  • 公网 IP:103.254.63.80/25
  • 公网网关:103.254.63.1
auto lo
iface lo inet loopback

# 物理网卡
auto enp3s0
iface enp3s0 inet manual

# 公网桥
auto vmbr0
iface vmbr0 inet static
    address 103.254.63.80/25
    gateway 103.254.63.1
    bridge-ports enp3s0
    bridge-stp off
    bridge-fd 0

# NAT 内网桥
auto vmbr1
iface vmbr1 inet static
    address 192.168.100.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0

应用配置:

ifreload -a

远程操作时建议保留当前 SSH 会话,避免网络配置错误后失联。

检查:

ip -br addr
ip route

应看到:

vmbr0    103.254.63.80/25
vmbr1    192.168.100.1/24

默认路由应为:

default via 103.254.63.1 dev vmbr0

三、开启 IPv4 转发

创建配置:

cat >/etc/sysctl.d/99-pve-forward.conf <<'EOF'
net.ipv4.ip_forward=1
EOF

立即生效:

sysctl --system

检查:

sysctl net.ipv4.ip_forward

应显示:net.ipv4.ip_forward = 1

只需配置一次,重启后自动生效。


四、安装 iptables 持久化工具

apt update
apt install iptables-persistent -y

安装时如询问是否保存当前规则,可以选择:Yes


五、配置内网 NAT 上网

1. 添加 MASQUERADE

先检查规则是否存在,避免重复添加:

iptables -t nat -C POSTROUTING \
  -s 192.168.100.0/24 \
  -o vmbr0 \
  -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING \
  -s 192.168.100.0/24 \
  -o vmbr0 \
  -j MASQUERADE

2. 允许内网访问公网

iptables -C FORWARD \
  -i vmbr1 -o vmbr0 \
  -s 192.168.100.0/24 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT 2>/dev/null || \
iptables -A FORWARD \
  -i vmbr1 -o vmbr0 \
  -s 192.168.100.0/24 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

允许公网返回数据:

iptables -C FORWARD \
  -i vmbr0 -o vmbr1 \
  -d 192.168.100.0/24 \
  -m conntrack --ctstate ESTABLISHED,RELATED \
  -j ACCEPT 2>/dev/null || \
iptables -A FORWARD \
  -i vmbr0 -o vmbr1 \
  -d 192.168.100.0/24 \
  -m conntrack --ctstate ESTABLISHED,RELATED \
  -j ACCEPT

3. 保存规则

netfilter-persistent save

检查:

iptables -t nat -L POSTROUTING -n -v
iptables -L FORWARD -n -v

应看到:

MASQUERADE  all  --  192.168.100.0/24  0.0.0.0/0

检查持久化文件:

grep -E 'MASQUERADE|192\.168\.100' /etc/iptables/rules.v4

六、安装并配置 DHCP

安装:

apt install dnsmasq -y

创建配置文件:

cat >/etc/dnsmasq.d/vmbr1.conf <<'EOF'
interface=vmbr1
bind-dynamic

dhcp-range=192.168.100.10,192.168.100.200,255.255.255.0,12h
dhcp-option=option:router,192.168.100.1
dhcp-option=option:dns-server,223.5.5.5,8.8.8.8
EOF

检查配置:

dnsmasq --test

正常应显示:dnsmasq: syntax check OK

启动并设置开机启动:

systemctl enable --now dnsmasq

重启:

systemctl restart dnsmasq

检查:

systemctl status dnsmasq --no-pager

应显示:Active: active (running)

查看 DHCP 日志:

journalctl -u dnsmasq -n 50 --no-pager

七、给需要端口转发的 VM 固定 IP

端口转发不能长期使用随机 DHCP 地址,必须给 VM 设置固定 IP或 DHCP 地址保留。

查看虚拟机网卡 MAC:

ip link

假设 VM 的 MAC 为:

BC:24:11:AA:BB:CC

固定为:

192.168.100.185

编辑:

nano /etc/dnsmasq.d/vmbr1.conf

加入:

dhcp-host=BC:24:11:AA:BB:CC,192.168.100.185

重新检查并重启:

dnsmasq --test
systemctl restart dnsmasq

在 VM 内重新获取 DHCP 地址,或者重启 VM。


八、添加 TCP 端口转发

示例:

  • 公网端口:25701
  • VM IP:192.168.100.185
  • VM 端口:2002
  • 协议:TCP

1. 添加 DNAT

iptables -t nat -C PREROUTING \
  -i vmbr0 \
  -p tcp \
  --dport 25701 \
  -j DNAT \
  --to-destination 192.168.100.185:2002 2>/dev/null || \
iptables -t nat -A PREROUTING \
  -i vmbr0 \
  -p tcp \
  --dport 25701 \
  -j DNAT \
  --to-destination 192.168.100.185:2002

2. 允许公网访问 VM

iptables -C FORWARD \
  -i vmbr0 -o vmbr1 \
  -p tcp \
  -d 192.168.100.185 \
  --dport 2002 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT 2>/dev/null || \
iptables -A FORWARD \
  -i vmbr0 -o vmbr1 \
  -p tcp \
  -d 192.168.100.185 \
  --dport 2002 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

返回流量已经由前面的通用规则允许:

vmbr1 → vmbr0,ESTABLISHED,RELATED

因此通常不需要再为每个端口单独添加返回规则。

保存:

netfilter-persistent save

检查:

iptables -t nat -L PREROUTING -n -v --line-numbers
iptables -L FORWARD -n -v --line-numbers

九、添加 UDP 端口转发

如果服务使用 UDP,需要单独添加 UDP 规则。

示例:

iptables -t nat -A PREROUTING \
  -i vmbr0 \
  -p udp \
  --dport 25701 \
  -j DNAT \
  --to-destination 192.168.100.185:2002
iptables -A FORWARD \
  -i vmbr0 -o vmbr1 \
  -p udp \
  -d 192.168.100.185 \
  --dport 2002 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

保存:

netfilter-persistent save

TCP 和 UDP 是两套独立规则,不能互相代替。


十、新增端口转发模板

只需要修改以下内容:

  1. 公网端口
  2. VM IP
  3. VM 内部端口
  4. TCP 或 UDP

TCP 模板:

PUBLIC_PORT=25701
VM_IP=192.168.100.185
VM_PORT=2002

iptables -t nat -A PREROUTING \
  -i vmbr0 \
  -p tcp \
  --dport "$PUBLIC_PORT" \
  -j DNAT \
  --to-destination "$VM_IP:$VM_PORT"

iptables -A FORWARD \
  -i vmbr0 -o vmbr1 \
  -p tcp \
  -d "$VM_IP" \
  --dport "$VM_PORT" \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

netfilter-persistent save

十一、删除端口转发规则

方法一:按完整规则删除

删除 DNAT:

iptables -t nat -D PREROUTING \
  -i vmbr0 \
  -p tcp \
  --dport 25701 \
  -j DNAT \
  --to-destination 192.168.100.185:2002

删除 FORWARD:

iptables -D FORWARD \
  -i vmbr0 -o vmbr1 \
  -p tcp \
  -d 192.168.100.185 \
  --dport 2002 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

保存:

netfilter-persistent save

方法二:按行号删除

先查看行号:

iptables -t nat -L PREROUTING -n -v --line-numbers
iptables -t nat -L POSTROUTING -n -v --line-numbers
iptables -L FORWARD -n -v --line-numbers

例如删除 PREROUTING 第 3 条:

iptables -t nat -D PREROUTING 3

例如删除 FORWARD 第 5 条:

iptables -D FORWARD 5

每删除一条,行号都会重新排列,必须重新查看后再继续删除。

删除后保存:

netfilter-persistent save

十二、检查所有规则

查看 NAT:

iptables -t nat -L -n -v --line-numbers

查看转发:

iptables -L FORWARD -n -v --line-numbers

查看持久化规则:

cat /etc/iptables/rules.v4

检查公网端口:

ss -lntup

VM 内检查目标服务是否监听:

ss -lntup | grep 2002

目标服务必须监听:

0.0.0.0:2002

或者:

192.168.100.185:2002

如果只监听:

127.0.0.1:2002

公网端口转发无法访问。


十四、重启后检查

PVE 重启后执行:

ip -br addr
sysctl net.ipv4.ip_forward
systemctl is-active dnsmasq
systemctl is-enabled dnsmasq
iptables -t nat -L -n -v
iptables -L FORWARD -n -v

正常状态:

vmbr0 公网 IP 正常
vmbr1 为 192.168.100.1/24
net.ipv4.ip_forward = 1
dnsmasq 为 active
dnsmasq 为 enabled
MASQUERADE 规则存在
DNAT 规则存在
FORWARD 规则存在

十五、注意事项

  1. 所有命令都在 PVE 宿主机执行,VM 网络测试命令除外。
  2. 每次新增、删除或修改 iptables 规则后,都要执行:
netfilter-persistent save
  1. 不要反复执行普通的 iptables -A,否则会产生重复规则。
  2. 端口转发的 VM 必须使用固定 IP。
  3. VM 内部防火墙也必须允许对应端口。
  4. 云服务商或机房防火墙也必须放行公网端口。
  5. 如果启用了 PVE Firewall,需要同时在 PVE 防火墙中允许对应流量。
  6. dnsmasq 下发的是公共 DNS,因此 VM 的 DNS不是必须填写 192.168.100.1
  7. 不要执行以下命令,除非准备清空全部规则:
iptables -F
iptables -t nat -F
  1. 修改 /etc/network/interfaces 前务必备份,远程服务器操作错误可能导致失联。

适用于已经安装好 Debian 13 Trixie amd64,需要在其基础上安装 Proxmox VE 9 的情况。全新服务器优先使用 Proxmox 官方 ISO 安装;在 Debian 上安装主要适合需要自定义磁盘分区的场景。