可以看到带有 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
这成功了。
我有一台带 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
这成功了。