可以看到带有 TCPdump/Wireshark 的多播数据包,但无法在应用程序中接收到它

Can see multicast packets with TCPdump/Wireshark but cannot receive it in application

我有一台带 6 个网卡的 Centos 7 服务器。我有两个连接到不同的局域网 - ens20f3(我的家庭局域网)enp130s0f0(用于访问不同的网络)。我需要读取在 enp130s0f0 上接收到的多播数据包。如果我执行 tcpdump -i enp130s0f0 -n,我可以看到接口正在接收多播数据包。

但是当我尝试在我的测试 python 应用程序中读取数据包时,我无法读取任何内容。我已使用 netstat -gn 检查我是否加入了正确的组。我已禁用 rp_filter。我什至尝试按照 post 中的建议将界面置于混杂模式。我已经在另一台机器上测试了我的 python 应用程序,它工作正常。

MYPORT = 10872
MYGROUP_4 = '239.50.50.72'

import time
import struct
import socket
import sys

def main():
group = MYGROUP_4
# Look up multicast group address in name server and find out IP version
addrinfo = socket.getaddrinfo(group, None)[0]`
# Create a socket
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)

# Allow multiple copies of this program on one machine
# (not strictly needed)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind it to the port
s.bind(('', MYPORT))

group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
# Join group
if addrinfo[0] == socket.AF_INET: # IPv4
    mreq = group_bin + struct.pack('=I', socket.INADDR_ANY)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
else:
    mreq = group_bin + struct.pack('@I', 0)
    s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)

# Loop, printing any data we receive
while True:
    data, sender = s.recvfrom(1500)
    while data[-1:] == '[=11=]': data = data[:-1] # Strip trailing [=11=]'s
    print (str(sender) + '  ' + repr(data))

if __name__ == '__main__':
main()

我的路由table如下:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.230.47.129   0.0.0.0         UG    100    0        0 enp130s0f0
10.230.47.128   0.0.0.0         255.255.255.128 U     100    0        0 enp130s0f0
172.19.0.0      10.230.47.129   255.255.0.0     UG    100    0        0 enp130s0f0
192.168.110.0   0.0.0.0         255.255.255.0   U     100    0        0 ens20f3

tcp 转储输出如下所示:

17:30:24.444744 IP 172.19.250.28.56915 > 239.100.39.25.10225: UDP, length 56

因此条目对应于 172.19.*.*

有什么指示可以解决这个问题吗?

找到了。结果是防火墙阻止了数据包。

service firewalld stop

这成功了。