首先,确保 Scapy 版本是最新的。您可以通过以下命令更新 Scapy:
pip install --upgrade scapy
如果更新 Scapy 后问题仍然存在,可以尝试以下方法来获取 TTL:
方法 1:直接访问字段值
在 Scapy 中,您可以直接访问数据包的字段值。对于 ICMP 数据包,TTL 值存储在 IP 层的 ttl
字段中。您可以通过以下方式获取 TTL 值:
# -*- coding: utf-8 -*-
from scapy.all import *
# 目标 IP 地址
target_ip = "8.8.8.8"
# 发送的 ICMP Echo Request 的数量
number_of_packets = 5
# 创建一个 ICMP Echo Request 数据包
packet = IP(dst=target_ip) / ICMP()
# 发送数据包并接收响应
for i in range(number_of_packets):
resp = sr1(packet, timeout=1, verbose=False)
if resp is not None:
ttl = resp[IP].ttl # 直接访问 IP 层的 ttl 字段
print(f"Received response from {resp.src} with TTL={ttl}")
else:
print("No response received")
print("Done")
方法 2:使用 haslayer
和 getlayer
方法
另一种方法是使用 haslayer
和 getlayer
方法来获取 TTL 值:
# -*- coding: utf-8 -*-
from scapy.all import *
# 目标 IP 地址
target_ip = "8.8.8.8"
# 发送的 ICMP Echo Request 的数量
number_of_packets = 5
# 创建一个 ICMP Echo Request 数据包
packet = IP(dst=target_ip) / ICMP()
# 发送数据包并接收响应
for i in range(number_of_packets):
resp = sr1(packet, timeout=1, verbose=False)
if resp is not None:
if resp.haslayer(IP):
ttl = resp.getlayer(IP).ttl # 使用 getlayer 方法获取 IP 层的 ttl 字段
print(f"Received response from {resp.src} with TTL={ttl}")
else:
print("No response received")
print("Done")
运行脚本
保存脚本后,使用以下命令运行:
sudo -E /home/xmp/ESX/v2.87/trex_env/bin/python z_test.py