IPSEC实现分析[分享借鉴]_第1页
IPSEC实现分析[分享借鉴]_第2页
IPSEC实现分析[分享借鉴]_第3页
IPSEC实现分析[分享借鉴]_第4页
免费预览已结束,剩余60页可下载查看

下载本文档

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

文档简介

1、材料分享# 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加密材料(R

2、FC2409 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 al

3、l dead ipsec策略 1.状状态态选选择择子子 3.模模板板:用用来来 匹匹配配SA 生生命命周周期期限限制制 (流流量量和和时时间间) 生生命命周周期期当当前前 使使用用统统计计(流流 量量或或者者时时间间) 2.安安装装安安全全路路由由 图 2-15 IPSec 策略 这个时候,我们可以对着结构体来看 IPSEC 大体的流程: 查找绑定(安全 路由) 数据流匹配上策 略上的状态选择 子(找到策略) 更新数据包的 skb-_skb_dst 创建安全路由 通知IKE,去协 商SA 匹配上SA? 安装安全路由 到策略上 结束开始 Y N N Y 图 2-16 流程(策略角度) 状态选择子

4、(selector):从数据流的角度定义选择的数据流 ,被叫做感兴趣流,其中 匹配项有对端地址、本段地址、子网掩码、协议簇等信息; 材料分享# bundles:被用来安装安全路由(参考图 2-11) ;当查找不到绑定的安全路由的时候, 就会先用来查找 SA,因为如果要创建一个安全路由,需要使用 SA 作为材料。SA 为其提 供一些参数,比如一些处理函数、genid 等。 xfrm_vec:这个模板数组用来匹配 SA 策略的机构体 struct xfrm_policy,如下: struct xfrm_policy #ifdef CONFIG_NET_NS struct net*xp_net; #

5、endif struct xfrm_policy *next; /* 下一个策略 add by lxh for ipsec kernel, 2011 12.13 struct hlist_nodebydst;/*按目的地址 HASH 的链表,加入到全局链表中 init_net- xfrm-policy_bydst 相关*/ struct hlist_nodebyidx;/*按索引号 HASH 的链表,加入全局链表中 init_net-xfrm- policy_byidx*/ struct xfrm_policy *child; /add by lxh for ipsec kernel, 201

6、1 04.13 /* This lock only affects elements except for entry. */ rwlock_tlock; atomic_trefcnt;/*引用次数*/ struct timer_listtimer;/*策略定时器*/ u32priority;/*策略优先级,如果多个匹配,则使用最高优先级的*/ u32index;/*存放 policy_byidx 的下标*/ struct xfrm_selectorselector; /*选择子*/ struct xfrm_lifetime_cfg lft;/*策略生命期*/ struct xfrm_life

7、time_cur curlft;/ 当前的生命期数据 struct dst_entry *bundles;/*安全路由链表*/ struct xfrm_policy_walk_entry walk;/*加入 init_net-xfrm-policy_all 中*/ u8type; u8action;/*接受/加密/阻塞等*/ u8flags;/*标记*/ u8xfrm_nr;/*有几个模板,对应本结构体中的数组 xfrm_vec*/ u16family;/*协议簇*/ /add by lxh for ipsec kernel, 2011 04.13 u32 inbound; /*入方向*/ u

8、32 outbound;/*出方向*/ u32 pol_type; /*策略类型*/ u32 pol_id;/*策略 id*/ u32 isdynamic;/*是否是动态?*/ char tunnel_name32; /*隧道名字*/ u32 outbound_sa_spi;/*出方向的 spi*/ /end add by lxh for ipsec kernel, 2011 04.13 材料分享# struct xfrm_sec_ctx*security;/*安全上下文 */ struct xfrm_tmpl xfrm_vecXFRM_MAX_DEPTH;/*状态模板*/ struct po

9、licy_entry *policy_entry;/add by lxh for ipsec kernel, 2011 04.13 / added by liangxia for match peer gw ip, 2012.4.11 / 隧道模式,保护子网不变,但对端地址改变 / 删除原隧道 SA 引起新隧道不可用 u32peer_ip; / added by liangxia, 2012.12.14 s32dev_index;/接口 ifindex ; 2.2.2.2 安全联盟 SA 上文中多次提到的 SA,究竟是以什么组织的,现在来揭开神秘的面纱。SA 的结构体 图如下图 2-17。 b

