我正在使用一个在客户端和服务器之间发送多播流量的应用程序。该流量通过多播发送。客户端和服务器都使用 VLAN 接口,并且需要在特定 VLAN 上进行通信才能正确地相互通信。客户端和服务器位于同一子网中(因此没有网络跃点),并且它们的 IP 位于同一子网中(因此正在进行的唯一路由是多播从正确的 VLAN 接口发出的路由)。
使用tcpdump
我可以看到来自两台主机的未标记接口上的流量,但如果我查看标记接口,我只能看到本地计算机的流量。我确认进入未标记接口的流量也具有正确的 VLAN 标记。
为了帮助说明这一点,让我们说:
VLAN: 10
Multicast: 239.1.1.1
我看到的是:
[root@client]# tcpdump -ei ens192 host 239.1.1.1
.... vlan 10 ... client.[port] > 239.1.1.1.[port]
.... vlan 10 ... server.[port] > 239.1.1.1.[port]
.... vlan 10 ... client.[port] > 239.1.1.1.[port]
.... vlan 10 ... server.[port] > 239.1.1.1.[port]
另一方也有同样的想法:
[root@server]# tcpdump -ei ens192 host 239.1.1.1
.... vlan 10 ... server.[port] > 239.1.1.1.[port]
.... vlan 10 ... client.[port] > 239.1.1.1.[port]
.... vlan 10 ... server.[port] > 239.1.1.1.[port]
.... vlan 10 ... client.[port] > 239.1.1.1.[port]
但是当我tcpdump
标记接口时:
[root@client]# tcpdump -ei ens192.10 host 239.1.1.1
.... client.[port] > 239.1.1.1.[port]
.... client.[port] > 239.1.1.1.[port]
来自服务器的相同想法。
我试过了sysctl net.ipv4.conf.all.rp_filter=0
没有任何改变。
我还在strace -fe trace=network -p [PID of software] 2>&1 | grep 239.1.1.1
客户端和服务器上运行,并且只send_to
进行了调用,没有收到任何消息(在标记的接口上没有看到传入之后,这是我所期望的)。
我还确认了ip maddr
它ens192.10
已订阅239.1.1.1
,尽管所有其他 VLAN 接口也已订阅,我发现这有点可疑。我确认tcpdump
流量不会进入任何其他 VLAN 接口。我承认我不知道这个软件如何执行订阅,因为我无法访问内部/源代码。
操作系统是RHEL 7.5。
是否有任何原因导致正确标记的 VLAN 流量不会出现在相应的 VLAN 接口上?
编辑:此外,还有其他多播流量在此 VLAN 接口上正常工作,该问题似乎是该软件特有的。
答案1
我不认为你可以在 Linux 上使用这样的tcpdump
子接口(即)。ens192.10
转储特定(或所有)vlan 流量的常用方法是
tcpdump -i ens192 -e vlan 10 and host 239.1.1.1 # just vlan tag 10
tcpdump -i ens192 -e vlan and host 239.1.1.1 # all tagged vlans
或者,如果您的tcpdump
版本不支持该vlan X
语法,您可以将原始标头与
tcpdump -i ens192 -e 'ether[12:2] = 0x8100 and ether[15] = 10' and host 239.1.1.1