Обходит ли 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.Scapyнеработаетс127.0.0.1илинаобратноминтерфейсепетли (используя необработанные сокеты)

Это сработало! Вот абзац из приведенной выше ссылки:

Я не могу пропинговать 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 |>>
person Ricky Robinson    schedule 24.08.2012