本任务的目标是使用 Scapy 来估计从你的虚拟机到目标的距离,即这之间隔着多少个路由器,这其实就是 traceroute 工具所做的事情。在本任务中,我们将编写自己的工具,实现的办法也较简单。首先,我们向目的地发送一个 IP 数据包(可以是任何类型),将它的生存时间(TTL)字段设置为1。这个包将在第一个路由器处被丢弃,并返回一个 ICMP 错误消息,告诉我们生存时间已经超时。这就是我们获得第一个路由器的 IP 地址的方式。然后我们将 TTL 字段增加到 2,再次发送数据包,这次这个包可以到达第二个路由器,才会被丢弃,我们因此可以获取第二个路由器的 IP 地址。我们将重复此过程直到最终我们的包到达目的地。
需要注意的是,这个实验仅能获得估计结果,因为在理论上,这些包不一定沿着相同的路径行进(但在实践中,在短时间内包走的路径大概率是相同的)。以下代码展示了该过程的一个回合。
a = IP()
a.dst = '1.2.3.4'
a.ttl = 3
b = ICMP()
send(a/b)
如果你是一个经验较丰富的 Python 程序员,你可以编写一个工具自动完成整个过程。如果你对 Python 编程还是是新手,可以通过手动更改每个回合的 TTL 字段并用 Wireshark 获得返回的 ICMP 包。无论哪一种方式都可以接受,只要你能得到结果即可。