IPSEC实现分析_第1页
IPSEC实现分析_第2页
IPSEC实现分析_第3页
IPSEC实现分析_第4页
IPSEC实现分析_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档交流 IPSec 实现分析实现分析 目录目录 1引言引言 1 1 1编写目的 1 1 2编写背景 1 1 3预期读者和阅读建议 1 1 4文档约定 1 1 5参考资料 1 2详细设计详细设计 1 2 1IPSEC介绍 1 2 2IPSEC实现 6 2 3IPSEC发包和收包 21 2 4内核与 IKE 进程通信 25 3IKE 协商介绍协商介绍 27 3 1主模式 第一阶段 28 3 2野蛮模式 第一阶段 34 3 3快速模式 第二阶段 35 3 4IKE 进程状态转换及调用关系 38 4哈希的计算哈希的计算 41 4 1哈希计算 41 4 2DH 计算 43 4 3加密材料 RFC2409 APPENDIX B 48 5IPSEC 穿穿 NAT 50 5 1穿 NAT 讨论 50 5 2NAT 穿越原理 53 5 3NAT 穿越实现 57 5 4两种模式对比 59 精品文档交流 1引言引言 1 1编写目的 编写该文档的目的是为了更好地理 IPSec 模块 为了能更好地理解 IPSec 本详细设计 报告描述了 IPSec 介绍 数据结构 IPSec 策略匹配 SA 的查找 struct xfrm lifetime cur bytes add time记录添加的时 间 packets use time 0 struct xfrm policy walk entry all dead ipsec策略 1 状状态态选选择择子子 3 模模板板 用用来来 匹匹配配SA 生生命命周周期期限限制制 流流量量和和时时间间 生生命命周周期期当当前前 使使用用统统计计 流流 量量或或者者时时间间 2 安安装装安安全全路路由由 图 2 15IPSec 策略 这个时候 我们可以对着结构体来看 IPSEC 大体的流程 查找绑定 安全 路由 数据流匹配上策 略上的状态选择 子 找到策略 更新数据包的 skb skb dst 创建安全路由 通知IKE 去协 商SA 匹配上SA 安装安全路由 到策略上 结束开始 Y N N Y 图 2 16 流程 策略角度 状态选择子 selector 从数据流的角度定义 选择的数据流 被叫做感兴趣流 其中 匹配项有对端地址 本段地址 子网掩码 协议簇等信息 bundles 被用来安装安全路由 参考图 2 11 当查找不到绑定的安全路由的时候 就会先用来查找 SA 因为如果要创建一个安全路由 需要使用 SA 作为材料 SA 为其提 供一些参数 比如一些处理函数 genid 等 xfrm vec 这个模板数组用来匹配 SA 策略的机构体 structxfrm policy 如下 structxfrm policy ifdefCONFIG NET NS structnet xp net endif structxfrm policy next 下一个策略 addbylxhforipseckernel 201112 13 精品文档交流 structhlist nodebydst 按目的地址 HASH 的链表 加入到全局链表中 init net xfrm policy bydst 相关 structhlist nodebyidx 按索引号 HASH 的链表 加入全局链表中 init net xfrm policy byidx structxfrm policy child addbylxhforipseckernel 201104 13 Thislockonlyaffectselementsexceptforentry rwlock tlock atomic trefcnt 引用次数 structtimer listtimer 策略定时器 u32priority 策略优先级 如果多个匹配 则使用最高优先级的 u32index 存放 policy byidx 的下标 structxfrm selector selector 选择子 structxfrm lifetime cfglft 策略生命期 structxfrm lifetime curcurlft 当前的生命期数据 structdst entry bundles 安全路由链表 structxfrm policy walk entrywalk 加入 init net xfrm policy all 中 u8type u8action 接受 加密 阻塞等 u8flags 标记 u8xfrm nr 有几个模板 对应本结构体中的数组 xfrm vec u16family 协议簇 addbylxhforipseckernel 201104 13 u32inbound 入方向 u32outbound 出方向 u32pol type 策略类型 u32pol id 策略 id u32isdynamic 是否是动态 chartunnel name 32 隧道名字 u32outbound sa spi 出方向的 spi endaddbylxhforipseckernel 201104 13 structxfrm sec ctx security 安全上下文 structxfrm tmplxfrm vec XFRM MAX DEPTH 状态模板 structpolicy entry policy entry addbylxhforipseckernel 201104 13 addedbyliangxiaformatchpeergwip 2012 4 11 隧道模式 保护子网不变 但对端地址改变 删除原隧道 SA 引起新隧道不可用 u32peer ip addedbyliangxia 2012 12 14 s32dev index 接口 ifindex 2 2 2 2 安全联盟 SA 上文中多次提到的 SA 究竟是以什么组织的 现在来揭开神秘的面纱 SA 的结构体 精品文档交流 图如下图 2 17 bysrc bydst gclist refcnt 1 byspi id lock sel km genid xfrm state genid lft props ealg aalg calg encap aead tunnel coaddr replay tunnel users 0 struct xfrm state preplay replay maxage 10 HZ 10 xflags rtimer xfrm replay timer handler replay maxdiff net xfrm sysctl aevent rseqth 2 curlft stats timer xfrm timer handler 30s超时 type esp type或者ah type lastused inner mode iaf NULL inner mode 根据sel family和props mode推 出 xfrm4 tunnel mode或者 xfrm4 transport mode security outer mode 根据props family和props mode推 出 xfrm4 tunnel mode或者 xfrm4 transport mode data reqid replay window mode传输 通道 flags aalgo ealgo calgo saddr出口地址 family AF INET header len 报文头总长 度 ESP头 初始化向量 IP头长度 trailer len ESP尾部总长 度 包括填充 struct xfrm lifetime cur bytes add time get seconds packets use time xs net net struct xfrm selector daddr 对端地址 dport目的端口 saddr源地址 sport源端口 dport mask 0 xffff family AF INET sport mask 0 xffff prefixlen d 32 proto fl proto IP头协议号 prefixlen s 32 user ifindex fl oif pol id tmpl id struct xfrm lifetime cfg soft byte limit XFRM INF soft packet limit XFRM INF hard byte limit XFRM INF soft add expires seconds hard packet limit XFRM INF soft use expires seconds hard add expires seconds 30 hard use expires seconds struct xfrm id daddr a4 对端网关地址 reverse spi spi proto IPPROTO ESP 调用xfrm get mode 获取处理指针 调用xfrm get type 获取处理指针 struct esp data padlen base aead struct crypto aead struct crypto tfm crt u ablkcipher aead blkcipher cipher hash compress rng crt flags crt alg exit crt ctx struct xfrm state walk all dying proto state XFRM STATE VALID seq 图 2 17SA 的结构体 内核中 SA SecurityAssociation 是用结构体 structxfrm state 来定义 各个字段的含义如 下 Fulldescriptionofstateoftransformer structxfrm state ifdefCONFIG NET NS structnet xs net endif union structhlist nodegclist structhlist nodebydst 按照目的地址 HASH 与回收重用 structhlist nodebysrc 按照源地址 HASH structhlist nodebyspi 按照 SPI 值 HASH atomic trefcnt 引用计数 spinlock tlock 锁 精品文档交流 structxfrm idid SA 索引 即目的地址 spi 和协议号 structxfrm selector sel 状态选择子 u32genid 生成 id Keymanagerbits structxfrm state walkkm KEY 回调管理处理结构参数 Parametersofthisstate struct u32reqid 请求 ID u8mode 模式 传输 通道 u8replay window 回放窗口 u8aalgo ealgo calgo 认证 加密 压缩算法 ID 值 u8flags 标记 u16family 协议族 xfrm address tsaddr 源地址 出口地址 intheader len 添加的协议头长度 ESP AH 头 IP 头 隧道模式时 inttrailer len 添加的协议尾长度 ESP 才有 props SA 相关参数结构 structxfrm lifetime cfglft 生命周期 Datafortransformer structxfrm algo aalg hash 算法 structxfrm algo ealg 加密算法 structxfrm algo calg 压缩算法 structxfrm algo aead aead Dataforencapsulator structxfrm encap tmpl encap NAT 穿越相关信息 Dataforcare ofaddress xfrm address t coaddr IPCompneedsanIPIPtunnelforhandlinguncompressedpackets structxfrm state tunnel 通道 实际上是另一个 SA Ifatunnel numberofusers 1 atomic ttunnel users 通道的使用数 Stateforreplaydetection structxfrm replay statereplay 回放检测结构 包含各种序列号掩码等信息 精品文档交流 Replaydetectionstateatthetimewesentthelastnotification structxfrm replay statepreplay 上次的回放记录值 internalflagthatonlyholdsstatefordelayedaeventatthe moment u32xflags 标志 Replaydetectionnotificationsettings u32replay maxage 回放最大时间间隔 u32replay maxdiff 回放最大差值 Replaydetectionnotificationtimer structtimer listrtimer 回放检测定时器 Statistics structxfrm statsstats 统计值 structxfrm lifetime curcurlft 当前生存周期计数器 structtimer listtimer SA 定时器 Lastusedtime unsignedlonglastused Referencetodatacommontoalltheinstancesofthis transformer conststructxfrm type type 类型 ESP AH 处理指针 structxfrm mode inner mode 函数处理指针 structxfrm mode inner mode iaf structxfrm mode outer mode 函数处理指针 Securitycontext structxfrm sec ctx security 安全上下文 加密时使用 Privatedataofthistransformer formatisopaque interpretedbyxfrm typemethods void data 内部私有数据 将在 esp init state ah init state 中被赋值 2 2 2 3 安全路由链表 安全路由链表是用来处理 IPSEC 包 以及发送的时候用的 最大的好处是灵活 如图 2 18 和 2 19 所示 对于策略的匹配 SA 的匹配 都是为了给数据包 skb 上添加处理指针 以便在发出的时候进行处理 当是隧道的模式的时候 最后一个 dst entry 是通过查找普通 路由得到的 而传输模式 则是直接从 skb 上拷贝就可以得到 因为当经过 FORWARDING 的时候 数据包已经是经过路由查找过的 PRE ROUTING 路由 精品文档交流 FORWARDING struct xfrm dst u dst route struct dst entry child xfrm 指向SA struct xfrm dst u dst route struct dst entry child xfrm 指向SA dst entry dst entry ESP相关处理 AH相关处理 正常路由处理 skb buff skb buffdst entry path 正常包 以隧道模式为例 图 2 18 安全路由 隧道模式 struct xfrm dst u dst route struct dst entry child xfrm 指向SA struct xfrm dst u dst route struct dst entry child xfrm 指向SA dst entry ESP相关处理 AH相关处理 正常路由处理 skb buff skb buffdst entry path 正常包 以传输模式为例 图 2 19 安全路由 传输模式 结构体如下 忽略不关心的部分 structdst entry structdst entry next structdst entry child 关联需要处理的下一个安全路由 structdst entry path structxfrm state xfrm 关联 SA 2 2 2 4 策略的相关协议处理结构 family AF INET garbage collect xfrm garbage collect dst ops 如果是 ICMP 协议的话 填充 icmp 的类型和码 fl fl icmp type 和 fl fl icmp code 如果是 ESP 的话 填充 IPSEC 的 SPI fl fl ipsec spi 如果是 AH 的话 填充 IPSEC 的 SPI fl fl ipsec spi 如果是 COMP 的话 也是填充 IPSEC 的 SPI fl fl ipsec spi 其他协议的话 fl fl ipsec spi 0 fl proto 存放 ip 头的协议号 fl fl4 dst 存放目的地址 fl fl4 src 存放源地址 fl fl4 tos 存放 ip 头中的 tos 字段值 security xfrm decode session 是不是空的 取决于宏定义 CONFIG SECURITY NETWORK XFRM 存不存在 通过查看内核的配置文件 config 并未 发现 暂且当做是空的处理吧 xfrm lookup fw xfrm lookup by pol id net ch len ctx hmac digest size ch ptr alloc bytes ch len name hmac final ch ptr ctx hmac init chunk hmac update chunk hmac update chunk hmac final chunk st st skeyid st skeyidinskeyid preshared SKEYID d 的计算 Comment g17 g xy Comment g18 上述表达式中的 0 如果是 1 则是 u char 1 Comment g19 st st gi Comment g20 st st gr Comment g21 st st shared 精品文档交流 SKEYID D hmac update chunk hmac update hmac update hmac update hmac final chunk st st skeyid d st skeyid dingenerate skeyids iv 在 c 中 0 表示十六进制 0 x0 1 表示 0 x1 以此类推 4 2DH 计算 4 2 1DH 交换过程 首先说下 交换的过程 Ya g xi mod p Yb g xr mod p Host AHost B 将Ya发送给B 将Yb发送给A K Yb xi mod p K Ya xr mod p 假设 A 和 B 进行交换 A 生成一个 Ya g xi modp B 生成一个 Yb g xr modp A 把 Ya 发送给 B B 把 Yb 发送给 A 通常发送生成的公共值 Ya 或者 Yb 是通过 KEY 负载传输的 如上文中所述 当收到对方发送的公共值 Ya 或者 Yb 以后 就可以计算出一个公共密钥 K A 可以通过 Xi 和 Yb 计算出公共值 K Yb xi modp B 可以通过 Xr 和 Ya 计算出公共值 K Ya xr modp 现在来讨论下 生成 Ya 或者 Yb 使用的材料 g xi 或者 xr 和 p 在 RFC2409 中 g 和 p 已经给出 xi 和 xr 通常是随机生成 但是需要记住的一个值 因为 对于计算 SKEYID 等材料的时候 还要用到 g 在 RFC2409 中指定为 2 p 则分为几个 group 比如第一个组是 768 位 在协商的时候 指定为 1 defineMODP768 MODULUS FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1 29024E088A67CC74020BBEA63B139B22514A08798E3404DD 精品文档交流 EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245 E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF 类似的还有组 2 defineMODP1024 MODULUS FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1 29024E088A67CC74020BBEA63B139B22514A08798E3404DD EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245 E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381 FFFFFFFFFFFFFFFF 对于把这些十六进制数转换成一个大数的功能 在 GMP 库中有函数 mpz init set str 就可以实现 例如 函数 init crypto 中 mpz init set str 意思是初始化 mp 为 0 公共值的计算在 compute dh shared 这个函数中实现 Function voidmpz mul mpz trop constmpz top1 constmpz top2 Function voidmpz mul si mpz trop constmpz top1 longintop2 Function voidmpz mul ui mpz trop constmpz top1 unsignedlongintop2 mpz mul ui 是 rop op1 op2 mpz add ui 是 rop op1 op2 Function voidmpz init mpz tx 函数 mpz init 是初始化 x 并且设置为 0 Function voidmpz powm mpz trop constmpz tbase constmpz texp constmpz tmod Function voidmpz powm ui mpz trop constmpz tbase unsignedlongintexp constmpz tmod mpz powm 是 rop base exp mod 也即 mp g groupgenerator st st sec group modulus mp g 2 st st sec modp768 modulus st st sec 在上文中生成 被叫做 xi modp768 modulus 是 RFC2409 中规定好的 在初始化的时候 已经赋值了 所以 这个时候就计算出来了 Ya 最后一步是将 mp g 转换成网络字节序 并将其保存在 g 中 当收到 Yb 以后 就可以计算共享密钥了 在 crypto 源码中 存放 xi Ya Yb 和共 享密钥 K 的变量分别是结构体 struct state 中的 st sec st gi st gr st shared 计算共享 密钥 K 的实现是在 compute dh shared 函数中 作为发起者 首先自己生成 Ya st gi 然后收到 Yb st gr 在函数 aggr inR1 outI2 精品文档交流 作为响应者 首先收到了 Ya st gi 然后生成 Yb st gr 在函数 aggr inI1 outR1 两边都收到对端发过来的公共值 Ya 或者 Yb 以后 就可以计算 K 同样都是调用函数 compute dh shared 我们这里拿发起者来举例说明 当发起者 A 收到 Yb 以后 那计算 K 就变得非常容易了 因为在协商过程中 A 已经生成了 xi st sec Ya 所以 K Yb xi 用函 数来表达 n to mpz 是将公共值 g Yb 转换成 MP INT 值 主要是看这句 mpz powm 意思是 mp shared mp g st st sec group modulus mp g 就是对方传过来的公共值 Yb st st sec 就是我们自己生成的私有密钥 xi group modulus 就是 RFC2409 文档中规定好的 768bit 1024bit 等固定数值 NAT D 的计算 HASH HASH CKY I CKY R IP Port 精品文档交流 符号说明 HDR 是 ISAKMP 的头 它的 exchangetype 是协商的模式是协商的模式 当被写成 HDR 的时候 说明它的负载是加密的 SA 是一个带有一个或者多个 proposal 负载的 SA 协商负载 一个发起者 或许提供多 个 proposal 用来协商 一个响应者必须只是回应其中的一个 b Payloadbody 说明是负载的 body 没有包含 ISAKMP 通用负载头 SAi b SAInitiatorbody 是整个 SA 负载的 body 加上 ISAKMP 通用头 例如 由发起 者提供的 DOI situation 所有 proposal 和所有 transforms CKY I 和 CKY R COOKIEInitiator 和 CookieResponser 是来自于 ISAKMP 头的发起者 的 cookie 和响应者的 cookie g xi 和 g xr 是发起者和响应者的 Diifie Hellman DH 公共值 g xy 是 DH 共享密钥 g xiandg xraretheDiffie Hellman DH publicvaluesoftheinitiatorandresponderrespectively g xyistheDiffie Hellmansharedsecret KE KEYExchangePayload 是在 Diffie Hellman 交换的过程中包含公共信息的 keyexchange 负载 Nx NonceInitiatororRespnoser NiorNr 是一个 nonce 负载 对于发起者或者响应者 x 可以是 i 或者 r IDx IdentificationPayloadIDii IDir IDui IDur 是一个 identification 负载 在阶段 1 的协商 过程中 对于 ISAKMP 发起者或者响应者 x 可以是 ii 或者 ir 在阶段 2 中 可以是 ui 或者 ur ID 负载的格式 需要看 InternetDOI 定义在 Pip97 SIG Signaturepayload 是 signature 负载 CERT CertificatePayload 是证书负载 HASH Hashpayload 是 hash 负载 hash 的内容是对应到具体的认证方法 prf key msg 是伪随机功能 通常一个 keyed 哈希功能 被用来生成一个确定的输出 并呈现出伪随机性 被用来生成 key 和认证 SKEYID 是一个对于在交换中的所有 player 来说 SKEYID 是一个已知并唯一的字符 串 SKEID e 是 ISAKMPSA 使用的加密材料 keyingmaterial 来保护它的消息的机密 SKEID a 是 ISAKMPSA 使用的加密材料 来认证它的消息 SKEYID d 是加密的材料 派生自非 ISAKMP 安全联盟 y说明 x 是被 y 来加密的 从发起者到响应者的通信 requests 从响应者到发起者的通信 replies 信息的连结 例如 X Y 表示 X 和 Y 的连结 x 说明 x 是可选的 Comment g22 这个是密码素材 Comment g23 Ni b Comment g24 Nr b Comment g25 存放最终生成的 SKEYID Comment g26 g xy Comment g27 上述表达式中的 0 如果是 1 则是 u char 1 精品文档交流 4 2 4IKE 中的加解密 4 3加密材料 RFC2409 Appendix B 加密材料主要是在函数 generate skeyids iv 中生成 首先是生成 SKEYID 如果类型是预共享的话 调用 skeyid preshared 如果类型是证书的话 调用函数 skeyid digisig 以预共享为例 计算如下 definehmac init chunk ctx h ch hmac init ctx h ch ptr ch len definehmac update chunk ctx ch hmac update ctx ch ptr ch len define hmac final chunk ch name ctx pfreeany ch ptr ch len ctx hmac digest size ch ptr alloc bytes ch len name hmac final ch ptr ctx hmac init chunk hmac update chunk hmac update chunk hmac final chunk st st skeyid st skeyid in skeyid preshared SKEYID d 的计算 SKEYID D hmac update chunk hmac update hmac update hmac update hmac final chunk st st skeyid d st skeyid d in generate skeyids iv 在 c 中 0 表示十六进制 0 x0 1 表示 0 x1 以此类推 SKEYID e 的计算 hmac update chunk hmac update chunk hmac update hmac update hmac update hmac final chunk st st skeyid e st skeyid e in generate skeyids iv 精品文档交流 第一次 IV 向量的生成是基于 DH 交换中的发起者的公共值和响应者的公共值 加密材料的生成是基于 SKEYID e 加密材料的长度 keysize 是基于加密算法的要求 加密的函数是 crypto cbc encrypt TODO TODO 加密函数的使用 replace bare shunt shunt eroute eroute connection setup half ipsec sa teardown half ipsec sa crypto match address crypto match address manual 精品文档交流 raw eroute setup half ipsec sa 2186 raw eroute call netlink raw eroute 525 ADD install ipsec sa 2932 route add eroute call route and eroute 2866 sag eroute call sag eroute 1269 eroute connection call eroute connection 1121 raw eroute call install ipsec sa setup half ipsec sa raw eroute route add eroute sag eroute eroute connection raw eroute raw eroute eroute connection 5IPSEC 穿穿 NAT 5 1穿 NAT 讨论 首先分析 NAT 对数据包更新了什么 然后根据这些特点来看 IPSEC 什么模式和头 适用 NAT 会修改 IP 地址或者端口号 同时会更新校验和 IP 头 TCP UDP 检验和 IP 头的校验和只是对于 IP 头做的检验 精品文档交流 图 4 1IP 头校验和 当 NAT 转换完源 IP 地址后 需要更新头校验和 TCP 校验和覆盖 TCP 首部和 TCP 数据 而 IP 首部中的校验和只覆盖 IP 的首部 不 覆盖 IP 数据报中的任何数据 TCP 的校验和是必需的 而 UDP 的校验和是可选的 TCP 和 UDP 计算校验和时 都要加上一个 12 字节的伪首部 TCP 校验和 图 4 2TCP 校验和 做完 NAT 后 源地址和源端口都可能发生变化 所以需要更新 TCP 的校验和字段 UDP 的校验和与 TCP 的一样 只不过伪首部中的 Protocol 字段是 17 而 TCP 的是 6 来看 AH 头的方式 AH 头认证的是整个报文 当过 NAT 设备的时候 无法再次更新 AH 头部中的认证 所以 AH 的思想和 NAT 没办法兼容 导致收包方校验失败丢弃 这样 的话 不管是传输模式还是隧道模式 只要是 AH 头的方法 都没有办法穿越 NAT 设备 都会导致丢弃的结果 如图 精品文档交流 IP 数据 TCP UDP other IPAH 认证的 这里已经做完 TCP UDP的校验 过VPN设备进行 的封装与处理 过NAT设备进行 的处理 数据 TCP UDP other 数据 TCP UDP other New IPAH 认证的 IP 数据 TCP UDP other Out IPAH 认证的部分 这里已经做完 TCP UDP的校验 过VPN设备进行 的封装与处理 过NAT设备进行 的处理 数据 TCP UDP other New IP IP 数据 TCP UDP other AH 认证的部分 IP 图 4 3AH 传输模式 AH 隧道模式 再来看 ESP 头传输模式的情况 IP 数据 TCP UDP other IP数据ESP ESP 填充 ESP校 验 加密 认证的 New IP数据ESP ESP 填充 ESP校 验 加密 认证的 这里已经做完 TCP UDP的校验 过VPN设备进行 的封装与处理 过NAT设备进行 的处理 图 4 4ESP 头 传输模式 过完 Nat 设备后 可能外部的 IP 地址发生变化 但是数据部分的校验无法更新 导致收到包的设备对数据进行校验不通过丢弃该包 最后看 ESP 头 隧道模式的情况 IP 数据 TCP UDP other Out IP数据ESP ESP 填充 ESP校 验 加密 认证的 这里已经做完 TCP UDP的校验 过VPN设备进行 的封装与处理 过NAT设备 进行的处理 IP New IP数据ESP ESP 填充 ESP校 验 加密 认证的 IP 图 4 5ESP 头 隧道模式 从图中可以看出 即便是过 NAT 设备改变外部 IP 地址 Out IP New IP 也不会 影响到原始包中的校验 所以能过 NAT 设备的唯一可能就是 ESP 隧道模式 ESP 协议在 NAT 环境下最多只能有一个 VPN 主机能建立 VPN 通道 无法实现多台机 器同时在 NAT 环境下进行 ESP 通信 为什么 如图 2 40 所示 当分支 A 与中心 点 K 建立起来连接后 在 NAT 设备上会形成一个会话 当分支 B 再尝试与中心点 K 进 行通信的时候 由于会话与分支 A 的冲突 导致建立不起来 精品文档交流 内部网络 172 16 2 0 24 内部网络 192 168 1 0 24 IPSEC 通道 响响应应方方 NAT设备 10 10 25 20 202 106 199 34 协议50 10 10 25 20 69 172 201 208 协议50 69 172 201 208 202 106 199 34 69 172 201 208 内部网络 192 168 2 0 24 10 10 25 21 协议50 10 10 25 21 69 172 201 208 协议50 69 172 201 208 202 106 199 34 冲突 10 10 25 20数据ESP ESP 填充 ESP校 验 加密 认证的 IP 202 106 199 34数据ESP ESP 填充 ESP校 验 加密 认证的 IP 分支A 分支B 中心点K 图 4 6 穿 NAT 理论分析 cat proc net nf conntrack ipv42unknown5028src 192 168 1 25dst 2 2 2 2packets 4bytes 200 UNREPLIED s rc 2 2 2 2dst 2 2 2 1packets 0bytes 0use 2 摘自网络 ESP 协议号 50 没有类似于 UDP TCP 端口号的概念 因此也就没有 NAT 复用标识 ESP 要穿越 NAT 还需要想其它办法 通过借用 UDP 的方式 巧妙地实现了 NAT 地址复用 它使用的是 UDP 端口 500 IKE 协商协议 ISAKMP 所使用端口 ESP 在 什么时候会进行 UDP 封装呢 它是通过 IKE 协商时检测出来的 摘自网络 检测 NAT NAT D 负载不仅仅是检测两个 IKE 对等体之间存在 NAT 设备 而且要检测 NAT 设备的位置 检测 IKE 对等体之间是否存在 NAT 通过检测 IP 地址和端 口是否在传输的路径上被修改来决定 具体过程是 首先发送各自的 ip 和端口的哈希 值给对方 如果 IKE 对等体收到哈希值计算后发现没有被修改那就表明两个 IKE 对等 体之间没有 NAT 设备 如果计算后发现哈希值被修改那就表明 IKE 对等体之间存在 NAT 设备并翻译了地址和端口 NAT D 负载包含在主模式的第三和第四个数据包中 5 2NAT 穿越原理 NAT 穿越 NATTraversal NAT T 经过上述穿 NAT 讨论后 我们知道 只有隧道模 式 ESP 才能穿 NAT 那么如何知道有没有 NAT 存在 怎么穿越呢 在 RFC3947 给出了 解决方法 也即在外层 IP 头和 ESP 头之间加入 UDP 头 就可以解决 4 1 中讨论最后的问 题 同时巧妙地实现了 NAT 地址复用 如图所示 新IP头UDP头ESP头ESP载荷 原始IP 原始载荷 ESP尾 图 4 7 穿 NAT 新增 UDP 头 5 2 1NAT 检测 NAT 检测是看通信中是否存在 NAT 设备和对方是否支持 NAT T 检测对方是否支持 NAT T 是通过交换 vendorID 载荷来实现的 如果自身支持 NAT T 在 IKE 开始交互就要发送这种载荷 载荷内容是 RFC3947 的 MD5 值 也就是十六 进制的 4a131c81070358455c5728f20e95452f 判断是否在 NAT 设备后面是通过发送 NAT D NAT Discovery 载荷来实现的 载荷内 容是 IP 地址和 UDP 端口的 HASH 值 NAT D 载荷格式如下 载荷类型值是 20 精品文档交流 图 4 8NAT D 格式 HASH 值的计算方法如下 具体 HASH 是根据协商来确定的 HASH HASH CKY I CKY R IP Port CKY I 和 CKY R 是协商发起方和响应方的 cookie 协商中双方各自至少要发送两个 NAT D 载荷 第一个载荷是对方的地址和端口的 HASH 后面的载荷是自己的地址和端口 如果本地有多个地址 则要发送多个载荷 包 括所有地址和端口的 HASH 对方接收到载荷后重新根据收到的包的实际地址端口来计算 HASH 值后进行比较 就可以知道是否有 NAT 设备以及哪一方在 NAT 设备之后了 报文中的 NAT D 负载可以有多个 NAT D 对方地址和端口的哈希 NAT D 本地接口的地址和端口 NAT D 本地接口的地址和端口 检测过程 1 接收方接收到 NAT D 负载后 首先用自己的发送包时的 IP 和源端口计算一个哈 希 并与第一个 NAT D 进行比较 如果不一样 则可以知道 我们的设备在 NAT 后面 地址不是公网地址 2 接收方接收到 NAT D 负载后 拿收到包的源 IP 地址和端口 与第 2 个及以后的 NAT D 的负载进行比较 如果不一样 则对端在 NAT 后面 在协商时 发现了自己在 NAT 设备之后的一方立即要将协商端口从 500 该为 4500 源和目的端口都是 4500 此时协商数据包格式为 IP头 UDP 4500 4500 non ESP marker HDR IDii CERT SIG I 图 4 9IKE 协商包 端口变化 其中 non ESPmarker 为 4 字节 在后面介绍其值 接收方接收此包解密并认证通过后 要改变自己的状态将原来处理 500 端口状态改为 处理 4500 端口 后续的协商过程都使用 4500 端口进行 以后 500 端口收到的不是新协商 的包都将被丢弃 协商过程为 InitiatorResponder UDP 500 500 HDR SA VID 精品文档交流 值得注意的是只是在传输模式下需要 NAT OA 负载 隧道模式是不需要的 其实就协 商本身来说 是不需要 NAT OA 的 因为协商的报文是 UDP 报文 穿 NAT 的时候 校验 和自然会被 NAT 设备所更新 为什么在协商中添加 NAT OA 负载呢 是由于后续使用 ESP 传输模式的时候 因为 没有办法更新 TCP UDP 负载的校验和 所以需要协商出来的 NAT OA 中记录的原始 IP 地 址进行校验 5 2 3UDP 封装格式 UDP 封装 ESP 包格式 如下图所示 UDP 头是标准 RFC0768 头 但是 源端口和目的端口都必须是相同的 校验和字段应该设为 0 接收者必须不能依赖于 UDP 校验和 ESP 本身有完整性认证功能 不需要 UDP 的校验和 ESP 头的最开始 4 个字节是 SPI 字段 该字段绝不能是 0 图 4 11UDP 封装 ESP 包格式 UDP 封装 IKE 数据包格式 图 4 12UDP 封装 IKE 包格式 源和目的端口是 4500 UDP 校验和可以计算也可以不用设 没作限定 但该字段绝不 能作为判断包类型的依据 Non ESPMarker 字段必须设置为 0 该字段位置等价于 ESP 头 的 SPI 字段 因此该字段为 0 表示是 IKE 数据 不为 0 表示是 ESP 数据 NAT 保持消息 keepalive 图 4 13keepalive 消息包格式 精品文档交流 NAT 连接保持包是为了检查 NAT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论