我正在编写一个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:
我想对tcp
和ipv6
都执行ipv4
traceroute
再次查看Scapy
源代码,traceroot6
可以完成此工作:
traceroute ipv6的示例代码:
我不确定为什么所有跃点都显示相同的IP地址。
通过在traceroute()函数的l4参数中指定完整的数据包来使用 DNS traceroute
,您不会为所有跃点获得相同的IP地址。
或者,您可以使用 TCP SYN traceroute
获得类似的结果:
或者,您可以创建 IP and UDP packets
来使用traceroute
实现Scapy
,如下所示:
如果Scapy
不适合,我还可以使用其他库吗?
tcptraceroute
。
除其他外,使用-j
参数(JSON_FILE),它将以JSON文件格式列出源。 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
。
对于OSX
和Linux
以及Python 2.7
,您可以使用此parser。
关于python - python中的TCP Traceroute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53112554/