10、ysrc 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=x

11、frm_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, ealg

12、o, 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 pref

13、ixlen_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_

14、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_uablkcipher/aead/ blkcipher/cipher/hash/ compress/rng crt_flags _crt_alg exit _crt_ctx struct xfrm_

15、state_walk all dying/proto state=XFRM_STATE_ VALID seq 图 2-17 SA 的结构体 内核中 SA(Security Association)是用结构体 struct xfrm_state 来定义,各个字段的含义 如下: 材料分享# /* Full description of state of transformer. */ struct xfrm_state #ifdef CONFIG_NET_NS struct net*xs_net; #endif union struct hlist_nodegclist; struct hlist

16、_nodebydst;/按照目的地址 HASH,与回收重用 ; struct hlist_nodebysrc;/按照源地址 HASH struct hlist_nodebyspi;/按照 SPI 值 HASH atomic_trefcnt;/ 引用计数 spinlock_tlock;/ 锁 struct xfrm_idid;/ SA 索引,即目的地址,spi 和协议号 struct xfrm_selectorsel;/ 状态选择子 u32genid;/生成 id /* Key manager bits */ struct xfrm_state_walkkm; / KEY 回调管理处理结构参数

17、/* Parameters of this state. */ 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 相关参数结构 st

18、ruct xfrm_lifetime_cfg lft;/生命周期 /* Data for transformer */ struct xfrm_algo*aalg;/ hash 算法 struct xfrm_algo*ealg;/ 加密算法 struct xfrm_algo*calg;/ 压缩算法 材料分享# struct xfrm_algo_aead*aead; /* Data for encapsulator */ struct xfrm_encap_tmpl *encap;/NAT 穿越相关信息 /* Data for care-of address */ xfrm_address_t*

19、coaddr; /* IPComp needs an IPIP tunnel for handling uncompressed packets */ struct xfrm_state*tunnel;/通道,实际上是另一个 SA /* If a tunnel, number of users + 1 */ atomic_ttunnel_users;/通道的使用数 /* State for replay detection */ struct xfrm_replay_state replay;/回放检测结构,包含各种序列号掩码等信息 /* Replay detection state at t

20、he time we sent the last notification */ struct xfrm_replay_state preplay;/ 上次的回放记录值 /* internal flag that only holds state for delayed aevent at the * moment */ u32xflags;/ 标志 /* Replay detection notification settings */ u32replay_maxage;/ 回放最大时间间隔 u32replay_maxdiff;/ 回放最大差值 /* Replay detection not

21、ification timer */ struct timer_listrtimer;/ 回放检测定时器 /* Statistics */ struct xfrm_statsstats; / 统计值 struct xfrm_lifetime_cur curlft;/ 当前生存周期计数器 struct timer_listtimer;/ SA 定时器 /* Last used time */ unsigned longlastused; /* Reference to data common to all the instances of this * transformer. */ 材料分享#

22、 const struct xfrm_type*type;/ 类型, ESP / AH,处理指针 struct xfrm_mode*inner_mode;/函数处理指针 struct xfrm_mode*inner_mode_iaf;/ struct xfrm_mode*outer_mode;/函数处理指针 /* Security context */ struct xfrm_sec_ctx*security;/ 安全上下文, 加密时使用 /* Private data of this transformer, format is opaque, * interpreted by xfrm_t

23、ype methods. */ void*data;/ 内部私有数据, 将在 esp_init_state/ ah_init_state 中被赋 值 ; 2.2.2.3 安全路由链表 安全路由链表是用来处理 IPSEC 包,以及发送的时候用的,最大的好处是灵活。如图 2-18 和 2-19 所示。对于策略的匹配,SA 的匹配,都是为了给数据包 skb 上添加处理指针, 以便在发出的时候进行处理。当是隧道的模式的时候,最后一个 dst_entry 是通过查找普通 路由得到的;而传输模式,则是直接从 skb 上拷贝就可以得到,因为当经过 FORWARDING 的时候,数据包已经是经过路由查找过的(

24、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_entr

25、y 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 安全路由(传输模式) 结构体如下,忽略不关心的部分: 材料分享# struct dst_entry struct dst_entry *next; struct dst_entry*child; /关联需要处理的下一个安全路由 struct dst_entry*path;

26、 struct xfrm_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_ip

27、sec_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)-hma

