简体   繁体   中英

scapy::traceroute setting source ip address

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?

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM