有客户反应,在 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 |
参考: