使用Scapy发送SSDP发现报文后无法接收响应报文问题排查
排查SSDP发现报文无响应的问题
我来帮你一步步排查这个突然失效的SSDP发现问题,结合你Ubuntu虚拟机+Scapy的场景,从最可能的原因入手:
1. 先检查Scapy的发送函数(最可能的原因)
你当前用的send()函数只负责发送报文,不会监听和接收响应!如果之前能正常获取设备回复,大概率是之前用了sr()或sr1()这类支持接收的函数。
把你的代码改成下面这样,用sr()来发送并监听响应:
from scapy.all import IP, UDP, Raw, sr ssdpPacket = IP(dst="239.255.255.250")/UDP(sport=6700,dport=1900)/Raw(load='M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nST: ssdp:all\r\nMAN: "ssdp:discover"\r\nMX: 2\r\n\r\n') # timeout设为MX值+1,给设备足够的响应时间 responses, unans = sr(ssdpPacket, timeout=3) # 打印所有收到的响应 for req, resp in responses: print("收到设备响应:") print(resp[Raw].load.decode('utf-8', errors='ignore'))
2. 检查Ubuntu虚拟机的网络模式
如果虚拟机用的是NAT模式,组播报文可能无法穿透到物理局域网,或者设备的响应无法回传到虚拟机。建议切换到桥接模式,让虚拟机直接接入你的物理网络,这样组播通信的兼容性更好。
3. 验证网卡的组播接收能力
Ubuntu可能默认禁用了网卡的组播功能,或者没有正确配置组播路由:
- 查看网卡的组播状态:执行
ip link show <你的网卡名>(比如ip link show ens33),检查输出里是否有MULTICAST标志。 - 如果没有,开启组播:
sudo ip link set <你的网卡名> multicast on - 添加组播路由(确保组播报文能到达正确的网卡):
sudo route add -net 239.0.0.0 netmask 255.0.0.0 dev <你的网卡名>
4. 排查防火墙拦截
Ubuntu的ufw或iptables可能拦截了UDP 1900端口的入站响应:
- 临时关闭ufw测试:
sudo ufw disable,如果此时能收到响应,说明是防火墙的问题。 - 重新开启并添加允许规则:
sudo ufw allow in proto udp from any to any port 1900
5. 修正SSDP报文的格式细节
你的报文里的HTTP头有两个小细节不符合规范,虽然部分设备兼容,但可能刚好导致现在无响应:
ST:ssdp:all应该改成ST: ssdp:all(冒号后加空格)MAN:"ssdp:discover"应该改成MAN: "ssdp:discover"(冒号后加空格)
上面的代码示例已经修正了这两个问题。
内容的提问来源于stack exchange,提问作者sammy
相关产品推荐
相关产品推荐

