commit 8ede385b70a9d717572b95b2d5ab87085bb82cd7 Author: Arturo Filastò art@fuffa.org Date: Sun Nov 11 12:55:17 2012 +0100
Implement ICMP traceroute test * parametrize max_ttl and timeout * make max_ttl and timeout be included in the report --- nettests/core/traceroute.py | 70 ++++++++++++++++++++++++++++++++++++------ ooni/templates/scapyt.py | 3 +- 2 files changed, 61 insertions(+), 12 deletions(-)
diff --git a/nettests/core/traceroute.py b/nettests/core/traceroute.py index 23f124a..4317a0e 100644 --- a/nettests/core/traceroute.py +++ b/nettests/core/traceroute.py @@ -14,50 +14,100 @@ from scapy.all import * class UsageOptions(usage.Options): optParameters = [ ['backend', 'b', '8.8.8.8', 'Test backend to use'], - ['timeout', 't', 5, 'The timeout for the traceroute test'] + ['timeout', 't', 5, 'The timeout for the traceroute test'], + ['maxttl', 'm', 30, 'The maximum value of ttl to set on packets'] ]
class TracerouteTest(scapyt.BaseScapyTest): name = "Multi Protocol Traceroute Test" author = "Arturo Filastò" - version = 0.1 + version = "0.1.1"
usageOptions = UsageOptions
dst_ports = [22, 23, 80, 123, 443] + def max_ttl_and_timeout(self): + max_ttl = int(self.localOptions['maxttl']) + timeout = int(self.localOptions['timeout']) + self.report['max_ttl'] = max_ttl + self.report['timeout'] = timeout + return max_ttl, timeout
def test_tcp_traceroute(self): + """ + Does a traceroute to the destination by sending TCP SYN packets + with TTLs from 1 until max_ttl. + """ def finished(packets, port): - log.debug("Finished running TCP traceroute test" % port) + log.debug("Finished running TCP traceroute test on port %s" % port) answered, unanswered = packets self.report['hops_'+str(port)] = [] for snd, rcv in answered: - report = {'ttl': snd.ttl, 'address': rcv.src} + report = {'ttl': snd.ttl, + 'address': rcv.src, + 'rtt': rcv.time - snd.time + } + log.debug("%s: %s" % (port, report)) self.report['hops_'+str(port)].append(report)
dl = [] + max_ttl, timeout = self.max_ttl_and_timeout() for port in self.dst_ports: packets = IP(dst=self.localOptions['backend'], - ttl=(1,25),id=RandShort())/TCP(flags=0x2, dport=port) - d = self.sr(packets, timeout=5) + ttl=(1,max_ttl),id=RandShort())/TCP(flags=0x2, dport=port) + d = self.sr(packets, timeout=timeout) d.addCallback(finished, port) dl.append(d) return defer.DeferredList(dl)
def test_udp_traceroute(self): + """ + Does a traceroute to the destination by sending UDP packets with empty + payloads with TTLs from 1 until max_ttl. + """ def finished(packets, port): - log.debug("Finished running udp traceroute test") + log.debug("Finished running UDP traceroute test on port %s" % port) answered, unanswered = packets self.report['hops_'+str(port)] = [] for snd, rcv in answered: - report = {'ttl': snd.ttl, 'address': rcv.src} + report = {'ttl': snd.ttl, + 'address': rcv.src, + 'rtt': rcv.time - snd.time + } + log.debug("%s: %s" % (port, report)) self.report['hops_'+str(port)].append(report) dl = [] + max_ttl, timeout = self.max_ttl_and_timeout() for port in self.dst_ports: packets = IP(dst=self.localOptions['backend'], - ttl=(1,25),id=RandShort())/UDP(dport=port) - d = self.sr(packets, timeout=5) + ttl=(1,max_ttl),id=RandShort())/UDP(dport=port) + d = self.sr(packets, timeout=timeout) d.addCallback(finished, port) dl.append(d) return defer.DeferredList(dl)
+ def test_icmp_traceroute(self): + """ + Does a traceroute to the destination by sending ICMP echo request + packets with TTLs from 1 until max_ttl. + """ + def finished(packets): + log.debug("Finished running ICMP traceroute test") + answered, unanswered = packets + self.report['hops'] = [] + for snd, rcv in answered: + report = {'ttl': snd.ttl, + 'address': rcv.src, + 'rtt': rcv.time - snd.time + } + log.debug("%s" % (report)) + self.report['hops'].append(report) + dl = [] + max_ttl, timeout = self.max_ttl_and_timeout() + packets = IP(dst=self.localOptions['backend'], + ttl=(1,max_ttl),id=RandShort())/ICMP() + d = self.sr(packets, timeout=timeout) + d.addCallback(finished) + return d + + diff --git a/ooni/templates/scapyt.py b/ooni/templates/scapyt.py index c443610..feaf720 100644 --- a/ooni/templates/scapyt.py +++ b/ooni/templates/scapyt.py @@ -48,12 +48,11 @@ class BaseScapyTest(NetTestCase): at layer 3. """ def finished(packets): - log.debug("Got this bullshit") answered, unanswered = packets self.report['answered_packets'] = [] self.report['sent_packets'] = [] for snd, rcv in answered: - log.debug("Writing report %s" % snd) + log.debug("Writing report for scapy test") pkt_report_r = createPacketReport(rcv) pkt_report_s = createPacketReport(snd) self.report['answered_packets'].append(pkt_report_r)