Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP地址,如下我们通过scapy构造一个路由追踪工具并实现一次追踪。

首先Scapy是如何发包与收包的,看以下案例的演示。

>>> from random import randint
>>>
>>> RandomID=randint(1,65534)
>>> packet = IP(dst="61.135.169.125", ttl=1, id=RandomID) / ICMP(id=RandomID, seq=RandomID) / "hello lyshark"
>>> respon = sr1(packet,timeout=3,verbose=0)
>>>
>>> respon
<IP  version=4 ihl=5 tos=0xc0 len=61 id=14866 flags= frag=0 ttl=64 proto=icmp chksum=0xbc9a src=192.168.1.1 dst=192.168.1.2 |<ICMP  type=time-exceeded code=ttl-zero-during-transit chksum=0xf4ff reserved=0 length=0 unused=None |<IPerror  version=4 ihl=5 tos=0x0 len=33 id=49588 flags= frag=0 ttl=1 proto=icmp chksum=0x4f79 src=192.168.1.2 dst=61.135.169.125 |<ICMPerror  type=echo-request code=0 chksum=0x30c4 id=0xc1b4 seq=0xc1b4 |<Raw  load='hello' |>>>>>

路由追踪原理(参考于互联网):一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发ICMP通知说包超时,这样就能够记录下所经过的第一个路由器的IP。然后将TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个同样,丢包,发通知说包超时了,这样记录下第二个路 由器IP,由此能够一直进行下去,直到这个数据包到达目标主机,由此打印出全部经过的路由器。

将这个过程自动化,就可以完成数据包的跟踪,Python 代码如下所示

from scapy.all import *
from random import randint
import time,ipaddress,threading
from optparse import OptionParserdef ICMP_Ping(addr):RandomID=randint(1,65534)packet = IP(dst=addr, ttl=64, id=RandomID) / ICMP(id=RandomID, seq=RandomID) / "lyshark"respon = sr1(packet,timeout=3,verbose=0)if respon:print("[+] --> {}".format(str(respon[IP].src)))# By: LyShark.com
def TraceRouteTTL(addr):for item in range(1,128):RandomID=randint(1,65534)packet = IP(dst=addr, ttl=item, id=RandomID) / ICMP(id=RandomID, seq=RandomID)respon = sr1(packet,timeout=3,verbose=0)if respon != None:ip_src = str(respon[IP].src)if ip_src != addr:print("[+] --> {}".format(str(respon[IP].src)))else:print("[+] --> {}".format(str(respon[IP].src)))return 1else:print("[-] --> TimeOut")time.sleep(1)if __name__== "__main__":parser = OptionParser()parser.add_option("--mode",dest="mode",help="选择使用的工具模式<ping/trace>")parser.add_option("-a","--addr",dest="addr",help="指定一个IP地址或范围")(options,args) = parser.parse_args()print("By: LyShark.com")# 使用方式: lyshark.py --mode=ping -a 192.168.1.0/24if options.mode == "ping":net = ipaddress.ip_network(str(options.addr))for item in net:t = threading.Thread(target=ICMP_Ping,args=(str(item),))t.start()# 使用方式: lyshark.py --mode=trace -a 8.141.58.64elif options.mode == "trace":TraceRouteTTL(str(options.addr))else:parser.print_help()

追踪探测效果如下:

