Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 148

Автор Уильям БтивСнс

36 allocations. 0 bytes

added at Thu Jun 5 21:01:31 2003, first used at Thu Jun 5 21:15:07 2003

Source address: 127.0.0.1/128 (IP proto 255)

Dest address: 127.0.0.1/128 (IP proto 255)

Authentication key. 160 bits: 0x0123456789abcdef0123456789abcdef01234567

Из этого Π΄Π°ΠΌΠΏΠ° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ядро ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° с 0 Π½Π° 255. Π­Ρ‚ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π½Π΅ ΠΎΠ±Ρ‰Π΅Π΅ свойство сокСтов PF_KEY. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ядро ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎ Π΄Π»ΠΈΠ½Ρƒ прСфикса с 32 Π½Π° 128. Π­Ρ‚ΠΎ какая-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ IPv4 ΠΈ IPv6. Π―Π΄Ρ€ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ (с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 19), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ обрабатываСтся нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ вывСдСния Π΄Π°ΠΌΠΏΠ°. НСизвСстныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ (ΠΈΡ… Π΄Π»ΠΈΠ½Π° имССтся Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΠ»Π΅). НаконСц, возвращаСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ (листинг 19.7), содСрТащСС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ соглашСния ΠΎ бСзопасности.

Листинг 19.7. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ

struct sadb_lifetime {

 u_int16_t sadb_lifetime_len;     /* Π΄Π»ΠΈΠ½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ / 8 */

 u_int16_t sadb_lifetime_exttype; /* SADB_EXT_LIFETIME_{SOFT,HARD,CURRENT} */

 u_int32_t sadb_lifetime_allocations; /* количСство соСдинСний, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ…

                                       Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² */

 u_int64_t sadb_lifetime_bytes;   /* количСство Π±Π°ΠΉΡ‚ΠΎΠ² */

 u_int64_t sadb_lifetime_addtime; /* врСмя создания Π»ΠΈΠ±ΠΎ врСмя ΠΎΡ‚ создания

                                     Π΄ΠΎ устарСвания */

 u_int64_t sadb_lifetime_usetime; /* врСмя ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ использования ΠΈΠ»ΠΈ врСмя ΠΎΡ‚

                                     ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ использования Π΄ΠΎ устарСвания */

};

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ². Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ SADB_LIFETIME_SOFT ΠΈ SADB_LIFETIME_HARD Π·Π°Π΄Π°ΡŽΡ‚ Π³ΠΈΠ±ΠΊΠΎΠ΅ ΠΈ ТСсткоС ограничСния Π½Π° врСмя ΠΆΠΈΠ·Π½ΠΈ соглашСния. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ SADB_EXPIRE отправляСтся ядром Π² случаС ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ ограничСния Π½Π° врСмя ΠΆΠΈΠ·Π½ΠΈ. ПослС достиТСния ТСсткого ограничСния использованиС соглашСния прСкращаСтся. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ SADB_LIFETIME_CURRENT возвращаСтся Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° SADB_DUMP, SADB_EXPIRE ΠΈ SADB_GET ΠΈ описываСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ соглашСния.

19.5. ДинамичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ SA

Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности трСбуСтся пСриодичСская смСна ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ‚ΠΈΠΏΠ° IKE (RFC 2409 [43]).

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этой ΠΊΠ½ΠΈΠ³ΠΈ рабочая Π³Ρ€ΡƒΠΏΠΏΠ° IETF ΠΏΠΎ IPSec Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»Π° Π·Π°ΠΌΠ΅Π½Ρƒ для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IKE.

Π”Π΅ΠΌΠΎΠ½, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, рСгистрируСтся Π² ядрС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ сообщСния SADB_REGISTER, указывая Π² ΠΏΠΎΠ»Π΅ sadb_msg_satype (см. Ρ‚Π°Π±Π». 19.2) Ρ‚ΠΈΠΏ соглашСния ΠΎ бСзопасности, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ. Если Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ соглашСний, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ нСсколько сообщСний SADB_REGISTER, зарСгистрировав Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ SA. Π’ ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΠΌ сообщСнии SADB_REGISTER ядро ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ для этих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² описываСтся структурой sadb_supported, прСдставлСнной Π² листингС 19.8. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° содСрТит Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ описания Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² полях sadb_alg.

Листинг 19.8. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹

struct sadb_supported {

 u_int16_t sadb_supported_len;      /* Π΄Π»ΠΈΠ½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ списка Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² / 8 */

 u_int16_t sadb_supported_exttype;  /* SADB_EXT_SUPPORTED_{AUTH,ENCRYPT} */

 u_int32_t sadb_supported_reserved; /* Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ */

};


/* Π΄Π°Π»Π΅Π΅ слСдуСт список Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² */

struct sadb_alg {

 u_int8_t  sadb_alg_id;       /* ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈΠ· Ρ‚Π°Π±Π». 19.5 */

 u_int8_t  sadb_alg_ivlen;    /* Π΄Π»ΠΈΠ½Π° IV ΠΈΠ»ΠΈ Π½ΡƒΠ»ΡŒ */

 u_int16_t sadb_alg_minbits;  /* минимальная Π΄Π»ΠΈΠ½Π° ΠΊΠ»ΡŽΡ‡Π° */

 u_int16_t sadb_alg_maxbits;  /* максимальная Π΄Π»ΠΈΠ½Π° ΠΊΠ»ΡŽΡ‡Π° */

 u_int16_t sadb_alg_reserved; /* Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ */

};

ПослС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° sadb_supported слСдуСт ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ структурС sadb_alg для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ систСмой. На рис. 19.1 прСдставлСн Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° сообщСниС, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ SA Ρ‚ΠΈΠΏΠ° SADB_SATYPE_ESP.

Рис. 19.1. Π”Π°Π½Π½Ρ‹Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ядром Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ SADB_REGISTER

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, прСдставлСнная Π² листингС 19.9, просто рСгистрируСтся Π² ядрС Π² качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° бСзопасности ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ ядра, содСрТащий список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Листинг 19.9. РСгистрация Π΄Π΅ΠΌΠΎΠ½Π°-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

//key/register.c

 1 void

 2 sadb_register(int type)

 3 {

 4  int s;

 5  char buf[4096]; /* XXX */

 6  struct sadb_msg msg;

 7  int goteof;

 8  int mypid;


 9  s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);


10  mypid = getpid();


11  /* Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° запроса SADB_REGISTER */

12  bzero(&msg, sizeof(msg));

13  msg.sadb_msg_version = PF_KEY_V2;

14  msg.sadb_msg_type = SADB_REGISTER;

15  msg.sadb_msg_satype = type;

16  msg.sadb_msg_len = sizeof(msg) / 8;

17  msg.sadb_msg_pid = mypid;

18  printf("Sending register message:\n");

19  print_sadb_msg(&msg, sizeof(msg));

20  Write(s, &msg, sizeof(msg));


21  printf("\nReply returned:\n");

22  /* Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π° SADB_REGISTER, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх ΠΏΡ€ΠΎΡ‡ΠΈΡ…

       сообщСний */

23  for (;;) {

24   int msglen;

25   struct sadb_msg *msgp;


26   msglen = Read(s, &buf, sizeof(buf));

27   msgp = (struct sadb_msg*)&buf;

28   if (msgp->sadb_msg_pid == mypid &&

29    msgp->sadb_msg_type == SADB_REGISTER) {

30    print_sadb_msg(msgp, msglen);

31    break;

32   }

33  }

34  close(s);

35 }

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСта PF_KEY

1-9 ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сокСт PF_KEY.

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ PID

10 ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ядро Π±ΡƒΠ΄Π΅Ρ‚ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΌ свои сообщСния ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ процСсса, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ впослСдствии ΠΎΡ‚Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас сообщСния.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сообщСния SADB_REGISTER

11-17 ΠŸΠΎΠ΄ΠΎΠ±Π½ΠΎ SADB_DUMP, сообщСниС SADB_REGISTER Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. ΠœΡ‹ обнуляСм сообщСниС, послС Ρ‡Π΅Π³ΠΎ заполняСм ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас поля структуры.

Π’Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния

