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µ±È»¾ÍÊÇÕâ¸ö½á¹¹ÌåµÄ˽ÓÐÊý¾ÝÁË¡£