Scapy on PlanetLab

21

有没有人成功在运行 Fedora 12 的 PlanetLab 节点上使用 Scapy

我知道安全的原始套接字限制,但是似乎只需设置conf.L3socket=L3RawSocket,就可以通过Scapy发送数据包。至于数据包的接收,我无法让Scapy正常工作,所以我只能使用tcpdump

TCPICMP似乎可以正常工作:

  • ICMP回显请求会收到回显回复
  • 生存时间(TTL)较低的 ICMP 回显请求会收到超时消息
  • TCP SYN 数据包会收到 TCP RST 数据包
  • 生存时间(TTL)较低的 TCP 数据包会收到超时消息

UDP则不行:

  • 发送到关闭端口的 UDP 包会触发一个 ICMP 端口不可达的消息,但这个消息无法回到我的实例。Tcpdump 只看到了 UDP 包。
  • 同样情况也出现在 UDP 包在途中过期的情况下。

有没有其他参数需要设置以便接收这些 ICMP 数据包?


你在节点上有root权限吗? - RyPeck
是的,我使用 sudo python 启动 Python,否则 Scapy 将无法在第 3 层发送任何数据。 - Ricky Robinson
只是为了明确 - 您希望Scapy接收并处理ICMP数据包吗? - RyPeck
不,我实际上更喜欢使用 tcpdump 收集时间戳。我遇到的问题是,当我用 scapy 发送 UDP 数据包时,与这些数据包相关的 ICMP 消息无法返回到我的切片。这意味着在节点级别将入站数据包与切片匹配的机制无法将这些 ICMP 数据包分配给我的 UDP 数据包并将它们交付给我。令人惊讶的是,我可以发送 TCP 和 ICMP 并得到所有相关的回复,但对于 UDP 却不起作用。 - Ricky Robinson
1个回答

1

不确定这是否有帮助,但根据我的经验,在scapy中接收数据包,您必须使用sr或sr1方法:

sr1(IP(dst="192.168.1.8")/UDP(dport=60112))

开始发送: ...已发送1个数据包。 收到4个数据包,获得1个答案,剩余0个数据包。

<IP  version=4L ihl=5L tos=0xc0 len=56 id=47804 flags= frag=0L ttl=64 proto=icmp chksum=0x6274 src=192.168.1.8 dst=192.168.1.2 options='' |<ICMP  type=dest-unreach code=3 chksum=0x59eb unused=0 |<IPerror  version=4L ihl=5L tos=0x0 len=28 id=1 flags= frag=0L ttl=64 proto=udp chksum=0x1dfc src=192.168.1.2 dst=192.168.1.8 options='' |<UDPerror  sport=domain dport=60112 len=8 chksum=0xb803 |>>>>

sr()函数用于发送数据包和接收答复。函数返回一对数据包和答复以及未回应的数据包。sr1()函数是一种变种,它只返回一个已答复(或已答复的数据包集)的数据包。-来源


是的,我非常清楚scapy中的sr。:) 它只是使用一些在PlanetLab上不直接可用的第3层功能。我可能需要更改一些内部设置,但由于对于rtt测量,scapy的时间戳不太准确,因此我只使用tcpdump。 - Ricky Robinson
啊,我明白了。很抱歉,我不认为我能回答你的问题。或者也许我没有理解这个问题,但据我所知,ICMP响应不能直接映射到UDP数据包,因为UDP数据包没有序列号,它们本质上是不可靠的。所以当你说“与这些数据包相关联的ICMP消息”时,我不确定你的意思是什么。你的知识可能远远超过我的理解。 - Peter Party Bus
与有问题的UDP消息相关的ICMP消息。简单来说,UDP数据包(就像TCP或ICMP数据包一样)可能会导致路由器生成ICMP错误消息。当是TCP数据包生成此类错误消息时,我会收到它。但当是UDP数据包时,我不会收到。 - Ricky Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接