28、c_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_ch

29、unk(st-st_skeyid_d, st_skeyid_d in generate_skeyids_iv(), 在 c 中,0 表示十六进制 0 x0,1,表示 0 x1,以此类推 4.2DH 计算 4.2.1DH 交换过程 首先说下,交换的过程: Ya=gxi(mod p) Yb=gxr(mod p) Host AHost B 将Ya发送给B 将Yb发送给A K=Ybxi(mod p)K=Yaxr(mod p) 假设 A 和 B 进行交换,A 生成一个 Ya=gxi(mod p),B 生成一个 Yb=gxr(mod p), A 把 Ya 发送给 B; B 把 Yb 发送给 A; 材料分享

30、# 通常发送生成的公共值 Ya 或者 Yb 是通过 KEY 负载传输的,如上文中所述。 当收到对方发送的公共值 Ya 或者 Yb 以后,就可以计算出一个公共密钥 K: A 可以通过 Xi 和 Yb 计算出公共值 K = Ybxi(mod p) B 可以通过 Xr 和 Ya 计算出公共值 K = Yaxr(mod p) 现在来讨论下,生成 Ya 或者 Yb 使用的材料 g,xi(或者 xr)和 p。 在 RFC2409 中,g 和 p 已经给出,xi 和 xr 通常是随机生成,但是需要记住的一个值,因为 对于计算 SKEYID 等材料的时候,还要用到。 g 在 RFC2409 中指定为 2 p

31、则分为几个 group,比如第一个组是 768 位,在协商的时候,指定为 1: #define MODP768_MODULUS FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF 类似的还有组 2: #define MO

32、DP1024_MODULUS FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 FFFFFFFF FFFFFF

33、FF 对于把这些十六进制数转换成一个大数的功能,在 GMP 库中有函数 mpz_init_set_str 就可以实现,例如(函数 init_crypto 中): mpz_init_set_str( /意思是初始化 mp 为 0 公共值的计算在 compute_dh_shared 这个函数中实现; Function: void mpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2) Function: void mpz_mul_si (mpz_t rop, const mpz_t op1, long int op2) Function: voi

34、d mpz_mul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2) mpz_mul_ui 是 rop = op1*op2 mpz_add_ui 是 rop = op1+op2 材料分享# Function: void mpz_init (mpz_t x) 函数 mpz_init 是初始化 x,并且设置为 0 Function: void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) Function: void mpz_powm_ui

35、 (mpz_t rop, const mpz_t base, unsigned long int exp, const mpz_t mod) mpz_powm 是 rop = (baseexp)%mod 也即 mp_g = (groupgeneratorst-st_sec)%group-modulus mp_g = 2st-st_sec% modp768_modulus st-st_sec 在上文中生成,被叫做 xi; modp768_modulus 是 RFC2409 中规定好的,在初始化的时候,已经赋值了; 所以,这个时候就计算出来了 Ya,最后一步是将 mp_g 转换成网络字节序,并将其

36、保存在 *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 以后

37、,就可以计算 K,同样都是调用函数 compute_dh_shared。我们这里拿发起者来举例说明,当发起者 A 收到 Yb 以后,那计算 K 就变得非常容易了,因为在协商过程中 A 已经生成了 xi(st_sec),Ya,所以 K=Ybxi,用函 数来表达: n_to_mpz 是将公共值 g(Yb),转换成 MP_INT 值。 材料分享# 主要是看这句:mpz_powm( 意思是:mp_shared = mp_gst-st_sec%group-modulus mp_g 就是对方传过来的公共值 Yb st-st_sec 就是我们自己生成的私有密钥 xi group-modulus 就是 RFC

38、2409 文档中规定好的 768bit、1024bit 等固定数值 NAT-D 的计算: HASH = HASH(CKY-I | CKY-R | IP | Port) 符号说明: HDR 是 ISAKMP 的头,它的 exchange type 是协商的模式是协商的模式。当被写成 HDR*的时候, 说明它的负载是加密的。 SA 是一个带有一个或者多个 proposal 负载的 SA 协商负载。一个发起者,或许提供 多个 proposal 用来协商;一个响应者必须只是回应其中的一个。 _b(Payload body)说明是负载的 body。- 没有包含 ISAKMP 通用负载头 SAi_b (S

39、A Initiator body)是整个 SA 负载的 body(加上 ISAKMP 通用头)。例如,由 发起者提供的 DOI,situation,所有 proposal 和所有 transforms 。 CKY-I 和 CKY-R(COOKIE Initiator 和 Cookie Responser)是来自于 ISAKMP 头的发 起者的 cookie 和响应者的 cookie。 材料分享# gxi 和 gxr 是发起者和响应者的 Diifie-Hellman(DH)公共值 gxy 是 DH 共享密钥 gxi and gxr are the Diffie-Hellman (DH) publ

