一、确认公网网关和物理网卡
在 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 上网
- 添加 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
- 允许内网访问公网
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
- 保存规则
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
七、添加 TCP 端口转发
示例:
- 公网端口:25701
- VM IP:192.168.100.185
- VM 端口:2002
- 协议:TCP
- 添加 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
- 允许公网访问 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
八、端口转发模板
只需要修改以下内容:
- 公网端口
- 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
删除第一条 DNAT 规则,执行以下命令:
iptables -t nat -D PREROUTING 1
验证结果
iptables -t nat -L PREROUTING -n -v --line-numbers
例如:删除 PREROUTING 第 5和4 条:必须先删序号大的,再删序号小的
iptables -D FORWARD 5
iptables -D FORWARD 4
删除后保存:
netfilter-persistent save
十、注意事项
所有命令都在 PVE 宿主机执行,VM 网络测试命令除外。
每次新增、删除或修改 iptables 规则后,都要执行:
netfilter-persistent save