Python 实现Tracert追踪TTL值相关推荐

  1. Ping TTL值(Time To Live)与Tracert 命令

    使用Ping命令的时候,通常关注的是"时间"这个值,忽略"TTL"这个值.可能不少人认为,"TTL"的值越小越好.相比较的是:如何判断经过的 ...

  2. ping命令和arp命令、ping常见问题解决、TTL值判断操作系统

    基础CMD命令 ipconfig/all //查本地网络配置 ipconfig/displaydns //查看本机缓存的服务器域名 tracert 域名/ip //你的主机到目标主机经过路由器的ip( ...

  3. ping www.baidu.com 中的 TTL值 及其他参数的理解

    TTL含义 "TTL"是生存时间(Time To Live)指定数据包被路由器丢弃之前允许通过的网段数量,作用:放环 防止数据包在网络中不停的循环. TTL 是由发送主机设置的,以 ...

  4. python计算特征的统计值并文本输出

    python计算特征的统计值并文本输出 # 输出统计分位数 df.describe(percentiles=[0.05, 0.25, 0.5, 0.75, 0.95]) featname:A => ...

  5. python pandas DataFrame 替换 NaN 值 和 删除 NaN 所在的行。

    python pandas DataFrame 替换 NaN 值 和 删除 NaN 所在的行. import pandas as pd import numpy as np df1 = pd.Data ...

  6. 域名”A记录,MX记录,CNAME记录,TTL值,URL转发”解释

    域名"A记录,MX记录,CNAME记录,TTL值,URL转发"解释 大家在注册和使用域名的时候都有下面对域名所有的记录存在过疑问罢? 什么是A记录?什么是MX记录?CNAME记录又 ...

  7. Windows服务器修改默认TTL值的方法

    不同的操作系统,它的TTL值是不相同的,默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNI ...

  8. python函数内部返回的值_Python中函数的返回值示例浅析

    前言: 前面我们介绍了简单的介绍了函数和函数的参数,今天我们来说一下Python中函数的返回值. 函数的返回值:函数运算的结果,需要进一步的操作时,给一个返回值return用来返回函数的结果,如果没有 ...

  9. 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值

    DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务).域名系统为Internet上的主机分配域名地址和IP地址.由于网络中的计算机都必 ...

  10. python中布尔型的值_在python中对于bool布尔值的取反操作

    背景 根据公司业务的需求,需要做一个对于mysql数据库的大批量更新.脚本嘛也是干干单单.使用了redis的队列做缓存,可以异步并发的多任务进行更新. 有点难受的地方在于,请求访问时,因为一些网速,速 ...

最新文章

  1. 大火的Apache Spark也有诸多不完美
  2. 一顿关于心智、机器和智能的哲学大餐!!
  3. html图片与周围元素边界5px,css3如何将图像设置为元素周围的边框
  4. maya的颤动怎么做_必看!新手学习MAYA的几个建议
  5. 2019年技术盘点容器篇(二):听腾讯云讲讲踏入成熟期的容器技术 | 程序员硬核评测...
  6. CBOW模型正向传播、矩阵乘积层实现
  7. Python中的解决中文字符编码的问题
  8. 2017.5.5 小朋友的数字 思考记录
  9. Spark(Shuffle)
  10. python静态属性@property、类方法@classmethod、静态方法@staticmethod和普通方法
  11. UmiJS 是一个 react 开发框架
  12. OSPFv3中LSA详解(二)——Router LSA详解
  13. 怎样将short[]数组转换成byte[]数组
  14. DVWA全级别通关教程
  15. java毕业设计_景区旅游信息管理系统
  16. 5类6类7类网线对比_超6类7类8类网线进来挨打 6类线全面测评 网速和传输速率测试...
  17. 任正非讲话稿400篇_任正非讲话稿400余篇分享,最全任正非演讲稿下载
  18. C++ - std::srand
  19. T00LS MSF笔记
  20. Android多屏幕适配之字体大小、行间距和字间距

热门文章

  1. 喵喵玩 v3.8.5
  2. html简单的网页制作
  3. matlab中如何画直方图,用电脑怎么画直方图,如何用matlab画直方图已知频数和组距matl...
  4. AVR单片机(ATmega128)单片机运算乘除法大约所需时间
  5. 华硕Y450拆机清灰、拆下光驱助散热、卸载无用软件
  6. 网络处理器(NP)与图形处理器(GPU)
  7. 视频监控智能分析之火焰检测原理
  8. php留言板制作模板,简单5步,制作wordpress留言板
  9. 杭州有哪些牛批的互联网公司
  10. 新挑战新思路|山石网科互联网企业安全SD-WAN解决方案