▱ 笔记#PVE

PVE 网络配置:网络桥接、DHCP 与端口转发

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

在 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
  1. 允许内网访问公网
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
  1. 保存规则
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
  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
  1. 允许公网访问 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

八、端口转发模板

只需要修改以下内容:

  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

删除第一条 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