【问题标题】:Does Scapy bypass Dummynet?Scapy 会绕过 Dummynet 吗?
【发布时间】:2012-08-23 13:47:28
【问题描述】:

Scapy 是否绕过 Dummynet(一般为 IPFW)?

看起来确实如此。我为每个传出和传入的数据包添加了很大的额外延迟,除了使用 Scapy 发送的数据包之外,一切都变慢了。

$ ipfw add pipe 1 from any to any
$ ipfw pipe 1 config delay 500ms
$ ping www.google.com
PING www.l.google.com (173.194.34.18) 56(84) bytes of data.
64 bytes from par03s02-in-f18.1e100.net (173.194.34.18): icmp_req=1 ttl=54 time=1011 ms
64 bytes from par03s02-in-f18.1e100.net (173.194.34.18): icmp_req=2 ttl=54 time=1010 ms

所以看起来还可以。但是,一旦我使用 Scapy 发送数据包,就会发生以下情况:

>>> from scapy.all import *
>>> p = IP(dst="www.google.com", ttl=1) / TCP(sport=222, dport=2999)
>>> ans,unans = sr(p*3)
>>> ans[0][1].time - ans[0][0].sent_time
0.0002701282501220703  #usual value for such RTT

有没有办法强制它通过dummynet?

编辑如果我有另一台机器可供使用,我可以在那里使用 dummynet 并将我的所有流量引导到它,然后再进入 Internet。不过,我更愿意在本地做所有事情。

【问题讨论】:

    标签: python delay scapy icmp ipfw


    【解决方案1】:

    Scapy 的作者在 Scapy 的邮件列表中回复了我:

    尝试与此问题相同的解决方案: http://trac.secdev.org/scapy/wiki/FAQ#Icantping127.0.0.1.Scapydoesnotworkwith127.0.0.1orontheloopbackinterface (使用原始套接字)

    成功了!这是上面链接中的段落:

    我无法 ping 127.0.0.1。 Scapy 不适用于 127.0.0.1 或环回接口

    loopback接口是一个非常特殊的接口。数据包去 通过它并没有真正组装和拆卸。内核 将数据包路由到其目的地,同时它仍被存储 内部结构。你用 tcpdump -i lo 看到的只是假的 让你觉得一切都很正常。内核不知道什么 Scapy 在背后做事,所以你在环回上看到的 界面也是假的。除了这个不是来自当地 结构体。因此内核永远不会收到它。

    为了与本地应用程序对话,您需要构建自己的 上一层数据包,使用 PF_INET/SOCK_RAW 套接字而不是 PF_PACKET/SOCK_RAW(或 Linux 以外的其他系统上的等效项):

    >>> conf.L3socket
    <class __main__.L3PacketSocket at 0xb7bdf5fc>
    >>> conf.L3socket=L3RawSocket
    >>> sr1(IP(dst="127.0.0.1")/ICMP())
    <IP  version=4L ihl=5L tos=0x0 len=28 id=40953 flags= frag=0L ttl=64 proto=ICMP chksum=0xdce5 src=127.0.0.1 dst=127.0.0.1 options='' |<ICMP  type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多