KVM宿主机与反垃圾邮件Guest虚拟机无法通信的问题排查求助
大家好,我最近碰到了一个棘手的网络问题,想请社区的各位大佬帮忙分析排查:
问题核心概述
我有一台运行Postfix邮件服务的KVM宿主机,上面部署了一台作为反垃圾邮件过滤器的Guest虚拟机(我简称它为spamfilter)。目前的问题是:spamfilter虚拟机和宿主机上的Postfix完全无法建立通信。
用tcpdump抓包后发现,虚拟机发出的TCP握手SYN包(包括ICMP请求)会通过VLAN经单臂路由到达宿主机的目标接口,但宿主机完全没有任何回应。看起来数据包是在宿主机内部被丢弃了,我实在找不到原因,想请教大家这可能是什么问题?
网络拓扑与配置细节
先给大家说下我的网络环境:
- 宿主机是Gentoo Linux系统,只有一张物理网卡
enp2s0 - 虚拟机的网络通过网桥
br203承载,宿主机的邮件服务则使用网桥br201 br203和br201分别对应VLAN 203和201,各自配置的网关IP是192.168.203.254和192.168.201.254- 两个VLAN通过trunk链路连接到一台独立的防火墙,并且两者已经可以通过防火墙正常通信(我在防火墙端抓包确认过这一点)
正常的流量路径应该是:
宿主机 > br201接口 > VLAN201 > 防火墙 > VLAN203 > br203 > spamfilter虚拟机
反向路径:spamfilter虚拟机 > br203 > VLAN203 > 防火墙 > VLAN201 > br201接口 > 宿主机
已收集的系统与抓包信息
网卡/网桥配置(ifconfig输出,省略了统计类信息)
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether d4:3d:7e:4f:0c:01 txqueuelen 1000 (Ethernet) RX packets 52464 bytes 29573045 (28.2 MiB) enp2s0.200: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.200.200 netmask 255.255.255.0 broadcast 192.168.200.255 ether d4:3d:7e:4f:0c:c8 txqueuelen 1000 (Ethernet) enp2s0.201: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether d4:3d:7e:4f:0c:01 txqueuelen 1000 (Ethernet) br201: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500 inet 192.168.201.254 netmask 255.255.255.0 broadcast 192.168.201.255 ether d4:3d:7e:4f:0c:c9 txqueuelen 1000 (Ethernet) enp2s0.203: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether d4:3d:7e:4f:0c:01 txqueuelen 1000 (Ethernet) br203: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500 inet 192.168.203.254 netmask 255.255.255.0 broadcast 192.168.203.255 ether d4:3d:7e:4f:0c:cb txqueuelen 1000 (Ethernet) vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether fe:54:00:ef:66:9a txqueuelen 1000 (Ethernet)
Ping测试与tcpdump抓包结果
我执行了从宿主机192.168.201.254(绑定br201接口)ping 192.168.203.254的测试命令:
ping -I br201 192.168.203.254
tcpdump捕获到的一个完整ICMP请求和回复的数据包路径如下:
请求包流转路径:
14:55:54.829736 br201 Out IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829740 enp2s0.201 Out IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829742 enp2s0 Out IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829990 enp2s0 P IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829990 enp2s0.203 P IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829998 vnet0 Out IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64 14:55:54.829990 br203 P IP 192.168.201.254 > 192.168.203.254: ICMP echo request, id 13614, seq 1, length 64
回复包流转路径:
14:55:54.830218 vnet0 P IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830226 enp2s0.203 Out IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830229 enp2s0 Out IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830218 br203 P IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830368 enp2s0 P IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830368 enp2s0.201 P IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64 14:55:54.830368 br201 In IP 192.168.203.254 > 192.168.201.254: ICMP echo reply, id 13614, seq 1, length 64
我的初步推测
从抓包结果来看,回复数据包已经成功到达了宿主机的br201接口,但宿主机就是没有给出响应。我怀疑数据包是在br201接口和接收请求的应用程序之间被丢弃了,而且这种情况似乎只发生在流量来自宿主机路由表内的地址时。
不知道有没有大佬能指点下,这可能是路由规则、iptables策略、网桥配置的问题,还是有其他我没考虑到的点?
备注:内容来源于stack exchange,提问作者boro

