Traceroute是一种常见的网络工具,用于诊断网络问题,它可以显示从本地计算机到目标计算机之间的通信路线上的所有中间路由器节点。在这篇文章中,我们将使用Python实现一个简单的Traceroute克隆。

首先,我们需要安装Python的scapy模块,它提供了一种实现网络数据包嗅探和生成的工具集。我们可以使用pip命令来安装它。

“`

pip install scapy

“`

接下来,我们需要使用Scapy模块构建和发送ICMP包。使用该模块创建并发送ICMP包,这是跟踪网络时所需的非常重要的一步。以下代码显示了如何使用Scapy模块创建和发送ICMP包。

“`Python

def send_icmp_request(dst):

res, unans = sr(IP(dst=dst, ttl=(1, 4))/ICMP())

return res

“`

我们使用dst参数设置目标IP地址,并将ttl参数设置为1-4,以便我们跟踪路由信息。这将使每个ICMP包被发送到路由上的每个网关,而每个网关将递增其TTL值,并将其转发到下一个网关。最终,我们将收到一个带有“time exceeded”响应代码的ICMP响应。

接下来,我们将解析ICMP响应以获取路由信息。我们仅需要访问响应的源IP地址和TTL字段。

“`Python

def get_route_info(pkt):

route = {“ip”: pkt[IP].src, “ttl”: pkt[IP].ttl}

return route

“`

现在我们有了构建和发送ICMP包以及解析响应的函数,我们只需要将它们结合起来以获得跟踪路由的完整功能。

“`Python

def traceroute(dst, max_hops):

for i in range(1, max_hops+1):

pkt = IP(dst=dst, ttl=i)/ICMP()

res, unans = sr(pkt, timeout=2)

try:

rtt = res[ICMP][0][1].time – res[ICMP][0][0].sent_time

route = get_route_info(res[0][1])

print(f”{i}\t{route[‘ip’]}\t{rtt*1000:.4f} ms”)

except:

print(f”{i}\t*\t*”)

continue

if route[‘ip’] == dst:

break

“`

我们可以使用上述traceroute函数来检查我们的程序是否正常工作。我们可以通过比较结果与最终目标的路由来验证程序的准确性。

总之,使用Python实现Traceroute是一个有用而有趣的问题。通过使用Scapy模块构建和发送ICMP包并解析ICMP响应,可以实现跟踪路由。Traceroute可以帮助我们诊断网络问题,检查数据包从本地计算机到目标计算机的路由路径,定位潜在的延迟或丢包问题。

详情参考

了解更多有趣的事情:https://blog.ds3783.com/