IPSEC實現(xiàn)分析[分享借鑒]_第1頁
IPSEC實現(xiàn)分析[分享借鑒]_第2頁
IPSEC實現(xiàn)分析[分享借鑒]_第3頁
IPSEC實現(xiàn)分析[分享借鑒]_第4頁
免費預覽已結束,剩余60頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、材料分享# IPSec 實現(xiàn)分析實現(xiàn)分析 目目 錄錄 1引言引言.1 1.1編寫目的.1 1.2編寫背景.1 1.3預期讀者和閱讀建議.1 1.4文檔約定.1 1.5參考資料.1 2詳細設計詳細設計.1 2.1IPSEC介紹.1 2.2IPSEC實現(xiàn).6 2.3IPSEC發(fā)包和收包.21 2.4內核與 IKE 進程通信.25 3IKE 協(xié)商介紹協(xié)商介紹.27 3.1主模式(第一階段).28 3.2野蠻模式(第一階段).34 3.3快速模式(第二階段).35 3.4IKE 進程狀態(tài)轉換及調用關系.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 穿越實現(xiàn).57 5.4兩種模式對比.59 材料分享# 1引言引言 1.1編寫目的 編寫該文檔的目的是為了更好地理 IPSec 模塊。為了能更好地理解 IPSec,本詳細設計 報告描述了 IPSec 介紹、數(shù)據(jù)結構、IPSec 策略匹配、SA 的查找 struct xfrm_lifetime_cur bytes add_time記錄添加的時 間 packets use_time=0 struct xfrm_policy_walk_entry al

3、l dead ipsec策略 1.狀狀態(tài)態(tài)選選擇擇子子 3.模模板板:用用來來 匹匹配配SA 生生命命周周期期限限制制 (流流量量和和時時間間) 生生命命周周期期當當前前 使使用用統(tǒng)統(tǒng)計計(流流 量量或或者者時時間間) 2.安安裝裝安安全全路路由由 圖 2-15 IPSec 策略 這個時候,我們可以對著結構體來看 IPSEC 大體的流程: 查找綁定(安全 路由) 數(shù)據(jù)流匹配上策 略上的狀態(tài)選擇 子(找到策略) 更新數(shù)據(jù)包的 skb-_skb_dst 創(chuàng)建安全路由 通知IKE,去協(xié) 商SA 匹配上SA? 安裝安全路由 到策略上 結束開始 Y N N Y 圖 2-16 流程(策略角度) 狀態(tài)選擇子

4、(selector):從數(shù)據(jù)流的角度定義選擇的數(shù)據(jù)流 ,被叫做感興趣流,其中 匹配項有對端地址、本段地址、子網(wǎng)掩碼、協(xié)議簇等信息; 材料分享# bundles:被用來安裝安全路由(參考圖 2-11) ;當查找不到綁定的安全路由的時候, 就會先用來查找 SA,因為如果要創(chuàng)建一個安全路由,需要使用 SA 作為材料。SA 為其提 供一些參數(shù),比如一些處理函數(shù)、genid 等。 xfrm_vec:這個模板數(shù)組用來匹配 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;/*引用次數(shù)*/ struct timer_listtimer;/*策略定時器*/ u32priority;/*策略優(yōu)先級,如果多個匹配,則使用最高優(yōu)先級的*/ u32index;/*存放 policy_byidx 的下標*/ struct xfrm_selectorselector; /*選擇子*/ struct xfrm_lifetime_cfg lft;/*策略生命期*/ struct xfrm_life

7、time_cur curlft;/ 當前的生命期數(shù)據(jù) struct dst_entry *bundles;/*安全路由鏈表*/ struct xfrm_policy_walk_entry walk;/*加入 init_net-xfrm-policy_all 中*/ u8type; u8action;/*接受/加密/阻塞等*/ u8flags;/*標記*/ u8xfrm_nr;/*有幾個模板,對應本結構體中的數(shù)組 xfrm_vec*/ u16family;/*協(xié)議簇*/ /add by lxh for ipsec kernel, 2011 04.13 u32 inbound; /*入方向*/ u

