scapy::traceroute设置源ip地址
scapy::traceroute setting source ip address
我有一个设置,其中我的源服务器使用任播地址连接到网络,因此每次我 ping 或跟踪路由到我连接的网络中的任何目的地时,我都需要使用源 ip。
我目前正在尝试使用 scapy 并使用 sr 方法,但是 scapy 中的 traceroute 有一些我需要使用的强大功能。 scapy 中的 traceroute 不像 sr 方法那样采用任何源地址。
有办法解决这个问题吗?或者在 scapy::traceroute 之上是否有任何包装允许我这样做?
检查 Scapy's traceroute
function's code 表明它非常简单,而它的大部分强大功能都在于 TracerouteResult
class 它使用从简单的 sr
调用接收到的结果实例化,从目前的实现可以看出:
@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
因此,您可以以与此处执行的方式类似的方式调用 sr
,但还要使用源地址,并将结果传递给 TracerouteResult
class为了利用其强大的功能。
注意: 可以将等效方法应用于 Scapy's traceroute6
function's code for IPv6。
我有一个设置,其中我的源服务器使用任播地址连接到网络,因此每次我 ping 或跟踪路由到我连接的网络中的任何目的地时,我都需要使用源 ip。
我目前正在尝试使用 scapy 并使用 sr 方法,但是 scapy 中的 traceroute 有一些我需要使用的强大功能。 scapy 中的 traceroute 不像 sr 方法那样采用任何源地址。
有办法解决这个问题吗?或者在 scapy::traceroute 之上是否有任何包装允许我这样做?
检查 Scapy's traceroute
function's code 表明它非常简单,而它的大部分强大功能都在于 TracerouteResult
class 它使用从简单的 sr
调用接收到的结果实例化,从目前的实现可以看出:
@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
因此,您可以以与此处执行的方式类似的方式调用 sr
,但还要使用源地址,并将结果传递给 TracerouteResult
class为了利用其强大的功能。
注意: 可以将等效方法应用于 Scapy's traceroute6
function's code for IPv6。