0

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

それでOKのようです。しかし、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

強制的にダミーネットを通過させる方法はありますか?

編集自由に使える別のマシンがあれば、インターネットに入る前に、そこでダミーネットを使用してすべてのトラフィックをそこに向けることができます。ただし、すべてをローカルで行うことを好みます。

4

1 に答える 1

1

Scapy の作成者は、Scapy のメーリング リストで次のように返信してくれました。

この質問と同じ解決策を試してください: http://trac.secdev.org/scapy/wiki/FAQ#Icantping127.0.0.1.Scapydoesnotworkwith127.0.0.1orontheloopbackinterface (raw ソケットを使用)

出来た!上記のリンクの段落は次のとおりです。

127.0.0.1 に ping を実行できません。Scapy は 127.0.0.1 またはループバック インターフェイスでは機能しません

ループバック インターフェイスは非常に特殊なインターフェイスです。それを通過するパケットは、実際には組み立てられたり分解されたりしません。カーネルは、パケットがまだ内部構造に格納されている間に、パケットを宛先にルーティングします。tcpdump -i lo で表示されるものは、すべてが正常であると思わせるための偽物にすぎません。カーネルは、Scapy が背後で何をしているのかを認識していないため、ループバック インターフェイスに表示されるものも偽物です。これを除いて、ローカル構造からのものではありませんでした。したがって、カーネルはそれを受け取りません。

ローカル アプリケーションと通信するには、PF_PACKET/SOCK_RAW (または Linux 以外のシステムでは同等のもの) の代わりに PF_INET/SOCK_RAW ソケットを使用して、1 層上のパケットを構築する必要があります。

>>> 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 |>>
于 2012-08-24T10:32:46.397 に答える