一、确认公网网关和物理网卡
在 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 是两套独立规则,不能互相代替。
十、新增端口转发模板
只需要修改以下内容:
- 公网端口
- VM IP
- VM 内部端口
- 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 规则存在
十五、注意事项
- 所有命令都在 PVE 宿主机执行,VM 网络测试命令除外。
- 每次新增、删除或修改 iptables 规则后,都要执行:
netfilter-persistent save
- 不要反复执行普通的
iptables -A,否则会产生重复规则。 - 端口转发的 VM 必须使用固定 IP。
- VM 内部防火墙也必须允许对应端口。
- 云服务商或机房防火墙也必须放行公网端口。
- 如果启用了 PVE Firewall,需要同时在 PVE 防火墙中允许对应流量。
dnsmasq下发的是公共 DNS,因此 VM 的 DNS不是必须填写192.168.100.1。- 不要执行以下命令,除非准备清空全部规则:
iptables -F
iptables -t nat -F
- 修改
/etc/network/interfaces前务必备份,远程服务器操作错误可能导致失联。
适用于已经安装好 Debian 13 Trixie amd64,需要在其基础上安装 Proxmox VE 9 的情况。全新服务器优先使用 Proxmox 官方 ISO 安装;在 Debian 上安装主要适合需要自定义磁盘分区的场景。
评论 0
欢迎参与讨论,请保持友善与尊重。