sockets - 如何从 ipv6 数据包中提取信息
问题描述
我正在使用 python 套接字编写自己的数据包嗅探器,方法是检索数据包信息,例如源 ip、源端口、目标 ip、目标端口、TTL、标志(SYN、ACK、FIN、RST、PSH、URG)等。
对于 IPv4,我能够根据各自的位置解包数据包,结果与我在 tshark 中看到的类似。请参见下面的代码:
IPv4_UNPACK_PATTERN = '!BBHHHBBH4s4s'
IPv6_UNPACK_PATTERN = '!4sHBB16s16s'
IPv4_HDR_LEN = 20
IPv6_HDR_LEN = 40
TCP_HDR_LEN = 20
ETH_HDR_LEN = 14
# IP ATTRIBUTES
IP_VERSION_POS = 0
IP_TOS_POS = 1
IP_LENGTH_POS = 2
IP_IDENTIFICATION_POS = 3
IP_FRAGMENT_OFFSET_POS = 4
IP_TTL_POS = 5
IP_PROTOCOL_POS = 6
IP_HDR_CHCKSUM_POS = 7
IP_SRC_ADDR_POS = 8
IP_DST_ADDR_POS = 9
TCP_FLAG_POS = 5
TCP_WINDOW_POS = 6
# main program:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
packet = s.recvfrom(SOCKET_BUFF_SIZE)
pkt_type = extract_type(packet)
ip_header(packet, pkt_type)
# this function extracts the information from pkt
def ip_header(pkt, pkt_type):
if pkt_type=='ipv4':
data = unpack(IPv4_UNPACK_PATTERN, pkt[ETH_HDR_LEN:ETH_HDR_LEN + IPv4_HDR_LEN])
version = data[IP_VERSION_POS]
total_length = data[IP_LENGTH_POS]
ttl = data[IP_TTL_POS]
protocol = data[IP_PROTOCOL_POS]
ip_header = (version & 0xF) * 4
start_pos = ETH_HDR_LEN + IPv4_HDR_LEN
# Unpacking TCP
tcp_obj = unpack(TCP_UNPACK_PATTERN, data[start_pos:start_pos + TCP_HDR_LEN])
tcp_flag = tcp_obj[TCP_FLAG_POS]
window = str(tcp_obj[TCP_WINDOW_POS])
else: # ipv6
data = unpack(IPv6_UNPACK_PATTERN, pkt[ETH_HDR_LEN:ETH_HDR_LEN + IPv6_HDR_LEN])
# what bit positions to be used here for ipv6?
但是对于 IPv6 数据包,我不知道 ipv6 字段的正确位位置。
任何人都可以指向描述以下字段的 ipv6 数据包的位位置的文档:
- 版本
- ip总长度
- TTL
- 协议
- ip头
- TCP 标志
- 窗口大小
- 不要碎片化位
- 更多片段位
解决方案
推荐阅读
- sql - 如何返回缺失日期不在主表中的缺失日期
- jquery - 数据表分页搜索框不起作用
- java-8 - 根据条件过滤流并将值放入地图
- r - 如何从数据框中选择与来自不同数据框的观察相对应的观察?
- python - 下面给出的代码有什么区别
- java - java.io.FileNotFoundException:/document/14:打开失败:ENOENT(没有这样的文件或目录)
- python - 如何摆脱 elif 语法错误
- arrays - 如何根据另一个数组对数组进行排序和过滤?
- python - 如何通过按钮/提交单击将表格数据从模板传递到 Django?
- ios - 如何设置 SVProgressHUD 加载器的背景图片 - IOS Swift