要想在保持 PVE 防火墙开启(输入策略为 DROP)、并且完全不破坏宿主机 Tailscale 和 Netmaker 策略路由(Table 52)的前提下,让 LXC 容器通过 IPv4 NAT 顺利上网,你需要使用 Proxmox 官方推荐的高级网络隔离方案:Conntrack Zone(连接追踪区域)隔离。
1. 为什么防火墙开启时,IPv4 NAT 会被拦截?
当你在 PVE 中勾选了 LXC 的“防火墙”时,PVE 会在后台为该容器创建一个名叫 fwbr100i0(通配符为 fwbr+)的防火墙专属虚拟网桥。
- 此时,容器出网的流量必须强行通过这个安全网桥。
- 在默认情况下,宿主机的 NAT、Tailscale、Netmaker 以及 PVE 防火墙网桥都共享同一个默认的连接追踪区域(Conntrack Zone 0)。
- 当公网回包经过 NAT 还原并准备送入
fwbr+时,PVE 防火墙的连接追踪在 Zone 0 中与宿主机复杂的策略路由产生了冲突,导致防火墙无法将回包识别为正常的“已建立的连接”(ESTABLISHED),判定其为 INVALID(无效包)并直接在二层静默丢弃。
2. 完美共存的正确设置步骤
通过将 PVE 防火墙网桥的连接追踪单独隔离到 Zone 1,可以完美避开宿主机 Zone 0 里的 NAT 和 Tailscale/Netmaker 干扰。
步骤一:在宿主机配置 Conntrack 区域隔离(核心魔法)
在宿主机上运行以下命令,强制将所有来自 PVE 防火墙网桥(fwbr+)的流量划分到独立的 Conntrack Zone 1:
iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
为了让此规则在宿主机重启后自动生效,请编辑宿主机的网络配置文件 /etc/network/interfaces,在你的内网网桥(vmbr1)配置下方,加入 post-up 和 post-down 钩子:
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
# 核心:每次网桥启动时,自动注入 Conntrack Zone 1 隔离规则
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
步骤二:保留策略路由绕过规则(避开 Table 52)
为了防止 Tailscale / Netmaker 的虚拟路由表 52 劫持 LXC 正常的公网 IPv4 流量,确保宿主机上拥有我们之前添加的高优先级策略路由:
ip rule add from 10.0.0.0/24 lookup main pref 5000 2>/dev/null || true
ip rule add to 10.0.0.0/24 lookup main pref 4999 2>/dev/null || true
(你也可以将这两行以 post-up 的形式写在 /etc/network/interfaces 的 vmbr1 下方实现持久化)
步骤三:保持精准的宿主机 NAT 规则
确保你的 MASQUERADE 规则精准绑定在物理外网卡 vmbr0 上,避免回包在内网网桥中被提前做不正确的 NAT 转换:
# 1. 临时清空可能错乱的 POSTROUTING 链
iptables -t nat -F POSTROUTING
# 2. 限制仅当流量从物理外网卡 vmbr0 发出时,才做 MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE
(同样,建议将此 NAT 规则作为 post-up 写入 /etc/network/interfaces)
步骤四:重新恢复并开启 PVE 防火墙
- 登录 PVE 网页管理端,进入该 LXC 容器 -> 网络 (Network)。
- 双击编辑你的网卡(如
eth0),重新勾选 "Firewall" 启用防火墙,点击保存。 - 进入该容器的 防火墙 -> 选项 (Options),确保输入策略(Input Policy)为 DROP,输出策略(Output Policy)为 ACCEPT。
重启该容器以重新应用 PVE 的防火墙物理网闸:
pct shutdown 100 && pct start 100
3. 最终效果
此时,PVE 防火墙被安全地开启,任何外部主动发往该容器非放行端口的流量依然会被严格 DROP。但由于 Zone 1 的隔离,容器主动发起的连接(如 ping google)其回包能够被 conntrack 完美追踪并识别为 ESTABLISHED 状态,顺利穿过 PVE 的安全网闸放行。同时,宿主机的 Tailscale/Netmaker 完全运行在 Zone 0,两边互不干扰,完美并存!
Proxmox VLAN Isolation with Internet Access (using iptables)
该视频详细介绍了如何在 Proxmox VE 虚拟化环境下,利用 iptables 规则为自定义网桥进行网络隔离并安全配置 NAT 上网,这对于理解 PVE 网桥过滤与防火墙的交互机制非常有帮助。
正确的写法:幂等性(Idempotency)
在 /etc/network/interfaces 中配置 iptables 规则时,黄金法则是“只管自己的规则,绝不影响别人”。
我们需要保证规则是“幂等”的(即:无论执行多少次,都只会有且仅有一条我们的规则,不会重复创建,也不会误删别人的规则)。
推荐的 /etc/network/interfaces 安全写法:
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
# 1. Conntrack Zone 1 隔离(安全防重)
post-up iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1 2>/dev/null || true
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1 2>/dev/null || true
# 2. 策略路由(防止被 Table 52 劫持)
post-up ip rule add from 10.0.0.0/24 lookup main pref 5000 2>/dev/null || true
post-up ip rule add to 10.0.0.0/24 lookup main pref 4999 2>/dev/null || true
post-down ip rule del from 10.0.0.0/24 lookup main pref 5000 2>/dev/null || true
post-down ip rule del to 10.0.0.0/24 lookup main pref 4999 2>/dev/null || true
# 3. 精准 NAT 规则(先删再建,防重复,不影响其他服务)
post-up iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE 2>/dev/null || true
post-up iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE 2>/dev/null || true
💡 核心设计解析:
- **
-D ... 2>/dev/null || true再紧跟-A ...**:
在post-up时,先尝试删除一次我们自己的规则(如果不存在就静默忽略),然后再添加。这样可以确保即使你手动多次重启网卡,iptables 里也永远只有一条干净的规则,不会像滚雪球一样叠加上百条重复规则。 post-down负责收尾:
当网卡关闭时,只精准卸载属于10.0.0.0/24的路由和 NAT 规则,对 Tailscale 和 Netmaker 的规则秋毫无犯。
在 Proxmox VE (PVE) 中,防火墙的设计采用的是三层递进架构。很多管理员在这里容易产生误区(比如以为集群防火墙规则会自动应用到虚拟机上),从而导致配置混乱或安全漏洞。
以下是 PVE 三层防火墙的优先级、逻辑关系,以及如何优雅地避免重复配置的完整指南。
一、 PVE 防火墙三层架构与优先级
PVE 防火墙规则的生效逻辑可以总结为:“主机层层覆盖,虚机各自为战,全局共享定义”。
| 防火墙层级 | 适用范围 / 作用 | 继承与优先级关系 |
|---|---|---|
| 1. 集群 (Datacenter) | 定义全局安全基线。 |
对节点:作为基础规则下发。
对虚拟机/容器:不继承!集群规则不会直接应用到 KVM/CT。
| 2. 节点 (Node) | 保护物理宿主机自身(如限制 SSH 22、WebUI 8006 等管理端口)。 |
|---|
对节点自身:优先级高于集群规则(节点规则会覆盖集群规则)。
对虚拟机/容器:不继承!节点防火墙与虚拟机流量无关。
| 3. 虚拟机/容器 (KVM/CT) | 保护特定的虚拟机或容器。 | 完全独立:每个 VM/CT 都是独立的“网络孤岛”,不继承任何上一级的具体过滤规则。 |
|---|
⚠️ 核心误区提醒:
如果你在集群(Datacenter)级别写了一条
DROP port 80,你的虚拟机依然能正常接收80端口的流量。因为虚拟机的虚拟网口有独立的防火墙过滤策略,它们是不继承上级具体规则的。
二、 如何避免重复设置?
既然 KVM/CT 无法继承集群/节点的规则,如果手下有几十个虚拟机,难道要手动给每个虚拟机去写一堆重复的 Allow HTTP、Allow SSH 规则吗?
不需要。PVE 提供了三个位于 集群(Datacenter) 级别的全局抽象工具,来实现“一次定义,到处套用”。
1. 安全组(Security Groups)—— 规则的“模板化”
安全组是避免重复设置的核心武器。它类似于防火墙规则的“快捷套件”。
怎么做:
- 在 集群 (Datacenter) -> 防火墙 -> 安全组 (Security Group) 中创建一个组,比如叫
Web_Server_Rules。 - 在该组内定义你常用的规则(例如:允许 IN 到端口 80, 443 等)。
- 回到具体的 VM/CT -> 防火墙,点击 “插入:安全组” (Insert: Security Group),选择刚才创建的组并启用。
- 在 集群 (Datacenter) -> 防火墙 -> 安全组 (Security Group) 中创建一个组,比如叫
- 好处:以后若需要增加一个新的规则(如允许
8080),只需在集群级别修改一次该安全组,所有套用了该组的虚拟机防火墙都会自动、瞬间同步更新。
2. 别名(Aliases)—— IP 变更一处修改
如果在防火墙规则里直接硬编码写死 IP 地址,一旦 IP 变更,维护起来就是灾难。
- 怎么做:在 集群 -> 防火墙 -> 别名 (Alias) 中创建别名,比如
DB_Server_IP$\\rightarrow$10.0.0.50。 - 好处:在虚拟机规则或安全组中,源/目的 IP 直接填写该别名。若未来数据库 IP 变更为
10.0.0.99,只需在集群别名里改一次,所有规则自动生效。
3. IP 集合(IPSets)—— 批量授权与黑名单
用于管理“一组 IP 范围”的访问权限。
- 怎么做:在 集群 -> 防火墙 -> IP 集合 (IPSet) 中创建一个集合,比如
Office_IPs。 PVE 特殊内置 IPSet(无需手动调用,系统自动全局匹配):
blacklist:这是一个内置的特权 IP 集合。只要你在这个集合里塞入的恶意 IP,所有节点和所有虚拟机/容器的防火墙都会自动、无条件丢弃(DROP)来自这些 IP 的流量。management:只要创建该 IPSet,里面的 IP 就会自动获得物理宿主机(Node)管理权限(WebUI、SSH、SPICE),其他未列入的外部 IP 会被自动阻断。
三、 推荐的最佳实践配置流
为了保持网络的绝对干净并同时兼容你的 Netmaker / Tailscale 策略路由,推荐采用以下防火墙配置逻辑:
宿主机安全(节点级):
- 仅在 Datacenter -> 防火墙 -> IPSet 中建立一个
management集合,放入你的办公网 IP 或 Tailscale 虚拟网段 IP。 - 开启节点(Node)防火墙。由于
management的存在,只有你信任的 VPN 和内网段可以访问 PVE 的 8006 和 SSH。
- 仅在 Datacenter -> 防火墙 -> IPSet 中建立一个
业务虚拟机(VM/CT 级):
- 在集群端定义好通用的安全组(如
Web_Standard、DB_Access)。 - 为每个 KVM/CT 开启防火墙,并“插入”对应的安全组。
- 对于开启了防火墙且需要通过宿主机 NAT 上网的 LXC 容器,确保在宿主机上配置了我们上一轮排查中使用的
CT --zone 1规则,防止连接追踪(Conntrack)与 Tailscale 策略路由发生冲突。
- 在集群端定义好通用的安全组(如
推荐观看这期 Proxmox 虚拟机安全组配置与防火墙进阶教程,该视频通过实操直观展示了如何使用集群级安全组(Security Groups)来规范和批量保护虚拟机,能有效帮助你避免在多台虚机上重复设置规则。