UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Sending dump message:SADB Message Dump, errno 0, satype Unspecified, seq 0, pid 6283Messages returned:SADB Message Dump, errno 0, satype IPsec AH, seq 0, pid 6283SA: SPI=39030 Replay Window=0 State=MatureAuthentication Algorithm: HMAC-SHA-1Encryption Algorithm: None[unknown extension 19]Current lifetime:36 allocations. 0 bytesadded at Thu Jun 5 21:01:31 2003, first used at Thu Jun 5 21:15:07 2003Source 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_SOFTSADB_LIFETIME_HARDSADB_EXPIRESADB_LIFETIME_CURRENTSADB_DUMPSADB_EXPIRESADB_GET19.5. Динамическое управление SA
Для повышения безопасности требуется периодическая смена ключей. Обычно для этого используется протокол типа IKE (RFC 2409 [43]).
В момент написания этой книги рабочая группа IETF по IPSec разрабатывала замену для протокола IKE.
Демон, обеспечивающий безопасность, регистрируется в ядре при помощи сообщения
SADB_REGISTERsadb_msg_satypeSADB_REGISTERSADB_REGISTERsadb_supportedsadb_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_supportedsadb_algSADB_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);