18-20 ΠœΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ сообщСниС Π½Π° экранС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_sadb_msg, послС Ρ‡Π΅Π³ΠΎ записываСм сообщСниС Π² сокСт.

ОТиданиС ΠΎΡ‚Π²Π΅Ρ‚Π°

23-30 ΠœΡ‹ считываСм сообщСния ΠΈΠ· сокСта, оТидая ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° нашС сообщСниС ΠΎ рСгистрации. ΠžΡ‚Π²Π΅Ρ‚ адрСсован ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ процСсса ΠΈ прСдставляСт собой сообщСниС SADB_REGISTER. Он содСрТит список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выводится нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ print_sadb_msg.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠœΡ‹ запускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ register Π² систСмС, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π½Π° нСсколько ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² большС, Ρ‡Π΅ΠΌ описано Π² RFC 2367.

macosx % register -t ah

Sending register message:

SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746

Reply returned:

SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746

Supported authentication algorithms:

HMAC-MD5 ivlen 0 bits 128-128

HMAC-SHA-1 ivlen 0 bits 160-160

Keyed MD5 ivlen 0 bits 128-128

Keyed SHA-1 ivlen 0 bits 160-160

Null ivlen 0 bits 0-2048

SHA2-256 ivlen 0 bits 256-256

SHA2-384 ivlen 0 bits 384-384

SHA2-512 ivlen 0 bits 512-512

Supported encryption algorithms:

DES-CBC ivlen 8 bits 64-64

3DES-CBC ivlen 8 bits 192-192

Null ivlen 0 bits 0-2048

Blowfish-CBC ivlen 8 bits 40-448

CAST128-CBC ivlen 8 bits 40-128

AES ivlen 16 bits 128-256

Если ядру трСбуСтся ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с собСсСдником, Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия соглашСния ΠΎ бСзопасности, Π½ΠΎ соглашСниС Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ΅ отсутствуСт, ядро отправляСт Π½Π° Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ΡΡ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° соглашСния сокСты управлСния ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ сообщСниС SADB_ACQUIRE, Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТатся ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ ядром Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… систСмой срСдств бСзопасности ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π½Π°Π±ΠΎΡ€ срСдств для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ собСсСдника. Алгоритмы, Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π° ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² список Π² порядкС ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ использования. Когда Π΄Π΅ΠΌΠΎΠ½-ΠΊΠ»ΡŽΡ‡Π½ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС SADB_ACQUIRE, ΠΎΠ½ выполняСт дСйствия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠ»ΡŽΡ‡Π°, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ядром ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ, ΠΈ устанавливаСт этот ΠΊΠ»ΡŽΡ‡ Π² ядро. Для Π²Ρ‹Π±ΠΎΡ€Π° SPI ΠΈΠ· Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π΅ΠΌΠΎΠ½ отправляСт ядру сообщСниС SADB_GETSPI. Π’ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° это сообщСниС ядро создаСт соглашСниС ΠΎ бСзопасности Π² состоянии SADB_SASTATE_LARVAL. Π—Π°Ρ‚Π΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ согласовываСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ бСзопасности с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ собСсСдником, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ прСдоставлСнный ядром SPI, послС Ρ‡Π΅Π³ΠΎ отправляСт ядру сообщСниС SADB_UPDATE для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ создания соглашСния ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π΅Π³ΠΎ Π² Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ состояниС (SADB_SASTATE_MATURE). ДинамичСски создаваСмыС соглашСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ½Π°Π±ΠΆΠ°ΡŽΡ‚ΡΡ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ ТСстким ограничСниями Π½Π° врСмя ΠΆΠΈΠ·Π½ΠΈ. Когда истСкаСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих сроков, ядро отправляСт сообщСниС SADB_EXPIRE, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ указываСтся, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ достигнуто ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅. По достиТСнии Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ ограничСния соглашСниС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС SADB_SASTATE_DYING, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ процСссу слСдуСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ соглашСниС. Если ΠΆΠ΅ достигнуто ТСсткоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, соглашСниС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС SADB_SASTATE_DEAD, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обСспСчСния бСзопасности ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….