You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:27:41