2012-10-31 4 views
12

핑 (ping) 시간에 평균을 낼 수있는 scapy 스크립트를 작성하려고하므로 ICMP 에코/응답 패킷과 응답 패킷 사이에 경과 된 시간을 가져와야합니다. 지금, 나는이 있습니다핑 (scapy) 핑 시간은 어떻게 되나요?

#! /usr/bin/env python 
from scapy.all import * 
from time import * 

def QoS_ping(host, count=3): 
    packet = Ether()/IP(dst=host)/ICMP() 
    t=0.0 
    for x in range(count): 
     t1=time() 
     ans=srp(packet,iface="eth0", verbose=0) 
     t2=time() 
     t+=t2-t1 
    return (t/count)*1000 

문제는 시간을 사용() 함수는 좋은 결과를 상승하지 않는다는 것입니다. 예를 들어, 한 도메인에서 134 밀리 초를 찾고 같은 도메인에서 ping 시스템 기능을 사용하면 평균 30 밀리 초를 발견했습니다.

내 질문은 : 정확하게 시간을 elpased beetween 보내진 패킷과 scapy에 의해받은 패킷을 얻는 방법이 있습니까? futur 패킷 관리를 위해 scapy가 필요하기 때문에 popen() 함수 또는 다른 시스템 호출을 사용하고 싶지 않습니다.

+0

'time.time()'대신'time.clock()'을 사용하면 더 운이 좋을 것입니다. –

+0

'srp' 대신'srp1'을 사용하면 더 잘 작동 할 수도 있습니다. –

+0

Nathan, 당신이 scapy에서하는 일은 대단히 느립니다 ... scapy는 파이썬에서 전체 패킷을 (사용자 공간에서) 파싱합니다. OS 시스템 호출을 사용하는 C 구현과 경쟁 할 수 없습니다. –

답변

6

Scapy는 순수한 파이썬이 사용자 공간에서 전체 패킷을 구문 분석하기 때문에 느립니다 ... it is not all that unusual to hack around scapy's thoughput limitations.

사과와 사과 비교하기 ... 저는 인터넷에 직접 연결되는 이더넷 파이프가있는 제온 서버를 가지고 있지만 트래픽은 매우 가볍습니다. 나는 그것이, 내가 약 60 마이크로 초마다 평균 있어요에 붙어 시스코 라우터에 정상적인 핑 ... scapy ... 또한 밀리 초 단위로 측정에서

[[email protected] ~]$ ping -W 1 -c 3 192.0.2.1 
PING 192.0.2.1 (192.0.2.6) 56(84) bytes of data. 
64 bytes from 192.0.2.1: icmp_req=1 ttl=64 time=0.078 ms 
64 bytes from 192.0.2.1: icmp_req=2 ttl=64 time=0.062 ms 
64 bytes from 192.0.2.1: icmp_req=3 ttl=64 time=0.062 ms 

--- 192.0.2.1 ping statistics --- 
3 packets transmitted, 3 received, 0% packet loss, time 1998ms 
rtt min/avg/max/mdev = 0.062/0.067/0.078/0.010 ms 
[[email protected] ~]$ 

같은 대상을 ... 실행하면

[[email protected] ~]$ sudo python new_ping_ip.py 
Ping: 0.285587072372 
Ping: 0.230889797211 
Ping: 0.219928979874 
AVERAGE 245.468616486 
[[email protected] ~]$ 

Scapy의 결과는 거의 배시 프롬프트 (245.469/0.062)의 기본 핑보다 큽니다 ... 케이블을 직접 연결 했으므로 Cisco 라우터의 케이블 길이는 10 피트 미만입니다.

더 나은 결과를 얻으려면 어떻게해야합니까? 주석에서 언급했듯이, sent_timetime ... Packet.time은 구문 분석 전에 채워집니다 ... 이것은 여전히 ​​쉘의 ping보다 느리지 만 scapy에서 패킷을 캡처하려는 욕망에 도움이 될 수 있습니다.

[[email protected] ~]$ sudo python ping_ip.py 
Ping: 0.000389099121094 
Ping: 0.000531911849976 
Ping: 0.000631093978882 
TOTAL 0.51736831665 
[[email protected] ~]$ 

심지어 Packet.timePacket.sent_time 비록 쉘 호출에 비해 느린 사용하여 샘플을 실행

#! /usr/bin/env python 
from scapy.all import * 

def QoS_ping(host, count=3): 
    packet = Ether()/IP(dst=host)/ICMP() 
    t=0.0 
    for x in range(count): 
     ans,unans=srp(packet,iface="eth0", filter='icmp', verbose=0) 
     rx = ans[0][1] 
     tx = ans[0][0] 
     delta = rx.time-tx.sent_time 
     print "Ping:", delta 
     t+=delta 
    return (t/count)*1000 

if __name__=="__main__": 
    total = QoS_ping('192.0.2.1') 
    print "TOTAL", total 

...

>>> from subprocess import Popen, PIPE 
>>> import re 
>>> cmd = Popen('ping -q -c 3 192.0.2.1'.split(' '), stdout=PIPE) 
>>> output = cmd.communicate()[0] 
>>> match = re.search('(\d+\.\d+)\/(\d+\.\d+)\/(\d+\.\d+)\/(\d+\.\d+)\s+ms', output) 
>>> if not (match is None): 
...  print "Average %0.3f" % float(match.group(1)) 
... else: 
...  print "Failure" 
... 
Average 0.073 
>>> 

ping -q -c 3 3 핑의 요약 출력을 제공 개별 핑이 인쇄되지 않았다.

당신이 나중에 scapy 처리 (쉘 핑 (ping) 호출을 통해) 핑 패킷을 캡처하여 CLI 핑을 실행하기 전에 tcpdump -c <num-packets> -w <filename> icmp and host <host-addr> &를 생성하려면

... 다음 tcpdump에서 PCAP 파일을 읽을 수 scapy의 rdpcap()를 사용합니다. pcap 파일에 캡처 할 패킷 수를 올바르게 계산하십시오.

+0

답변 : 나는 이것을 발견했다 : "보낸 패킷은 sent_time '이고, 응답 된 패킷은'속성 '입니다." http://comments.gmane.org/gmane.comp.security.scapy.general/4385 – user1789326

+0

@ user1789326에서 답변으로 의견을 게시 할 수 있습니다. – jfs

+1

왜 평균 0.29, 0.23, 0.22가 245입니까? – jfs

0

BTW, unbuffered python (파이썬 -u를 사용하여 시작)을 사용하면 파이썬이 버퍼가 덤프를 결정할 때까지 기다리지 않아도 타이밍 정확도가 향상됩니다. 위의 스크립트를 사용하면 내 결과가 0.4 밀리 초에서 0.1 밀리미터 씩 벗어나는 것으로 바뀌 었습니다.

0

마이크, 평균 시간, 변화를 얻기 위하여 단지 작은 수정 :

print "Average %0.3f" % float(match.group(1)) 

로는 :

print "Average %0.3f" % float(match.group(2)) 

이후 (match.group (1)) 최소 시간을 얻을 것이다 언급 된 평균은 아닙니다.