看起来确实如此。我为每个传出和传入的数据包添加了一个额外的延迟,并且除了使用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
有没有办法强迫它通过虚拟网络?
编辑如果我只有另外一台机器,我可以在那里使用虚拟网络,并在进入互联网之前将所有流量指向它。不过,我更愿意在当地做一切。
答案 0 :(得分: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或onloopback接口
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 |>>