2012-08-23 64 views
0

請問Scapy繞行Dummynet(一般IPFW)?Scapy繞過Dummynet嗎?

看起來確實如此。我爲每個傳出和傳入數據包增加了一個很大的額外延遲,並且除了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,並在它進入互聯網之前將所有流量引導到它。不過,我寧願在本地做所有事情。

回答

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或在回放界面上

迴環接口是一個非常特殊的接口。數據包 通過它並不真正組裝和拆散。內核 將數據包路由到它的目的地,同時仍然存儲內部結構 。你用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 |>>