python scapy traceroute_07python实现traceroute程序

# 这个脚本是实现Linux中traceroute程序的,是探测从咱们这个机器到咱们要探测的IP地址中间都须要通过那些路由。

# 原理:咱们的机器发送UDP高端口的数据包,发送给目的地址,首先设置ttl为1,而后逐次增长,在没有到达咱们的目的IP

# 地址的路由,会发送ICMP的超时报文,而后咱们从中提取IP地址,由于咱们发送的是高端口的报文,到达目的地址的时候,

# 目的地址会发送ICMP的端口不可达报文,这样咱们就探测出从咱们源端口到目的端口的路由。

from scapy.all import *

import struct,re,random

# 跟咱们实现ping程序的想法是同样的,首先构造一个发送一个UDP报文的函数,

# 入参为目的地址,ttl数。

def traceroute_one(dst,ttl_no,dport):

# 定义发包时间。

send_time = time.time()

try:

# 发送一个包,接收一个包。

traceroute_one_reply = sr1(IP(dst=dst, ttl=ttl_no) / UDP(dport=dport) / b'hello world', timeout=1,

verbose=False)

# 判断ICMP包是否是超时回答。

if traceroute_one_reply.getlayer(ICMP).type == 11 and traceroute_one_reply.getlayer(ICMP).code == 0:

# 提取源地址

src_ip = traceroute_one_reply.getlayer(IP).src

# 定义接收时间。

recv_time = time.time()

# 计算时间ms数

mid_time = (recv_time - send_time) * 1000

# 返回。

return 1,src_ip,mid_time

# 这里接接收的是最后一跳。ICMP应该是端口不可达。

elif traceroute_one_reply.getlayer(ICMP).type == 3 and traceroute_one_reply.getlayer(ICMP).code == 3:

# 下边处理是同样的。

src_ip = traceroute_one_reply.getlayer(IP).src

recv_time = time.time()

mid_time = (recv_time - send_time) * 1000

return 2, src_ip, mid_time

except Exception as e:

return None

def traceroute(dst,hops):

# 目的端口从33434开始算起,入参为目的地址,咱们想要查找的路由的条数。

dport = 33434

hop = 0

# 进行循环包。

while hop < hops:

hop += 1

# 这里须要改变端口。

dport += hop

# 发送一个包,获取返回值。

traceroute_result = traceroute_one(dst,hop,dport)

# 若是出现了错误,打印*号。

if traceroute_result == None:

print('*')

# 这里表明中间路由,咱们进行打印信息。

elif traceroute_result[0] == 1:

print("%d %s %4.2fms" % (hop,traceroute_result[1],traceroute_result[2]))

# 最后一个包,为端口不可达,打印信息后,须要退出循环,由于已经到达目的地址了,虽然可能没有达到咱们定义的条数。

elif traceroute_result[0] == 2:

print("%d %s %4.2fms" % (hop, traceroute_result[1], traceroute_result[2]))

break

time.sleep(1)

if __name__ == "__main__":

traceroute('180.101.49.12',10)

# 接下来咱们就能够使用wirshark进行抓包来看一下。

f724989c3cf515751962f71456ab91b2.png

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值