ÏêϸÉè¼ÆËµÃ÷ÊéʾÀý ÏÂÔØ±¾ÎÄ

1£®ÒýÑÔ

1.1±àдĿµÄ

±¾ËµÃ÷ÊéÌṩÁËfreeswan¸÷¸öÄ£¿é²¿¼þµÄ˵Ã÷£¬ÒÔ¹©±àÂëÈËÔ±¾ßÌåʵÏÖ¼°½ñºóµÄά»¤¹¤×÷¡£

2£®×ÜÌåÉè¼Æ

2.1Éè¼ÆÔ­Ôò

ÔÚÈ·¶¨Ä¿±êϵͳµÄ¹ý³ÌÖУ¬Ö÷Òª×ñÑ­ÁËÒÔϼ¸¸öÔ­Ôò£º

? Ä¿±êϵͳ»ù±¾ÉÏÍêÕûµØÊµÏÖIPSecЭÒé×壬Íêȫ֧³ÖVPNµÄÒªÇó£» ? Ä¿±êϵͳµÄ·þÎñÆ÷¶ËÒ»¶¨Òª½¨Á¢ÔÚ¾ßÓÐ×ÔÖ÷°æÈ¨µÄÄں˲Ù×÷ϵͳ֮ÉÏ£» ? Ä¿±êϵͳµÄ¿Í»§¶ËʹÓ÷½±ã¡¢½çÃæÓѺá¢ÅäÖú͹ÜÀí¼òµ¥Áé»î¡£

2.2 Èí¼þ½á¹¹

¸ÃÈí¼þÓÉÈçϼ¸¸öÄ£¿é×é³É£º

? KLIPSÄ£¿é¨D¨D ʵÏÖ¶Ô½øÈë»òÍâ³öIP°üµÄ°²È«´¦Àí£¬È磺¼ÓÃÜ¡¢ÈÏÖ¤µÈ£¨ÔËÐÐÔÚÄÚºË

¿Õ¼ä£©

? PlutoÄ£¿é¨D¨D ʵÏÖIKEЭÒ飬Íê³É°²È«ÁªÃ˵ÄЭÉÌ£¨ÔËÐÐÔÚÓû§¿Õ¼ä£© ? PF_KEYÄ£¿é¨D¨D ʵÏÖpfkey2ЭÒ飬Íê³ÉÉÏÊöÁ½¸öÄ£¿é¼ä¹ØÓÚSAµÄͨÐÅ

3£®³ÌÐòÃèÊö

3.1Ô´´úÂëÎļþ×é³É

±¾³ÌÐòÓÉÁ½´óÄ£¿é×é³É£¬Ò»²¿·ÖÊÇklips£¬ËüÔËÐÐÔÚ²Ù×÷ϵͳÄں˿ռ䣬Ö÷Òª¸ºÔð°²È«ÁªÃ˺ÍÃÜÔ¿µÄ¹ÜÀí¹¤×÷£¬ÒÔ¼°¶ÔÊý¾Ý±¨µÄ¼ÓÃÜ¡¢½âÃܵĴ¦Àí¹¤×÷£»Ò»²¿·ÖÊÇpluto£¬ËüÊÇÒ»¸öÔËÐÐÔÚÓû§¿Õ¼äµÄÊØ»¤½ø³Ì£¬Ö÷Òª¸ºÔð°²È«ÁªÃ˵ÄЭÉ̹¤×÷¡£ÏÂÃæ·Ö±ðÊÇËüÃǵÄÎļþ×é³É£º

Ô´ÎļþĿ¼

|¨D¨D¨Dfreeswan

|¨D¨Dklips

|¨D¨Dlibdes |¨D¨Dpluto |¨D¨Dutils

3.2 KLIPS£¨ÄÚºËIPsec£©ÏêϸÉè¼Æ

£­£­¨D¨D¨Dklips

ipsecµÄºËÐÄʵÏÖÄ£¿é

|¨D¨Dnet

|¨D¨Dipsec

|¨D¨Dipsec_init.c |¨D¨Dipsec_tunnel. |¨D¨Dipsec_rcv.c

µÇ¼ÇÄ£¿é£¬²¢³õʼ»¯ Êý¾Ý°üµÄ´¦Àí²¢·¢ËÍÄ£¿é Êý¾Ý°ü½ÓÊÕ²¢´¦ÀíÄ£¿é ¹ÜÀíSAµÄÄ£¿é

sha1ʵÏÖÄ£¿é£¬ÓÉsha1.c¸Ä±à md5.cʵÏÖÄ£¿é

|¨D¨Dipsec_xform.c |¨D¨Dipsec_sha1.c |¨D¨Dipsec_md5c.c |¨D¨Dipcomp.c |¨D¨Dradij.c

·ÓɱíµÄradixÊýµÄʵÏÖÄ£¿é ¶ÔÉϸöÎļþµÄ¸Ä±à ʵÏÖPF_KEY2ЭÒéµÄÄ£¿é

|¨D¨Dipsec_radij.c |¨D¨Dpfkey_v2.c

|¨D¨Dpfkey_v2_parser.c ¶ÔÉϸöÎļþµÄ¸Ä±à |¨D¨Dsysctl_net_ipsec.c

|¨D¨Dutils

|¨D¨Deroute.c |¨D¨Dspi.c

Óû§²Ù×÷eroute±íµÄÄ£¿é Óû§²Ù×÷SA¿âµÄÄ£¿é ͬÉÏ

