




已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
IPSec 實(shí)現(xiàn)分析實(shí)現(xiàn)分析 目目 錄錄 1引言引言 1 1 1編寫目的 1 1 2編寫背景 1 1 3預(yù)期讀者和閱讀建議 1 1 4文檔約定 1 1 5參考資料 1 2詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì) 1 2 1IPSEC介紹 1 2 2IPSEC實(shí)現(xiàn) 6 2 3IPSEC發(fā)包和收包 21 2 4內(nèi)核與 IKE 進(jìn)程通信 25 3IKE 協(xié)商介紹協(xié)商介紹 27 3 1主模式 第一階段 28 3 2野蠻模式 第一階段 34 3 3快速模式 第二階段 35 3 4IKE 進(jìn)程狀態(tài)轉(zhuǎn)換及調(diào)用關(guān)系 38 4哈希的計(jì)算哈希的計(jì)算 41 4 1哈希計(jì)算 41 4 2DH 計(jì)算 43 4 3加密材料 RFC2409 APPENDIX B 48 5IPSEC 穿穿 NAT 50 5 1穿 NAT 討論 50 5 2NAT 穿越原理 53 5 3NAT 穿越實(shí)現(xiàn) 57 5 4兩種模式對(duì)比 59 1引言引言 1 1編寫目的 編寫該文檔的目的是為了更好地理 IPSec 模塊 為了能更好地理解 IPSec 本詳細(xì)設(shè)計(jì) 報(bào)告描述了 IPSec 介紹 數(shù)據(jù)結(jié)構(gòu) IPSec 策略匹配 SA 的查找 struct xfrm lifetime cur bytes add time記錄添加的時(shí) 間 packets use time 0 struct xfrm policy walk entry all dead ipsec策略 1 狀狀態(tài)態(tài)選選擇擇子子 3 模模板板 用用來(lái)來(lái) 匹匹配配SA 生生命命周周期期限限制制 流流量量和和時(shí)時(shí)間間 生生命命周周期期當(dāng)當(dāng)前前 使使用用統(tǒng)統(tǒng)計(jì)計(jì) 流流 量量或或者者時(shí)時(shí)間間 2 安安裝裝安安全全路路由由 圖 2 15 IPSec 策略 這個(gè)時(shí)候 我們可以對(duì)著結(jié)構(gòu)體來(lái)看 IPSEC 大體的流程 查找綁定 安全 路由 數(shù)據(jù)流匹配上策 略上的狀態(tài)選擇 子 找到策略 更新數(shù)據(jù)包的 skb skb dst 創(chuàng)建安全路由 通知IKE 去協(xié) 商SA 匹配上SA 安裝安全路由 到策略上 結(jié)束開(kāi)始 Y N N Y 圖 2 16 流程 策略角度 狀態(tài)選擇子 selector 從數(shù)據(jù)流的角度定義 選擇的數(shù)據(jù)流 被叫做感興趣流 其中 匹配項(xiàng)有對(duì)端地址 本段地址 子網(wǎng)掩碼 協(xié)議簇等信息 bundles 被用來(lái)安裝安全路由 參考圖 2 11 當(dāng)查找不到綁定的安全路由的時(shí)候 就會(huì)先用來(lái)查找 SA 因?yàn)槿绻獎(jiǎng)?chuàng)建一個(gè)安全路由 需要使用 SA 作為材料 SA 為其提 供一些參數(shù) 比如一些處理函數(shù) genid 等 xfrm vec 這個(gè)模板數(shù)組用來(lái)匹配 SA 策略的機(jī)構(gòu)體 struct xfrm policy 如下 struct xfrm policy ifdef CONFIG NET NS struct net xp net endif struct xfrm policy next 下一個(gè)策略 add by lxh for ipsec kernel 2011 12 13 struct hlist nodebydst 按目的地址 HASH 的鏈表 加入到全局鏈表中 init net xfrm policy bydst 相關(guān) struct hlist nodebyidx 按索引號(hào) HASH 的鏈表 加入全局鏈表中 init net xfrm policy byidx struct xfrm policy child add by lxh for ipsec kernel 2011 04 13 This lock only affects elements except for entry rwlock tlock atomic trefcnt 引用次數(shù) struct timer listtimer 策略定時(shí)器 u32priority 策略優(yōu)先級(jí) 如果多個(gè)匹配 則使用最高優(yōu)先級(jí)的 u32index 存放 policy byidx 的下標(biāo) struct xfrm selectorselector 選擇子 struct xfrm lifetime cfg lft 策略生命期 struct xfrm lifetime cur curlft 當(dāng)前的生命期數(shù)據(jù) struct dst entry bundles 安全路由鏈表 struct xfrm policy walk entry walk 加入 init net xfrm policy all 中 u8type u8action 接受 加密 阻塞等 u8flags 標(biāo)記 u8xfrm nr 有幾個(gè)模板 對(duì)應(yīng)本結(jié)構(gòu)體中的數(shù)組 xfrm vec u16family 協(xié)議簇 add by lxh for ipsec kernel 2011 04 13 u32 inbound 入方向 u32 outbound 出方向 u32 pol type 策略類型 u32 pol id 策略 id u32 isdynamic 是否是動(dòng)態(tài) char tunnel name 32 隧道名字 u32 outbound sa spi 出方向的 spi end add by lxh for ipsec kernel 2011 04 13 struct xfrm sec ctx security 安全上下文 struct xfrm tmpl xfrm vec XFRM MAX DEPTH 狀態(tài)模板 struct policy entry policy entry add by lxh for ipsec kernel 2011 04 13 added by liangxia for match peer gw ip 2012 4 11 隧道模式 保護(hù)子網(wǎng)不變 但對(duì)端地址改變 刪除原隧道 SA 引起新隧道不可用 u32peer ip added by liangxia 2012 12 14 s32dev index 接口 ifindex 2 2 2 2 安全聯(lián)盟 SA 上文中多次提到的 SA 究竟是以什么組織的 現(xiàn)在來(lái)揭開(kāi)神秘的面紗 SA 的結(jié)構(gòu)體 圖如下圖 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超時(shí) 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 ealgo calgo saddr出口地址 family AF INET header len 報(bào)文頭總長(zhǎng) 度 ESP頭 初始化向量 IP頭長(zhǎng)度 trailer len ESP尾部總長(zhǎng) 度 包括填充 struct xfrm lifetime cur bytes add time get seconds packets use time xs net net struct xfrm selector daddr 對(duì)端地址 dport目的端口 saddr源地址 sport源端口 dport mask 0 xffff family AF INET sport mask 0 xffff prefixlen d 32 proto fl proto IP頭協(xié)議號(hào) 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 對(duì)端網(wǎng)關(guān)地址 reverse spi spi proto IPPROTO ESP 調(diào)用xfrm get mode 獲取處理指針 調(diào)用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 17 SA 的結(jié)構(gòu)體 內(nèi)核中 SA Security Association 是用結(jié)構(gòu)體 struct xfrm state 來(lái)定義 各個(gè)字段的含義 如下 Full description of state of transformer struct xfrm state ifdef CONFIG NET NS struct net xs net endif union struct hlist nodegclist struct hlist nodebydst 按照目的地址 HASH 與回收重用 struct hlist nodebysrc 按照源地址 HASH struct hlist nodebyspi 按照 SPI 值 HASH atomic trefcnt 引用計(jì)數(shù) spinlock tlock 鎖 struct xfrm idid SA 索引 即目的地址 spi 和協(xié)議號(hào) struct xfrm selectorsel 狀態(tài)選擇子 u32genid 生成 id Key manager bits struct xfrm state walkkm KEY 回調(diào)管理處理結(jié)構(gòu)參數(shù) Parameters of this state struct u32reqid 請(qǐng)求 ID u8mode 模式 傳輸 通道 u8replay window 回放窗口 u8aalgo ealgo calgo 認(rèn)證 加密 壓縮算法 ID 值 u8flags 標(biāo)記 u16family 協(xié)議族 xfrm address tsaddr 源地址 出口地址 intheader len 添加的協(xié)議頭長(zhǎng)度 ESP AH 頭 IP 頭 隧道模式時(shí) inttrailer len 添加的協(xié)議尾長(zhǎng)度 ESP 才有 props SA 相關(guān)參數(shù)結(jié)構(gòu) struct 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 穿越相關(guān)信息 Data for care of address xfrm address t coaddr IPComp needs an IPIP tunnel for handling uncompressed packets struct xfrm state tunnel 通道 實(shí)際上是另一個(gè) SA If a tunnel number of users 1 atomic ttunnel users 通道的使用數(shù) State for replay detection struct xfrm replay state replay 回放檢測(cè)結(jié)構(gòu) 包含各種序列號(hào)掩碼等信息 Replay detection state at the time we sent the last notification struct xfrm replay state preplay 上次的回放記錄值 internal flag that only holds state for delayed aevent at the moment u32xflags 標(biāo)志 Replay detection notification settings u32replay maxage 回放最大時(shí)間間隔 u32replay maxdiff 回放最大差值 Replay detection notification timer struct timer listrtimer 回放檢測(cè)定時(shí)器 Statistics struct xfrm statsstats 統(tǒng)計(jì)值 struct xfrm lifetime cur curlft 當(dāng)前生存周期計(jì)數(shù)器 struct timer listtimer SA 定時(shí)器 Last used time unsigned longlastused Reference to data common to all the instances of this transformer 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 安全上下文 加密時(shí)使用 Private data of this transformer format is opaque interpreted by xfrm type methods void data 內(nèi)部私有數(shù)據(jù) 將在 esp init state ah init state 中被賦 值 2 2 2 3 安全路由鏈表 安全路由鏈表是用來(lái)處理 IPSEC 包 以及發(fā)送的時(shí)候用的 最大的好處是靈活 如圖 2 18 和 2 19 所示 對(duì)于策略的匹配 SA 的匹配 都是為了給數(shù)據(jù)包 skb 上添加處理指針 以便在發(fā)出的時(shí)候進(jìn)行處理 當(dāng)是隧道的模式的時(shí)候 最后一個(gè) dst entry 是通過(guò)查找普通 路由得到的 而傳輸模式 則是直接從 skb 上拷貝就可以得到 因?yàn)楫?dāng)經(jīng)過(guò) FORWARDING 的時(shí)候 數(shù)據(jù)包已經(jīng)是經(jīng)過(guò)路由查找過(guò)的 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相關(guān)處理 AH相關(guān)處理 正常路由處理 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相關(guān)處理 AH相關(guān)處理 正常路由處理 skb buff skb buffdst entry path 正常包 以傳輸模式為例 圖 2 19 安全路由 傳輸模式 結(jié)構(gòu)體如下 忽略不關(guān)心的部分 struct dst entry struct dst entry next struct dst entry child 關(guān)聯(lián)需要處理的下一個(gè)安全路由 struct dst entry path struct xfrm state xfrm 關(guān)聯(lián) SA 2 2 2 4 策略的相關(guān)協(xié)議處理結(jié)構(gòu) 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 ipsec spi 其他協(xié)議的話 fl fl ipsec spi 0 fl proto 存放 ip 頭的協(xié)議號(hào) fl fl4 dst 存放目的地址 fl fl4 src 存放源地址 fl fl4 tos 存放 ip 頭中的 tos 字段值 security xfrm decode session 是不是空的 取決于宏定義 CONFIG SECURITY NETWORK XFRM 存不存在 通過(guò)查看內(nèi)核的配置文件 config 并未 發(fā)現(xiàn) 暫且當(dāng)做是空的處理吧 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 skeyid in skeyid preshared Comment g17 g xy Comment g18 上述表達(dá)式中的 0 如果是 1 則是 u char 1 Comment g19 st st gi Comment g20 st st gr Comment g21 st st shared SKEYID d 的計(jì)算 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 表示十六進(jìn)制 0 x0 1 表示 0 x1 以此類推 4 2DH 計(jì)算 4 2 1DH 交換過(guò)程 首先說(shuō)下 交換的過(guò)程 Ya g xi mod p Yb g xr mod p Host AHost B 將Ya發(fā)送給B 將Yb發(fā)送給A K Yb xi mod p K Ya xr mod p 假設(shè) A 和 B 進(jìn)行交換 A 生成一個(gè) Ya g xi mod p B 生成一個(gè) Yb g xr mod p A 把 Ya 發(fā)送給 B B 把 Yb 發(fā)送給 A 通常發(fā)送生成的公共值 Ya 或者 Yb 是通過(guò) KEY 負(fù)載傳輸?shù)?如上文中所述 當(dāng)收到對(duì)方發(fā)送的公共值 Ya 或者 Yb 以后 就可以計(jì)算出一個(gè)公共密鑰 K A 可以通過(guò) Xi 和 Yb 計(jì)算出公共值 K Yb xi mod p B 可以通過(guò) Xr 和 Ya 計(jì)算出公共值 K Ya xr mod p 現(xiàn)在來(lái)討論下 生成 Ya 或者 Yb 使用的材料 g xi 或者 xr 和 p 在 RFC2409 中 g 和 p 已經(jīng)給出 xi 和 xr 通常是隨機(jī)生成 但是需要記住的一個(gè)值 因?yàn)?對(duì)于計(jì)算 SKEYID 等材料的時(shí)候 還要用到 g 在 RFC2409 中指定為 2 p 則分為幾個(gè) group 比如第一個(gè)組是 768 位 在協(xié)商的時(shí)候 指定為 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 MODP1024 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 FFFFFFFF 對(duì)于把這些十六進(jìn)制數(shù)轉(zhuǎn)換成一個(gè)大數(shù)的功能 在 GMP 庫(kù)中有函數(shù) mpz init set str 就可以實(shí)現(xiàn) 例如 函數(shù) init crypto 中 mpz init set str 意思是初始化 mp 為 0 公共值的計(jì)算在 compute dh shared 這個(gè)函數(shù)中實(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 void 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 并且設(shè)置為 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 mpz t rop const mpz t base unsigned long int exp const mpz t mod 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 中規(guī)定好的 在初始化的時(shí)候 已經(jīng)賦值了 所以 這個(gè)時(shí)候就計(jì)算出來(lái)了 Ya 最后一步是將 mp g 轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序 并將其保存在 g 中 當(dāng)收到 Yb 以后 就可以計(jì)算共享密鑰了 在 crypto 源碼中 存放 xi Ya Yb 和共 享密鑰 K 的變量分別是結(jié)構(gòu)體 struct state 中的 st sec st gi st gr st shared 計(jì)算共享 密鑰 K 的實(shí)現(xiàn)是在 compute dh shared 函數(shù)中 作為發(fā)起者 首先自己生成 Ya st gi 然后收到 Yb st gr 在函數(shù) aggr inR1 outI2 作為響應(yīng)者 首先收到了 Ya st gi 然后生成 Yb st gr 在函數(shù) aggr inI1 outR1 兩邊都收到對(duì)端發(fā)過(guò)來(lái)的公共值 Ya 或者 Yb 以后 就可以計(jì)算 K 同樣都是調(diào)用函數(shù) compute dh shared 我們這里拿發(fā)起者來(lái)舉例說(shuō)明 當(dāng)發(fā)起者 A 收到 Yb 以后 那計(jì)算 K 就變得非常容易了 因?yàn)樵趨f(xié)商過(guò)程中 A 已經(jīng)生成了 xi st sec Ya 所以 K Yb xi 用函 數(shù)來(lái)表達(dá) n to mpz 是將公共值 g Yb 轉(zhuǎn)換成 MP INT 值 主要是看這句 mpz powm 意思是 mp shared mp g st st sec group modulus mp g 就是對(duì)方傳過(guò)來(lái)的公共值 Yb st st sec 就是我們自己生成的私有密鑰 xi group modulus 就是 RFC2409 文檔中規(guī)定好的 768bit 1024bit 等固定數(shù)值 NAT D 的計(jì)算 HASH HASH CKY I CKY R IP Port 符號(hào)說(shuō)明 HDR 是 ISAKMP 的頭 它的 exchange type 是協(xié)商的模式是協(xié)商的模式 當(dāng)被寫成 HDR 的時(shí)候 說(shuō)明它的負(fù)載是加密的 SA 是一個(gè)帶有一個(gè)或者多個(gè) proposal 負(fù)載的 SA 協(xié)商負(fù)載 一個(gè)發(fā)起者 或許提供 多個(gè) proposal 用來(lái)協(xié)商 一個(gè)響應(yīng)者必須只是回應(yīng)其中的一個(gè) b Payload body 說(shuō)明是負(fù)載的 body 沒(méi)有包含 ISAKMP 通用負(fù)載頭 SAi b SA Initiator body 是整個(gè) SA 負(fù)載的 body 加上 ISAKMP 通用頭 例如 由 發(fā)起者提供的 DOI situation 所有 proposal 和所有 transforms CKY I 和 CKY R COOKIE Initiator 和 Cookie Responser 是來(lái)自于 ISAKMP 頭的發(fā) 起者的 cookie 和響應(yīng)者的 cookie g xi 和 g xr 是發(fā)起者和響應(yīng)者的 Diifie Hellman DH 公共值 g xy 是 DH 共享密鑰 g xi and g xr are the Diffie Hellman DH public values of the initiator and responder respectively g xy is the Diffie Hellman shared secret KE KEY Exchange Payload 是在 Diffie Hellman 交換的過(guò)程中包含公共信息的 key exchange 負(fù)載 Nx Nonce Initiator or Respnoser Ni or Nr 是一個(gè) nonce 負(fù)載 對(duì)于發(fā)起者或者響應(yīng)者 x 可以是 i 或者 r IDx Identification Payload IDii IDir IDui IDur 是一個(gè) identification 負(fù)載 在階段 1 的協(xié) 商過(guò)程中 對(duì)于 ISAKMP 發(fā)起者或者響應(yīng)者 x 可以是 ii 或者 ir 在階段 2 中 可 以是 ui 或者 ur ID 負(fù)載的格式 需要看 Internet DOI 定義在 Pip97 SIG Signature payload 是 signature 負(fù)載 CERT Certificate Payload 是證書(shū)負(fù)載 HASH Hash payload 是 hash 負(fù)載 hash 的內(nèi)容是對(duì)應(yīng)到具體的認(rèn)證方法 prf key msg 是偽隨機(jī)功能 通常一個(gè) keyed 哈希功能 被用來(lái)生成一個(gè)確定的輸出 并呈現(xiàn)出偽隨機(jī)性 被用來(lái)生成 key 和認(rèn)證 SKEYID 是一個(gè)對(duì)于在交換中的所有 player 來(lái)說(shuō) SKEYID 是一個(gè)已知并唯一的字符 串 SKEID e 是 ISAKMP SA 使用的加密材料 keying material 來(lái)保護(hù)它的消息的機(jī)密 SKEID a 是 ISAKMP SA 使用的加密材料 來(lái)認(rèn)證它的消息 SKEYID d 是加密的材料 派生自非 ISAKMP 安全聯(lián)盟 y說(shuō)明 x 是被 y 來(lái)加密的 從發(fā)起者到響應(yīng)者的通信 requests 從響應(yīng)者到發(fā)起者的通信 replies 信息的連結(jié) 例如 X Y 表示 X 和 Y 的連結(jié) Comment g22 這個(gè)是密碼素材 Comment g23 Ni b Comment g24 Nr b Comment g25 存放最終生成的 SKEYID Comment g26 g xy Comment g27 上述表達(dá)式中的 0 如果是 1 則是 u char 1 x 說(shuō)明 x 是可選的 4 2 4IKE 中的加解密 4 3加密材料 RFC2409 Appendix B 加密材料主要是在函數(shù) generate skeyids iv 中生成 首先是生成 SKEYID 如果類型是預(yù)共享的話 調(diào)用 skeyid preshared 如果類型是證書(shū)的話 調(diào)用函數(shù) skeyid digisig 以預(yù)共享為例 計(jì)算如下 define hmac init chunk ctx h ch hmac init ctx h ch ptr ch len define hmac 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 的計(jì)算 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 表示十六進(jìn)制 0 x0 1 表示 0 x1 以此類推 SKEYID e 的計(jì)算 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 交換中的發(fā)起者的公共值和響應(yīng)者的公共值 加密材料的生成是基于 SKEYID e 加密材料的長(zhǎng)度 keysize 是基于加密算法的要求 加密的函數(shù)是 crypto cbc encrypt TODO TODO 加密函數(shù)的使用 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 對(duì)數(shù)據(jù)包更新了什么 然后根據(jù)這些特點(diǎn)來(lái)看 IPSEC 什么模式和頭 適用 NAT 會(huì)修改 IP 地址或者端口號(hào) 同時(shí)會(huì)更新校驗(yàn)和 IP 頭 TCP UDP 檢驗(yàn)和 IP 頭的校驗(yàn)和只是對(duì)于 IP 頭做的檢驗(yàn) 圖 4 1 IP 頭校驗(yàn)和 當(dāng) NAT 轉(zhuǎn)換完源 IP 地址后 需要更新頭校驗(yàn)和 TCP 校驗(yàn)和覆蓋 TCP 首部和 TCP 數(shù)據(jù) 而 IP 首部中的校驗(yàn)和只覆蓋 IP 的首部 不 覆蓋 IP 數(shù)據(jù)報(bào)中的任何數(shù)據(jù) TCP 的校驗(yàn)和是必需的 而 UDP 的校驗(yàn)和是可選的 TCP 和 UDP 計(jì)算校驗(yàn)和時(shí) 都要加上一個(gè) 12 字節(jié)的偽首部 TCP 校驗(yàn)和 圖 4 2 TCP 校驗(yàn)和 做完 NAT 后 源地址和源端口都可能發(fā)生變化 所以需要更新 TCP 的校驗(yàn)和字段 UDP 的校驗(yàn)和與 TCP 的一樣 只不過(guò)偽首部中的 Protocol 字段是 17 而 TCP 的是 6 來(lái)看 AH 頭的方式 AH 頭認(rèn)證的是整個(gè)報(bào)文 當(dāng)過(guò) NAT 設(shè)備的時(shí)候 無(wú)法再次更新 AH 頭部中的認(rèn)證 所以 AH 的思想和 NAT 沒(méi)辦法兼容 導(dǎo)致收包方校驗(yàn)失敗丟棄 這樣 的話 不管是傳輸模式還是隧道模式 只要是 AH 頭的方法 都沒(méi)有辦法穿越 NAT 設(shè)備 都會(huì)導(dǎo)致丟棄的結(jié)果 如圖 IP 數(shù)據(jù) TCP UDP other IPAH 認(rèn)證的 這里已經(jīng)做完 TCP UDP的校驗(yàn) 過(guò)VPN設(shè)備進(jìn)行 的封裝與處理 過(guò)NAT設(shè)備進(jìn)行 的處理 數(shù)據(jù) TCP UDP other 數(shù)據(jù) TCP UDP other New IPAH 認(rèn)證的 IP 數(shù)據(jù) TCP UDP other Out IPAH 認(rèn)證的部分 這里已經(jīng)做完 TCP UDP的校驗(yàn) 過(guò)VPN設(shè)備進(jìn)行 的封裝與處理 過(guò)NAT設(shè)備進(jìn)行 的處理 數(shù)據(jù) TCP UDP other New IP IP 數(shù)據(jù) TCP UDP other AH 認(rèn)證的部分 IP 圖 4 3 AH 傳輸模式 AH 隧道模式 再來(lái)看 ESP 頭傳輸模式的情況 IP 數(shù)據(jù) TCP UDP other IP數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 New IP數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 這里已經(jīng)做完 TCP UDP的校驗(yàn) 過(guò)VPN設(shè)備進(jìn)行 的封裝與處理 過(guò)NAT設(shè)備進(jìn)行 的處理 圖 4 4 ESP 頭 傳輸模式 過(guò)完 Nat 設(shè)備后 可能外部的 IP 地址發(fā)生變化 但是數(shù)據(jù)部分的校驗(yàn)無(wú)法更新 導(dǎo)致收到包的設(shè)備對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)不通過(guò)丟棄該包 最后看 ESP 頭 隧道模式的情況 IP 數(shù)據(jù) TCP UDP other Out IP數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 這里已經(jīng)做完 TCP UDP的校驗(yàn) 過(guò)VPN設(shè)備進(jìn)行 的封裝與處理 過(guò)NAT設(shè)備 進(jìn)行的處理 IP New IP數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 IP 圖 4 5 ESP 頭 隧道模式 從圖中可以看出 即便是過(guò) NAT 設(shè)備改變外部 IP 地址 Out IP New IP 也不會(huì) 影響到原始包中的校驗(yàn) 所以能過(guò) NAT 設(shè)備的唯一可能就是 ESP 隧道模式 ESP 協(xié)議在 NAT 環(huán)境下最多只能有一個(gè) VPN 主機(jī)能建立 VPN 通道 無(wú)法實(shí)現(xiàn)多臺(tái)機(jī) 器同時(shí)在 NAT 環(huán)境下進(jìn)行 ESP 通信 為什么 如圖 2 40 所示 當(dāng)分支 A 與中心 點(diǎn) K 建立起來(lái)連接后 在 NAT 設(shè)備上會(huì)形成一個(gè)會(huì)話 當(dāng)分支 B 再嘗試與中心點(diǎn) K 進(jìn) 行通信的時(shí)候 由于會(huì)話與分支 A 的沖突 導(dǎo)致建立不起來(lái) 內(nèi)部網(wǎng)絡(luò) 172 16 2 0 24 內(nèi)部網(wǎng)絡(luò) 192 168 1 0 24 IPSEC 通道 響響應(yīng)應(yīng)方方 NAT設(shè)備 10 10 25 20 202 106 199 34 協(xié)議50 10 10 25 20 69 172 201 208 協(xié)議50 69 172 201 208 202 106 199 34 69 172 201 208 內(nèi)部網(wǎng)絡(luò) 192 168 2 0 24 10 10 25 21 協(xié)議50 10 10 25 21 69 172 201 208 協(xié)議50 69 172 201 208 202 106 199 34 沖突 10 10 25 20數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 IP 202 106 199 34數(shù)據(jù)ESP ESP 填充 ESP校 驗(yàn) 加密 認(rèn)證的 IP 分支A 分支B 中心點(diǎn)K 圖 4 6 穿 NAT 理論分析 cat proc net nf conntrack ipv4 2 unknown 50 28 src 192 168 1 25 dst 2 2 2 2 packets 4 bytes 200 UNREPLIED src 2 2 2 2 dst 2 2 2 1 packets 0 bytes 0 use 2 摘自網(wǎng)絡(luò) ESP 協(xié)議號(hào) 50 沒(méi)有類似于 UDP TCP 端口號(hào)的概念 因此也就沒(méi)有 NAT 復(fù)用標(biāo)識(shí) ESP 要穿越 NAT 還需要想其它辦法 通過(guò)借用 UDP 的方式 巧妙地實(shí)現(xiàn)了 NAT 地址復(fù)用 它使用的是 UDP 端口 500 IKE 協(xié)商協(xié)議 ISAKMP 所使用端口 ESP 在 什么時(shí)候會(huì)進(jìn)行 UDP 封裝呢 它是通過(guò) IKE 協(xié)商時(shí)檢測(cè)出來(lái)的 摘自網(wǎng)絡(luò) 檢測(cè) NAT NAT D 負(fù)載不僅僅是檢測(cè)兩個(gè) IKE 對(duì)等體之間存在 NAT 設(shè)備 而且要檢測(cè) NAT 設(shè)備的位置 檢測(cè) IKE 對(duì)等體之間是否存在 NAT 通過(guò)檢測(cè) IP 地址和端 口是否在傳輸?shù)穆窂缴媳恍薷膩?lái)決定 具體過(guò)程是 首先發(fā)送各自的 ip 和端口的哈希 值給對(duì)方 如果 IKE 對(duì)等體收到哈希值計(jì)算后發(fā)現(xiàn)沒(méi)有被修改那就表明兩個(gè) IKE 對(duì)等 體之間沒(méi)有 NAT 設(shè)備 如果計(jì)算后發(fā)現(xiàn)哈希值被修改那就表明 IKE 對(duì)等體之間存在 NAT 設(shè)備并翻譯了地址和端口 NAT D 負(fù)載包含在主模式的第三和第四個(gè)數(shù)據(jù)包中 5 2NAT 穿越原理 NAT 穿越 NAT Traversal NAT T 經(jīng)過(guò)上述穿 NAT 討論后 我們知道 只有隧道模 式 ESP 才能穿 NAT 那么如何知道有沒(méi)有 NAT 存在 怎么穿越呢 在 RFC 3947 給出了 解決方法 也即在外層 IP 頭和 ESP 頭之間加入 UDP 頭 就可以解決 4 1 中討論最后的問(wèn) 題 同時(shí)巧妙地實(shí)現(xiàn)了 NAT 地址復(fù)用 如圖所示 新IP頭UDP頭ESP頭ESP載荷 原始IP 原始載荷 ESP尾 圖 4 7 穿 NAT 新增 UDP 頭 5 2 1NAT 檢測(cè) NAT 檢測(cè)是看通信中是否存在 NAT 設(shè)備和對(duì)方是否支持 NAT T 檢測(cè)對(duì)方是否支持 NAT T 是通過(guò)交換 vendor ID 載荷來(lái)實(shí)現(xiàn)的 如果自身支持 NAT T 在 IKE 開(kāi)始交互就要發(fā)送這種載荷 載荷內(nèi)容是 RFC 3947 的 MD5 值 也就是十六 進(jìn)制的 4a131c81070358455c5728f20e95452f 判斷是否在 NAT 設(shè)備后面是通過(guò)發(fā)送 NAT D NAT Discovery 載荷來(lái)實(shí)現(xiàn)的 載荷內(nèi) 容是 IP 地址和 UDP 端口的 HASH 值 NAT D 載荷格式如下 載荷類型值是 20 圖 4 8 NAT D 格式 HASH 值的計(jì)算方法如下 具體 HASH 是根據(jù)協(xié)商來(lái)確定的 HASH HASH CKY I CKY R IP Port CKY I 和 CKY R 是協(xié)商發(fā)起方和響應(yīng)方的 cookie 協(xié)商中雙方各自至少要發(fā)送兩個(gè) NAT D 載荷 第一個(gè)載荷是對(duì)方的地址和端口的 HASH 后面的載荷是自己的地址和端口 如果本地有多個(gè)地址 則要發(fā)送多個(gè)載荷 包 括所有地址和端口的 HASH 對(duì)方接收到載荷后重新根據(jù)收到的包的實(shí)際地址端口來(lái)計(jì)算 HASH 值后進(jìn)行比較 就可以知道是否有 NAT 設(shè)備以及哪一方在 NAT 設(shè)備之后了 報(bào)文中的 NAT D 負(fù)載可以有多個(gè) NAT D 對(duì)方地址和端口的哈希 NAT D 本地接口的地址和端口 NAT D 本地接口的地址和端口 檢測(cè)過(guò)程 1 接收方接收到 NAT D 負(fù)載后 首先用自己的發(fā)送包時(shí)的 IP 和源端口計(jì)算一個(gè)哈 希 并與第一個(gè) NAT D 進(jìn)行比較 如果不一樣 則可以知道 我們的設(shè)備在 NAT 后面 地址不是公網(wǎng)地址 2 接收方接收到 NAT D 負(fù)載后 拿收到包的源 IP 地址和端口 與第 2 個(gè)及以后的 NAT D 的負(fù)載進(jìn)行比較 如果不一樣 則對(duì)端在 NAT 后面 在協(xié)商時(shí) 發(fā)現(xiàn)了自己在 NAT 設(shè)備之后的一方立即要將協(xié)商端口從 500 該為 4500 源和目的端口都是 4500 此時(shí)協(xié)商數(shù)據(jù)包格式為 IP頭 UDP 4500 4500 non ESP marker HDR IDii CERT SIG I 圖 4 9 IKE 協(xié)商包 端口變化 其中 non ESP marker 為 4 字節(jié) 在后面介紹其值 接收方接收此包解密并認(rèn)證通過(guò)后 要改變自己的狀態(tài)將原來(lái)處理 500 端口狀態(tài)改為 處理 4500 端口 后續(xù)的協(xié)商過(guò)程都使用 4500 端口進(jìn)行 以后 500 端口收到的不是新協(xié)商 的包都將被丟棄 協(xié)商過(guò)程為 Initiator Responder UDP 500 500 HDR SA VID 值得注意的是只是在傳輸模式下需要 NAT OA 負(fù)載 隧道模式是不需要的 其實(shí)就協(xié) 商本身來(lái)說(shuō) 是不需要 NAT OA 的 因?yàn)閰f(xié)商的報(bào)文是 UDP 報(bào)文 穿 NAT 的時(shí)候 校驗(yàn) 和自然會(huì)被 NAT 設(shè)備所更新 為什么在協(xié)商中添加 NAT OA 負(fù)載呢 是由于后續(xù)使用 ESP 傳輸模式的時(shí)候 因?yàn)?沒(méi)有辦法更新 TCP UDP 負(fù)載的校驗(yàn)和 所以需要協(xié)商出來(lái)的 NAT OA 中記錄的原始 IP 地 址進(jìn)行校驗(yàn) 5 2 3UDP 封裝格式 UDP 封裝 ESP 包格式 如下圖所示 UDP 頭是標(biāo)準(zhǔn) RFC0768 頭 但是 源端口和目的端口都必須是相同的 校驗(yàn)和字段應(yīng)該設(shè)為 0 接收者必須不能依賴于 UDP 校驗(yàn)和 ESP 本身有完整性認(rèn)證功能 不需要 UDP 的校驗(yàn)和 ESP 頭的最開(kāi)始 4 個(gè)字節(jié)是 SPI 字段 該字段絕不能是 0 圖 4 11 UDP 封裝 ESP 包格式 UDP 封裝 IKE 數(shù)據(jù)包格式
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 兒科副高面試題及答案
- 學(xué)前數(shù)學(xué)教師工作總結(jié)
- 2025年 黃石市勞動(dòng)就業(yè)管理局政府雇員招聘考試筆試試卷附答案
- 吧臺(tái)酒水培訓(xùn)
- 2025年中國(guó)攀爬安全帶行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 2025年中國(guó)尿失禁內(nèi)褲行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 員工感恩心態(tài)培訓(xùn)
- 入院護(hù)理要點(diǎn)與入院宣教
- 品質(zhì)方面培訓(xùn)
- 下肢靜脈血栓內(nèi)科診療規(guī)范
- 中外航海文化知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春中國(guó)人民解放軍海軍大連艦艇學(xué)院
- 國(guó)家開(kāi)放大學(xué)《中國(guó)法律史》形考任務(wù)1-3答案
- 人工智能引論智慧樹(shù)知到課后章節(jié)答案2023年下浙江大學(xué)
- 食堂從業(yè)人員知識(shí)培訓(xùn)考核試題與答案
- 合同能源管理協(xié)議書(shū)范本
- 壓力容器使用年度檢查報(bào)告(范本)
- 壓力管道安裝質(zhì)量證明書(shū)新
- 轉(zhuǎn)預(yù)備、預(yù)備轉(zhuǎn)正各種無(wú)記名投票表格匯總(20201230021242)
- 腰椎間盤突出癥的診斷、鑒別診斷與分型
- 閥體零件機(jī)械加工工藝及裝備設(shè)計(jì)
- LD型單梁起重機(jī)使用說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論