我有一台带有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.*.*
我可以找到什么指针来解决这个问题?
答案 0 :(得分:0)
找到它。结果防火墙阻止了数据包。
service firewalld stop
这就是诀窍。