Proxmox VE中虚拟机非对等路由出站数据包被丢的情况分析

有客户反应,在Proxmox VE中的虚拟机,当一条进站TCP连接的进站方向路由经过隧道,而出站方向是直接走默认路由时,出站的数据包被丢。首先我们怀疑iptables:

# iptables-save | grep INVALID
-A PVEFW-Drop -m conntrack --ctstate INVALID -j DROP
-A PVEFW-FWBR-IN -m conntrack --ctstate INVALID,NEW -j PVEFW-smurfs
-A PVEFW-HOST-IN -m conntrack --ctstate INVALID -j DROP
-A PVEFW-HOST-IN -m conntrack --ctstate INVALID,NEW -j PVEFW-smurfs
-A PVEFW-HOST-OUT -m conntrack --ctstate INVALID -j DROP
-A PVEFW-Reject -m conntrack --ctstate INVALID -j DROP

看来确实配置了conntrack规则,丢掉没有正确建立连接的数据包。但是我们的虚拟机出去到上游路由器是同一个二层,数据包为什么会被丢呢?这就要说到Linux的bridge中有个功能是将所有经过bridge的数据包发给iptables过滤。让我们看看这个功能是否开启:

# sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

果然是开启的。Proxmox VE需要实现VM上的ipset,这个功能是必需的。

那么要解决这一问题,我们只能关闭Proxmox VE防火墙的丢弃INVALID包功能了。根据文档,新建或编辑/etc/pve/nodes/<nodename>/host.fw文件:

[OPTIONS]

nf_conntrack_allow_invalid: 1

然后重新启动防火墙服务以更新规则:

pve-firewall stop
pve-firewall start

参考:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据