我正在编写一个Python脚本来执行“TCP Traceroute”。我知道scapy是执行此操作的有用库,但是我没有得到所需的结果。谁能帮我解决这个问题?我希望python脚本生成与命令行类似的结果。

我正在使用linux,python 2.7和scapy 2.4。我不确定为什么所有跃点都显示相同的IP地址。

from scapy.layers.inet import traceroute

result, unans = traceroute('172.217.17.46', maxttl=30)
   for snd, rcv in result:
   print snd.ttl, rcv.src, snd.sent_time, rcv.time

当我运行此代码时,我得到以下结果:
1 10.0.2.2 1541113255.58 1541113255.6
2 172.217.17.46 1541113255.58 1541113255.72
3 172.217.17.46 1541113255.58 1541113255.72
4 172.217.17.46 1541113255.58 1541113255.72
5 172.217.17.46 1541113255.59 1541113255.73
6 172.217.17.46 1541113255.59 1541113255.73
7 172.217.17.46 1541113255.6 1541113255.74
8 172.217.17.46 1541113255.6 1541113255.74
9 172.217.17.46 1541113255.6 1541113255.74
10 172.217.17.46 1541113255.61 1541113255.75
11 172.217.17.46 1541113255.61 1541113255.75
12 172.217.17.46 1541113255.61 1541113255.75
13 172.217.17.46 1541113255.62 1541113255.76
14 172.217.17.46 1541113255.62 1541113255.76
15 172.217.17.46 1541113255.62 1541113255.76
16 172.217.17.46 1541113255.62 1541113255.77
17 172.217.17.46 1541113255.63 1541113255.77
18 172.217.17.46 1541113255.63 1541113255.77
19 172.217.17.46 1541113255.63 1541113255.77
20 172.217.17.46 1541113255.63 1541113255.77
21 172.217.17.46 1541113255.64 1541113255.78
22 172.217.17.46 1541113255.64 1541113255.78
23 172.217.17.46 1541113255.64 1541113255.78
24 172.217.17.46 1541113255.64 1541113255.78
25 172.217.17.46 1541113255.65 1541113255.79
26 172.217.17.46 1541113255.65 1541113255.79
27 172.217.17.46 1541113255.65 1541113255.79
28 172.217.17.46 1541113255.66 1541113255.8
29 172.217.17.46 1541113255.66 1541113255.8
30 172.217.17.46 1541113255.66 1541113255.8

我想获得与从命令行运行tcptraceroute时得到的结果相同的结果:tcptraceroute 172.217.17.46

命令行结果:
Selected device en0, address 192.168.86.24, port 49618 for outgoing packets
Tracing the path to 172.217.17.46 on TCP port 80 (http), 30 hops max
 1  192.168.86.1  2.848 ms  1.224 ms  1.330 ms
 2  96.120.101.53  10.423 ms  13.646 ms  12.221 ms
 3  po-115-rur102.bellevue.wa.seattle.comcast.net (68.87.205.245)  18.877 ms  18.818 ms  12.593 ms
 4  be-103-ar01.seattle.wa.seattle.comcast.net (69.139.164.77)  15.188 ms  14.272 ms  14.005 ms
 5  be-33650-cr01.seattle.wa.ibone.comcast.net (68.86.93.165)  14.547 ms  15.273 ms  19.750 ms
 6  be-10846-pe01.seattle.wa.ibone.comcast.net (68.86.86.90)  14.546 ms  14.266 ms  13.521 ms
 7  50.242.150.242  14.159 ms  15.791 ms  14.037 ms
 8  74.125.243.195  14.635 ms  22.377 ms  13.558 ms
 9  72.14.236.174  15.051 ms  27.454 ms  14.312 ms
 10  108.170.235.60  66.430 ms  69.762 ms  68.606 ms
 11  216.239.58.255  85.531 ms  84.354 ms  85.303 ms
 12  172.253.51.157  153.310 ms  154.710 ms  153.375 ms
 13  209.85.142.166  157.376 ms  166.552 ms  157.562 ms
 14  216.239.43.37  170.523 ms  168.040 ms  158.182 ms
 15  108.170.241.225  158.953 ms  161.418 ms  169.103 ms
 16  108.170.236.137  158.561 ms  161.635 ms  157.510 ms
 17  ams16s29-in-f46.1e100.net (172.217.17.46) [open]  165.981 ms  160.451 ms  166.120 ms

Question1:Scapy traceroute功能真的是TCP traceroute吗?
Question2:我对scapy和traceroute是陌生的,代码中明显缺少什么吗?如果scapy不适合,我还可以使用其他库吗?我真的很感谢您的帮助和任何指点。

注意:我想对IPV6和IPV4都执行TCP跟踪路由。

最佳答案

scapy traceroute函数确实是TCP traceroute吗?
是的,它确实可以执行TCP traceroute(以及其他功能)。看看Scapy source-code:



我想对tcpipv6都执行ipv4 traceroute
再次查看Scapy源代码,traceroot6可以完成此工作:



traceroute ipv6的示例代码:



我不确定为什么所有跃点都显示相同的IP地址。

通过在traceroute()函数的l4参数中指定完整的数据包来使用 DNS traceroute ,您不会为所有跃点获得相同的IP地址。



或者,您可以使用 TCP SYN traceroute 获得类似的结果:



或者,您可以创建 IP and UDP packets 来使用traceroute实现Scapy,如下所示:



如果Scapy不适合,我还可以使用其他库吗?

  • checkout webb。我没有使用过,但是您可以像这样使用它:


  • 另外,Thomas Guettler的check out this tcptraceroute
  • 或Addy Yeow(Ayeowch)的此Multi-source traceroute with geolocation实现。
    除其他外,使用-j参数(JSON_FILE),它将以JSON文件格式列出源。
  • 或Christian Kreibich的this implementation。它可以将traceroute信息解析为一系列的跃点对象,每个跃点对象都包含一个或多个探测结果,同样是对象实例。同样,字符串格式会产生熟悉的traceroute输出。 (为了使用Python 3,需要将cStringIO更改为from io import StringIO


  • 不使用 scapy (使用Windows控制台):


    import sys
    from subprocess import Popen
    
    if len(sys.argv) < 2:
        print('Usage: output.py "command to watch"')
        sys.exit(1)
    
    cmd_line = sys.argv[1:]
    
    p = Popen(cmd_line)
    p.communicate()[0]
    





    如果您不希望解析名称,则可以使用tracert -d

    对于OSXLinux以及Python 2.7,您可以使用此parser

    关于python - python中的TCP Traceroute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53112554/

    10-11 11:17