Óû§²Ù×÷Ðé½Ó¿ÚµÄÄ£¿é

|¨D¨Dspigrp.c |¨D¨Dtncfg.c

|¨D¨Dklipsdebug.c

3.2.1µÇ¼Ç¼°³õʼ»¯Ä£¿é

3.2.1.1¸ÅҪ˵Ã÷ 3.2.1.1.1¹¦ÄÜ

ÏòÄÚºËϵͳµÇ¼Ç¼¸¸öprocÎļþ£¬ÒÔ±ãÓÚÏòÄں˿ռäÖвéѯ°²È«ÁªÃ˺Íeoute±í£¬ÒÔ¼°

Ðé½Ó¿ÚµÄ×´¿ö£»

³õʼ»¯SAÊý¾Ý¿â£¨tdbÁ´£©£» ³õʼ»¯SPDBÊý¾Ý¿â£¨eroute±í£©£» ³õʼ»¯pf_key£¨PF_KEYÌ×½Ó¿Ú£©£» 3.2.1.1.2Ä£¿éËùÉæ¼°µÄÎļþ

ipsec_init.c: ipsec_xform.c: ipsec_radij.c: pfkey_v2.c: 3.2.1.2±äÁ¿ËµÃ÷ 3.2.1.2.1 procÎļþ½á¹¹

½«ÏÂÁнṹµÇ¼Çµ½ÄÚºËϵͳÖУ¬ÔòÄں˾ͿÉÒÔͨ¹ýprocÎļþϵͳÏòÓ¦ÓóÌÐòÌṩһ¸ö°²È«µÄ½çÃæÀ´´æÈ¡ÈçSA¡¢eroute±íµÈ×ÊÁÏ¡£

struct proc_dir_entry ipsec_eroute ; struct proc_dir_entry ipsec_spi ; struct proc_dir_entry ipsec_spigrp ; struct proc_dir_entry ipsec_tncfg ; struct proc_dir_entry ipsec_spinew ; struct proc_dir_entry ipsec_klipsdebug ; 3.2.1.2.2 notifier_block½á¹¹

struct notifier_block½á¹¹ÊÇÔÚinclude/linux/notifier.hÀïÃæµÄ£º struct notifier_block {

int (*notifier_call)(struct notifier_block *self, unsigned long, void *); struct notifier_block *next; int priority; };

¶øregister_netdevice_notifierº¯ÊýÔÚnet/core/dev.cÀïÃæ£¬ÊÇÕâÑùµÄ£º int register_netdevice_notifier(struct notifier_block *nb) {

return notifier_chain_register(&netdev_chain, nb); }

int ipsec_init(void) int ipsec_tdbinit(void) int ipsec_radijinit(void)

int pfkey_init(void)

¶ønotifier_chain_registerº¯ÊýÔÚinclude/linux/notifier.hÀïÃæ£¬ÊÇÕâÑùµÄ£º extern __inline__ int notifier_chain_register(

struct notifier_block **list, struct notifier_block *n)

{

while(*list) {

if(n->priority > (*list)->priority) break;

list= &((*list)->next); }

n->next = *list; *list=n; return 0; }

ÏÔÈ»¾ÍÊǸù¾Ýÿ¸öblockµÄÓÅÏȼ¶°ÑÕâ¸öblockÅÅÁÐÔÚÒ»¸öblockµÄÁ´±íÀïÃæ£¬ÔÚnotifier_chain_registerº¯ÊýÀïÃæÎÒÃÇ¿ÉÒÔ·¢ÏÖÕâ¸öÁ´±íÊÇnetdev_chain¡£Êµ¼ÊÉÏÕâ¸öÁ´±íµÄ×÷ÓþÍÊÇÔÚÿ¸öinterface´ò¿ª£¬¹Ø±Õ״̬¸Ä±ä»òÕßÍâ½çµ÷ÓÃÏàÓ¦µÄioctlµÄʱºò֪ͨÕâ¸öÁ´±íÉÏÃæµÄËùÓÐÏà¹ØµÄÉ豸£¬¶øÃ¿Ò»¸öЭÒé¶¼µ÷ÓÃregister_netdevice_notifier×¢²áÁËÒ»¸önetdev_notifierµÄ½á¹¹Ì壬ÕâÑù¾Í¿ÉÒÔÔÚinterface¸Ä±äµÄʱºòµÃµ½Í¨ÖªÁË(ͨ¹ýµ÷ÓÃÿ¸önotifier_callº¯Êý)¡£ 3.2.1.2.3 inet_protocol½á¹¹ struct inet_protocol ah_protocol = {

ipsec_rcv, NULL, 0,

/* AH handler ,¶¨Òå´ËЭÒé´¦Àíº¯Êý*/ /* TUNNEL error control£¬´íÎó´¦Àíº¯Êý */ /* next */

IPPROTO_AH, 0,

/* protocol ID */

/* copy */ /* data */ /* name */

NULL, \};

ipsec_rcvº¯ÊýÊÇÓÃÀ´½ÓÊÕÊý¾ÝµÄcallbackº¯Êý£¬µÚ¶þ¸öÊÇ´íÎó´¦Àíº¯Êý£¬ÆäËüµÄcopyÊÇÓÃÀ´Ð­Òé¹²ÏíµÄ£¬Õâ¸öÒÔºóÔÙ˵£¬dataµ±È»¾ÍÊÇÕâ¸ö½á¹¹ÌåµÄ˽ÓÐÊý¾ÝÁË¡£