在 PVE 中创建内网隔离的网桥(类似Docker容器不能访问host所在的网络)
目标状态:

我希望在 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:2222 SSH 到 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

若能连通,即表示端口转发与内网隔离均正常。


五、验证隔离效果

  1. 在虚拟机中尝试: ping 192.168.1.1 会发现无响应(因为 vmbr1 -> 192.168.1.0/24 被 DROP)。
  2. 但仍然可以访问外网: ping 8.8.8.8
  3. 外部网络依然可以通过宿主机的端口转发进入 VM。

这就实现了和 Docker 默认 bridge 网络类似的效果:
虚拟机能访问外部互联网,但被彻底隔离出宿主所在的局域网。


六、常见问题

  • 如果修改后 ssh -p 2222 仍然超时,请确认:
    1. ifreload -a 是否执行;
    2. iptables -L FORWARD -n -v 中是否有允许规则;
    3. VM 的 SSH 服务是否开启;
    4. 你的测试主机确实在 192.168.1.x 网络内(触发 DNAT)。

七、总结

通过这套配置,PVE 上的虚拟机:

  • 可以访问外网;
  • 不会反向扫描或访问宿主机所在的 LAN;
  • 可通过宿主机端口安全地暴露特定服务(如 2222→22)。

这套做法非常适合:

  • 想在家用 PVE 里做「内网沙盒」;
  • 或者测试具网络隔离需求的服务(类似 Docker 的 bridge 网络)。

作 者:motorbottle
链 接: https://blog.motorbottle.site/archives/668
来 源:Motor's Blog
版 权 声 明:本博客所有文章除特别声明(如【转载】)外,均采用CC BY-NC-SA 4.0许可协议。文章版权归作者所有,未经允许请勿转载!


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