UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Sending dump message:
SADB Message Dump, errno 0, satype Unspecified, seq 0, pid 6283
Messages returned:
SADB Message Dump, errno 0, satype IPsec AH, seq 0, pid 6283
SA: SPI=39030 Replay Window=0 State=Mature
Authentication Algorithm: HMAC-SHA-1
Encryption Algorithm: None
[unknown extension 19]
Current lifetime:
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
SADB_REGISTER
SADB_REGISTER
sadb_supported
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
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);