目标状态:
我希望在 PVE 上创建一个虚拟内网(如10.10.11.0/24),
让虚拟机能访问外网,但不能访问宿主机所在的物理局域网(192.168.1.x),
同时在宿主机上做一个端口转发(例如192.168.1.94:2222 → 10.10.11.2:22),
这样外部设备可以通过端口映射安全连接到内网 VM,而 VM 自身无法反向访问主网。
一、环境概览
- 宿主机:PVE 8.x
- 主网桥
vmbr0:192.168.1.94(外部网段) - 新建内网桥
vmbr1:10.10.11.1/24 - 由于宿主机原本的
vmbr0已使用了10.10.10.1网段,因此新建的内网桥需改用其他网段(例如10.10.11.1/24)以避免冲突。 - 虚拟机:Ubuntu 22.04,IP 为 10.10.11.2
- 目标:
- VM 可上网 ✅
- VM 不可访问 192.168.1.x ✅
- 从外部可通过宿主机
192.168.1.94:2222SSH 到 VM ✅
二、配置 vmbr1
打开宿主机终端,编辑网络配置文件:
nano /etc/network/interfaces
在文件中加入以下配置(或替换原有 vmbr1 段):
auto vmbr1
iface vmbr1 inet static
address 10.10.11.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.11.0/24 -o vmbr0 -j MASQUERADE
post-up iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
post-up iptables -A FORWARD -i vmbr1 -d 192.168.1.0/24 -m state --state NEW -j DROP
post-up iptables -A FORWARD -i vmbr1 -o vmbr0 -j ACCEPT
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to-destination 10.10.11.2:22
post-up iptables -A FORWARD -p tcp -d 10.10.11.2 --dport 22 -j ACCEPT
post-down iptables -t nat -D POSTROUTING -s 10.10.11.0/24 -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to-destination 10.10.11.2:22
post-down iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
post-down iptables -D FORWARD -i vmbr1 -d 192.168.1.0/24 -m state --state NEW -j DROP
post-down iptables -D FORWARD -i vmbr1 -o vmbr0 -j ACCEPT
post-down iptables -D FORWARD -p tcp -d 10.10.11.2 --dport 22 -j ACCEPT
保存并退出,然后执行:
ifreload -a
这一步会自动执行上面的 post-up 规则,生成转发和 NAT。
三、虚拟机网络设置
在虚拟机中(例如 Ubuntu)手动配置 IP:
IP:10.10.11.2
掩码:255.255.255.0
网关:10.10.11.1
DNS:223.5.5.5, 223.6.6.6
如果是 Ubuntu GUI 网络管理器,可按以下方式:
- IPv4 → 手动
- 地址填
10.10.11.2 - 网关填
10.10.11.1 - DNS 填上面的公共 DNS
确认能 ping 通外网(例如 ping 8.8.8.8)。
四、SSH 服务与端口转发
在虚拟机中安装并启动 SSH 服务:
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
确保端口 22 正在监听:
sudo ss -tlnp | grep :22
然后在外部电脑(例如 Mac 或主网内另一台机)测试访问:
ssh -p 2222 user@192.168.1.94
若能连通,即表示端口转发与内网隔离均正常。
五、验证隔离效果
- 在虚拟机中尝试:
ping 192.168.1.1会发现无响应(因为vmbr1 -> 192.168.1.0/24被 DROP)。 - 但仍然可以访问外网:
ping 8.8.8.8 - 外部网络依然可以通过宿主机的端口转发进入 VM。
这就实现了和 Docker 默认 bridge 网络类似的效果:
虚拟机能访问外部互联网,但被彻底隔离出宿主所在的局域网。
六、常见问题
- 如果修改后
ssh -p 2222仍然超时,请确认:ifreload -a是否执行;iptables -L FORWARD -n -v中是否有允许规则;- VM 的 SSH 服务是否开启;
- 你的测试主机确实在
192.168.1.x网络内(触发 DNAT)。
七、总结
通过这套配置,PVE 上的虚拟机:
- 可以访问外网;
- 不会反向扫描或访问宿主机所在的 LAN;
- 可通过宿主机端口安全地暴露特定服务(如 2222→22)。
这套做法非常适合:
- 想在家用 PVE 里做「内网沙盒」;
- 或者测试具网络隔离需求的服务(类似 Docker 的 bridge 网络)。