Scapy заобикаля ли Dummynet?

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 там и да насоча целия си трафик към нея, преди да влезе в интернет. Все пак бих предпочел да правя всичко на място.


person Ricky Robinson    schedule 23.08.2012    source източник


Отговори (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 или на theloopback интерфейса

Интерфейсът за обратна връзка е много специален интерфейс. Пакетите, преминаващи през него, всъщност не се сглобяват и разглобяват. Ядрото маршрутизира пакета до местоназначението му, докато все още се съхранява вътрешна структура. Това, което виждате с 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 |>>
person Ricky Robinson    schedule 24.08.2012