8、32 outbound;/*出方向*/ u32 pol_type; /*策略類型*/ u32 pol_id;/*策略 id*/ u32 isdynamic;/*是否是動態(tài)?*/ 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;/*狀態(tài)模板*/ 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 / 隧道模式,保護子網(wǎng)不變,但對端地址改變 / 刪除原隧道 SA 引起新隧道不可用 u32peer_ip; / added by liangxia, 2012.12.14 s32dev_index;/接口 ifindex ; 2.2.2.2 安全聯(lián)盟 SA 上文中多次提到的 SA,究竟是以什么組織的,現(xiàn)在來揭開神秘的面紗。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(根據(jù)sel.family和props.mode推 出)=xfrm4_tunnel_mode或者 xfrm4_transport_mode security outer_mode(根據(jù)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頭協(xié)議號) 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=對端網(wǎng)關地址 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;/ 引用計數(shù) spinlock_tlock;/ 鎖 struct xfrm_idid;/ SA 索引,即目的地址,spi 和協(xié)議號 struct xfrm_selectorsel;/ 狀態(tài)選擇子 u32genid;/生成 id /* Key manager bits */ struct xfrm_state_walkkm; / KEY 回調管理處理結構參數(shù)

17、/* Parameters of this state. */ struct u32reqid;/請求 ID u8mode;/ 模式: 傳輸/通道 u8replay_window;/ 回放窗口 u8aalgo, ealgo, calgo;/ 認證,加密,壓縮算法 ID 值 u8flags;/標記 u16family;/ 協(xié)議族 xfrm_address_tsaddr;/ 源地址(出口地址) intheader_len;/ 添加的協(xié)議頭長度, ESP/AH 頭(+IP 頭,隧道模式時) inttrailer_len;/ 添加的協(xié)議尾長度, ESP 才有 props; / SA 相關參數(shù)結構 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;/通道的使用數(shù) /* 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; / 統(tǒng)計值 struct xfrm_lifetime_cur curlft;/ 當前生存周期計數(shù)器 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;/函數(shù)處理指針 struct xfrm_mode*inner_mode_iaf;/ struct xfrm_mode*outer_mode;/函數(shù)處理指針 /* Security context */ struct xfrm_sec_ctx*security;/ 安全上下文, 加密時使用 /* Private data of this transformer, format is opaque, * interpreted by xfrm_t

23、ype methods. */ void*data;/ 內部私有數(shù)據(jù), 將在 esp_init_state/ ah_init_state 中被賦 值 ; 2.2.2.3 安全路由鏈表 安全路由鏈表是用來處理 IPSEC 包,以及發(fā)送的時候用的,最大的好處是靈活。如圖 2-18 和 2-19 所示。對于策略的匹配,SA 的匹配,都是為了給數(shù)據(jù)包 skb 上添加處理指針, 以便在發(fā)出的時候進行處理。當是隧道的模式的時候,最后一個 dst_entry 是通過查找普通 路由得到的;而傳輸模式,則是直接從 skb 上拷貝就可以得到,因為當經(jīng)過 FORWARDING 的時候,數(shù)據(jù)包已經(jīng)是經(jīng)過路由查找過的(

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; /關聯(lián)需要處理的下一個安全路由 struct dst_entry*path;

26、 struct xfrm_state*xfrm; /關聯(lián) SA ; 2.2.2.4 策略的相關協(xié)議處理結構 family=AF_INET garbage_collect=_xfrm_garbage_collect dst_ops= 如果是 ICMP 協(xié)議的話,填充 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 其他協(xié)議的話,fl-fl_ipsec_spi=0 fl-proto 存放 ip 頭的協(xié)議號 fl-fl4_dst 存放目的地址 fl-fl4_src 存放源地址 材料分享# fl-fl4_tos 存放 ip 頭中的 tos 字段值 security_xfrm_decode_session 是不是空的,取決于宏定義 CONFIG_SECURITY_NETWORK_XFRM 存不存在,通過查看內核的配置文件.config 并未 發(fā)現(xiàn),暫且當做是空的處理吧。 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發(fā)送給B 將Yb發(fā)送給A K=Ybxi(mod p)K=Yaxr(mod p) 假設 A 和 B 進行交換,A 生成一個 Ya=gxi(mod p),B 生成一個 Yb=gxr(mod p), A 把 Ya 發(fā)送給 B; B 把 Yb 發(fā)送給 A; 材料分享

30、# 通常發(fā)送生成的公共值 Ya 或者 Yb 是通過 KEY 負載傳輸?shù)?,如上文中所述?當收到對方發(fā)送的公共值 Ya 或者 Yb 以后,就可以計算出一個公共密鑰 K: A 可以通過 Xi 和 Yb 計算出公共值 K = Ybxi(mod p) B 可以通過 Xr 和 Ya 計算出公共值 K = Yaxr(mod p) 現(xiàn)在來討論下,生成 Ya 或者 Yb 使用的材料 g,xi(或者 xr)和 p。 在 RFC2409 中,g 和 p 已經(jīng)給出,xi 和 xr 通常是隨機生成,但是需要記住的一個值,因為 對于計算 SKEYID 等材料的時候,還要用到。 g 在 RFC2409 中指定為 2 p

31、則分為幾個 group,比如第一個組是 768 位,在協(xié)商的時候,指定為 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 對于把這些十六進制數(shù)轉換成一個大數(shù)的功能,在 GMP 庫中有函數(shù) mpz_init_set_str 就可以實現(xiàn),例如(函數(shù) init_crypto 中): mpz_init_set_str( /意思是初始化 mp 為 0 公共值的計算在 compute_dh_shared 這個函數(shù)中實現(xiàn); 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) 函數(shù) 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 中規(guī)定好的,在初始化的時候,已經(jīng)賦值了; 所以,這個時候就計算出來了 Ya,最后一步是將 mp_g 轉換成網(wǎng)絡字節(jié)序,并將其

36、保存在 *g 中。 當收到 Yb 以后,就可以計算共享密鑰了,在 crypto 源碼中,存放 xi,Ya、Yb、和共 享密鑰 K 的變量分別是結構體 struct state 中的 st_sec、st_gi、st_gr、st_shared。計算共享 密鑰 K 的實現(xiàn)是在 compute_dh_shared 函數(shù)中。 作為發(fā)起者:首先自己生成 Ya(st_gi),然后收到 Yb(st_gr),在函數(shù) aggr_inR1_outI2 作為響應者:首先收到了 Ya(st_gi),然后生成 Yb(st_gr),在函數(shù) aggr_inI1_outR1 兩邊都收到對端發(fā)過來的公共值 Ya 或者 Yb 以后

37、,就可以計算 K,同樣都是調用函數(shù) compute_dh_shared。我們這里拿發(fā)起者來舉例說明,當發(fā)起者 A 收到 Yb 以后,那計算 K 就變得非常容易了,因為在協(xié)商過程中 A 已經(jīng)生成了 xi(st_sec),Ya,所以 K=Ybxi,用函 數(shù)來表達: 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 文檔中規(guī)定好的 768bit、1024bit 等固定數(shù)值 NAT-D 的計算: HASH = HASH(CKY-I | CKY-R | IP | Port) 符號說明: HDR 是 ISAKMP 的頭,它的 exchange type 是協(xié)商的模式是協(xié)商的模式。當被寫成 HDR*的時候, 說明它的負載是加密的。 SA 是一個帶有一個或者多個 proposal 負載的 SA 協(xié)商負載。一個發(fā)起者,或許提供 多個 proposal 用來協(xié)商;一個響應者必須只是回應其中的一個。 _b(Payload body)說明是負載的 body。- 沒有包含 ISAKMP 通用負載頭 SAi_b (S

39、A Initiator body)是整個 SA 負載的 body(加上 ISAKMP 通用頭)。例如,由 發(fā)起者提供的 DOI,situation,所有 proposal 和所有 transforms 。 CKY-I 和 CKY-R(COOKIE Initiator 和 Cookie Responser)是來自于 ISAKMP 頭的發(fā) 起者的 cookie 和響應者的 cookie。 材料分享# gxi 和 gxr 是發(fā)起者和響應者的 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 負載;對于發(fā)起者或者響應者, x 可以是:i 或者 r 。 IDx(Identification Payload IDii,IDir,IDui,IDur)

41、是一個 identification 負載。在階段 1 的協(xié) 商過程中,對于 ISAKMP 發(fā)起者或者響應者,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、輸出, 并呈現(xiàn)出偽隨機性。被用來生成 key 和認證。 SKEYID 是一個對于在交換中的所有 player 來說,SKEYID 是一個已知并唯一的字符 串。 SKEID_e 是 ISAKMP SA 使用的加密材料(keying material),來保護它的消息的機密。 SKEID_a 是 ISAKMP SA 使用的加密材料,來認證它的消息。 SKEYID_d 是加密的材料,派生自非 ISAKMP 安全聯(lián)盟。 y說明”x”是被 y 來加密的 從發(fā)起者到響應者的通信(requests) 從響應者到發(fā)起者的通信(replies) | 信息的連結,例如 X|Y 表示 X 和 Y 的連結 x 說明

43、x 是可選的。 4.2.4IKE 中的加解密 4.3加密材料(RFC2409 Appendix B) 加密材料主要是在函數(shù) generate_skeyids_iv 中生成。 首先是生成 SKEYID 如果類型是預共享的話,調用 skeyid_preshared 如果類型是證書的話,調用函數(shù) 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 交換中的發(fā)起者的公共值和響應者的公共值 材料分享# 加密材料的生成是基于 SKEYID_e。加密材料的長度(keysize)是基于加密算法的要求。 加密的函數(shù)是:crypto_cbc_encrypt TODOTODO 加密函數(shù)的使用 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 對數(shù)據(jù)包更新了什么,然后根據(jù)這些特點來看 IPSEC 什么模式和頭 適用。 NAT 會修改 IP 地址或者端口號,同時會更新校驗和(IP 頭、TCP/UDP 檢驗和) IP 頭的校驗和只是對于 IP 頭做的檢驗: 材料分享#

49、圖 4-1 IP 頭校驗和 當 NAT 轉換完源 IP 地址后,需要更新頭校驗和。 TCP 校驗和覆蓋 TCP 首部和 TCP 數(shù)據(jù),而 IP 首部中的校驗和只覆蓋 IP 的首部,不 覆蓋 IP 數(shù)據(jù)報中的任何數(shù)據(jù)。TCP 的校驗和是必需的,而 UDP 的校驗和是可選的。TCP 和 UDP 計算校驗和時,都要加上一個 12 字節(jié)的偽首部。 TCP 校驗和: 圖 4-2 TCP 校驗和 做完 NAT 后,源地址和源端口都可能發(fā)生變化,所以需要更新 TCP 的校驗和字段。 UDP 的校驗和與 TCP 的一樣,只不過偽首部中的 Protocol 字段是 17,而 TCP 的是 6。 來看 AH 頭的

50、方式,AH 頭認證的是整個報文,當過 NAT 設備的時候,無法再次更新 AH 頭部中的認證,所以 AH 的思想和 NAT 沒辦法兼容,導致收包方校驗失敗丟棄。這樣 的話,不管是傳輸模式還是隧道模式,只要是 AH 頭的方法,都沒有辦法穿越 NAT 設備, 都會導致丟棄的結果。如圖: IP 數(shù)據(jù) (TCP/UDP/other) IPAH 認證的 這里已經(jīng)做完 TCP/UDP的校驗 過VPN設備進行 的封裝與處理 過NAT設備進行 的處理 數(shù)據(jù) (TCP/UDP/other) 數(shù)據(jù) (TCP/UDP/other) New-IPAH 認證的 IP 數(shù)據(jù) (TCP/UDP/other) Out-IPAH 認證的部分 這里已經(jīng)做完 TCP/UDP的校驗 過VPN設備進行 的封裝與處理 過NAT設備進行 的處理 數(shù)據(jù) (TCP/UDP/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論