40、ic values of the initiator and responder respectively. gxy is the Diffie-Hellman shared secret. KE(KEY Exchange Payload) 是在 Diffie-Hellman 交换的过程中包含公共信息的 key exchange 负载。 Nx(Nonce Initiator or Respnoser-Ni or Nr) 是一个 nonce 负载;对于发起者或者响应者, x 可以是:i 或者 r 。 IDx(Identification Payload IDii,IDir,IDui,IDur)

41、是一个 identification 负载。在阶段 1 的协 商过程中,对于 ISAKMP 发起者或者响应者,x 可以是:“ii” 或者 “ir”。在阶段 2 中,可 以是:”ui”或者”ur”。ID 负载的格式,需要看 Internet DOI,定义在Pip97。 SIG(Signature payload) 是 signature 负载。 CERT(Certificate Payload) 是证书负载。 HASH(Hash payload) 是 hash 负载。hash 的内容是对应到具体的认证方法。 prf(key,msg)是伪随机功能-通常一个 keyed 哈希功能被用来生成一个确定的

42、输出, 并呈现出伪随机性。被用来生成 key 和认证。 SKEYID 是一个对于在交换中的所有 player 来说,SKEYID 是一个已知并唯一的字符 串。 SKEID_e 是 ISAKMP SA 使用的加密材料(keying material),来保护它的消息的机密。 SKEID_a 是 ISAKMP SA 使用的加密材料,来认证它的消息。 SKEYID_d 是加密的材料,派生自非 ISAKMP 安全联盟。 y说明”x”是被 y 来加密的 从发起者到响应者的通信(requests) 从响应者到发起者的通信(replies) | 信息的连结,例如 X|Y 表示 X 和 Y 的连结 x 说明

43、x 是可选的。 4.2.4IKE 中的加解密 4.3加密材料(RFC2409 Appendix B) 加密材料主要是在函数 generate_skeyids_iv 中生成。 首先是生成 SKEYID 如果类型是预共享的话,调用 skeyid_preshared 如果类型是证书的话,调用函数 skeyid_digisig 以预共享为例,计算如下: #define hmac_init_chunk(ctx, h, ch) hmac_init(ctx), (h), (ch).ptr, (ch).len) #define hmac_update_chunk(ctx, ch) hmac_update(ct

44、x), (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_pres

45、hared(), 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_fi

46、nal_chunk(st-st_skeyid_e, st_skeyid_e in generate_skeyids_iv(), 第一次 IV 向量的生成是基于 DH 交换中的发起者的公共值和响应者的公共值 材料分享# 加密材料的生成是基于 SKEYID_e。加密材料的长度(keysize)是基于加密算法的要求。 加密的函数是:crypto_cbc_encrypt TODOTODO 加密函数的使用 replace_bare_shunt shunt_eroute eroute_connection setup_half_ipsec_sa teardown_half_ipsec_sa crypto_

47、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 !

48、材料分享# 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 头做的检验: 材料分享#

49、图 4-1 IP 头校验和 当 NAT 转换完源 IP 地址后,需要更新头校验和。 TCP 校验和覆盖 TCP 首部和 TCP 数据,而 IP 首部中的校验和只覆盖 IP 的首部,不 覆盖 IP 数据报中的任何数据。TCP 的校验和是必需的,而 UDP 的校验和是可选的。TCP 和 UDP 计算校验和时,都要加上一个 12 字节的伪首部。 TCP 校验和: 图 4-2 TCP 校验和 做完 NAT 后,源地址和源端口都可能发生变化,所以需要更新 TCP 的校验和字段。 UDP 的校验和与 TCP 的一样,只不过伪首部中的 Protocol 字段是 17,而 TCP 的是 6。 来看 AH 头的

50、方式,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/

温馨提示

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

最新文档

评论

0/150

提交评论