1

I have a setup in which my source server is connected to a network using an anycast address, as a result I need to use source ip every time I ping or traceroute any destination in the network I am connected to.

I am currently experimenting with scapy and using sr methods but traceroute in scapy has some powerful features that I need to use. The traceroute in scapy does not take any source addresss as the sr methods do.

Is there a way around this? Or are there any wrappers on top of scapy::traceroute that allow me to do that?

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
indichimp
  • 1,152
  • 2
  • 13
  • 22

1 Answers1

0

Inspecting Scapy's traceroute function's code reveals that it's pretty straightforward while most of its powerful features lie with the TracerouteResult class it instantiates with the result received from a simple sr invocation, as can be seen by the current implementation:

@conf.commands.register
def traceroute(target, dport=80, minttl=1, maxttl=30, sport=RandShort(), l4 = None, filter=None, timeout=2, verbose=None, **kargs):
    """Instant TCP traceroute
traceroute(target, [maxttl=30,] [dport=80,] [sport=80,] [verbose=conf.verb]) -> None
"""
    if verbose is None:
        verbose = conf.verb
    if filter is None:
        # we only consider ICMP error packets and TCP packets with at
        # least the ACK flag set *and* either the SYN or the RST flag
        # set
        filter="(icmp and (icmp[0]=3 or icmp[0]=4 or icmp[0]=5 or icmp[0]=11 or icmp[0]=12)) or (tcp and (tcp[13] & 0x16 > 0x10))"
    if l4 is None:
        a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport),
                 timeout=timeout, filter=filter, verbose=verbose, **kargs)
    else:
        # this should always work
        filter="ip"
        a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/l4,
                 timeout=timeout, filter=filter, verbose=verbose, **kargs)

    a = TracerouteResult(a.res)
    if verbose:
        a.show()
    return a,b

Therefore, you may invoke sr in a similar manner to that performed here, but with a source address as well, and pass on the result to the TracerouteResult class in order to make use of its powerful features.

NOTE: an equivalent approach can be applied to Scapy's traceroute6 function's code for IPv6.

Yoel
  • 9,144
  • 7
  • 42
  • 57