有客户反应,在Proxmox VE中的虚拟机,当一条进站TCP连接的进站方向路由经过隧道,而出站方向是直接走默认路由时,出站的数据包被丢。首先我们怀疑iptables:
1 2 3 4 5 6 7 |
# 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过滤。让我们看看这个功能是否开启:
1 2 |
# 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
文件:
1 2 3 |
[OPTIONS] nf_conntrack_allow_invalid: 1 |
然后重新启动防火墙服务以更新规则:
1 2 |
pve-firewall stop pve-firewall start |
参考: