1.安全机制
1.1 校验和验证
校验和验证是指对封装的报文进行端到端校验。
若GRE报文头中的C位标识位置1,则校验和有效。发送方将根据GRE头及Payload信息计算校验和,并将包含校验和的报文发送给对端。接收方对接收到的报文计算校验和,并与报文中的校验和比较,如果一致则对报文进一步处理,否则丢弃。
隧道两端可以根据实际应用的需要决定配置校验和或禁止校验和。如果本端配置了校验和而对端没有配置,则本端将不会对接收到的报文进行校验和检查,但对发送的报文计算校验和;相反,如果本端没有配置校验和而对端已配置,则本端将对从对端发来的报文进行校验和检查,但对发送的报文不计算校验和
1.2 关键字识别
识别关键字(Key)验证是指对Tunnel接口进行校验。通过这种弱安全机制,可以防止错误识别、接收其它地方来的报文。
RFC1701中规定:若GRE报文头中的K位为1,则在GRE头中插入一个四字节长关键字字段,收发双方将进行识别关键字的验证。
关键字的作用是标志隧道中的流量,属于同一流量的报文使用相同的关键字。在报文解封装时,GRE将基于关键字来识别属于相同流量的数据报文。只有Tunnel两端设置的识别关键字完全一致时才能通过验证,否则将报文丢弃。这里的“完全一致”是指两端都不设置识别关键字,或者两端都设置相同的关键字
2. 报文格式
2.1 GRE报文分析
Delivery Header:负责对封装后的报文进行转发的协议称为传输协议
GRE:GRE的头部,表示的是封装协议
Payload Packet:封装前的报文协议称为乘客协议
2.2 GRE的报文头部分析
字段 | 长度 | 描述 |
C | 1 bit | 校验和验证位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段 |
K | 1 bit | 关键字位。如果该位置1,表示GRE头插入了关键字(Key)字段;该位为0表示GRE头不包含关键字字段 |
Recursion | 3 bit | 用来表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装 |
Flags | 6 bit | 预留字段。当前必须设为0 |
Version | 3 bit | 版本字段,必须置为0。Version为1是使用在RFC2637的PPTP中 |
Protocol Type | 16 bit | 乘客协议的协议类型 |
Checksum | 16 bit | 对GRE头及其负载的校验和字段 |
Key | 31 bit | 关键字字段,隧道接收端用于对收到的报文进行验证 |