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

时间:2015-08-25 11:59:15

标签: linux networking multicast

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

但是当我尝试在我的测试python应用程序中读取数据包时,我无法读取任何内容。我已经检查过我使用netstat -gn加入了正确的群组。我已禁用rp_filter。我甚至尝试按照一篇文章的建议将界面置于混杂模式。我已经在不同的机器上测试了我的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:] == '\0': data = data[:-1] # Strip trailing \0's
    print (str(sender) + '  ' + repr(data))

if __name__ == '__main__':
main()

我的路由表如下:

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 dump输出如下所示:

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

因此,对应于172.19.*.*

的条目

我可以找到什么指针来解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

service firewalld stop

这就是诀窍。