Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Сокеты управления ключами поддерживают три типа операций:
1. Процесс может отправить сообщение ядру и всем остальным процессам с открытыми сокетами, записав это сообщение в свой сокет. Таким способом добавляются и удаляются записи в базе соглашений о безопасности. Таким же способом процессы, обеспечивающие собственную безопасность самостоятельно (типа OSPFv2), могут запрашивать ключи у демона-ключника (демона, управляющего ключами).
2. Процесс может считать сообщение от ядра или иного процесса через сокет управления ключами. Это позволяет ядру запросить демона-ключника о добавлении соглашения о безопасности для нового сеанса TCP, который, согласно политике, подлежит определенной защите.
3. Процесс может отправить ядру запрос дампа, и ядро в ответ передаст ему дамп текущей базы SADB. Это отладочная функция, которая может быть доступна не во всех системах.
19.2. Чтение и запись
Все сообщения в сокете управления ключами должны иметь одинаковые заголовки, соответствующие листингу 19.1 [1] Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.
. Сообщение может сопровождаться различными расширениями в зависимости от наличия дополнительной информации или необходимости ее предоставления. Все нужные структуры определяются в заголовочном файле . Все сообщения и расширения подвергаются 64-разрядному выравниванию и дополняются до длин, кратных 64 разрядам. Все поля длины оперируют 64-разрядными единицами, то есть значение длины 1 означает реальную длину 8 байт. Расширение, не содержащее достаточного количества данных, дополняется произвольным образом до длины, кратной 64 разрядам.
Значение sadb_msg_typeзадает одну из десяти команд управления ключами. Типы сообщений перечислены в табл. 19.1. За заголовком sadb_msgможет следовать произвольное количество расширений. Большинство сообщений имеют обязательные и необязательные расширения, которые будут описаны в соответствующих разделах. Шестнадцать типов расширений с названиями структур, их определяющих, перечислены в табл. 19.3.
Листинг 19.1. Заголовок сообщения управления ключами
struct sadb_msg {
u_int8_t sadb_msg_version; /* PF_KEY_V2 */
u_int8_t sadb_msg_type; /* см. табл. 19.1 */
u_int8_t sadb_msg_errno; /* код ошибки */
u_int8_t sadb_msg_satype; /* см. табл. 19.2 */
u_int16_t sadb_msg_len; /* длина заголовка и расширений / 8 */
u_int16_t sadb_msg_reserved; /* нуль при передаче, игнорируется
при получении */
u_int32_t sadb_msg_seq; /* порядковый номер */
u_int32_t sadb_msg_pid; /* идентификатор процесса отправителя
или получателя */
};
Таблица 19.1. Типы сообщений
| Тип сообщения | К ядру | От ядра | Описание |
|---|---|---|---|
| SADB_ACQUIRE | • | • | Запрос на создание записи в SADB |
| SADB_ADD | • | • | Добавление записи в полную базу безопасности |
| SADB_DELETE | • | • | Удаление записи |
| SADB_DUMP | • | • | Дамп SADB (используется для отладки) |
| SADB_EXPIRE | • | Уведомление об истечении срока действия записи | |
| SADB_FLUSH | • | • | Очистка всей базы безопасности |
| SADB_GET | • | • | Получение записи |
| SADB_GETSPI | • | • | Выделение SPI для создания записи SADB |
| SADB_REGISTER | • | Регистрация для ответа на SADB_ACQUIRE | |
| SADB_UPDATE | • | • | Обновление записи в частичной SADB |
Таблица 19.2. Типы соглашений о безопасности
| Тип соглашения | Описание |
|---|---|
| SADB_SATYPE_AH | Аутентифицирующий заголовок IPSec |
| SADB_SATYPE_ESP | ESP IPSec |
| SADB_SATYPE_MIP | Идентификация мобильных пользователей (Mobile IP) |
| SADB_SATYPE_OSPFV2 | Аутентификация OSPFv2 |
| SADB_SATYPE_RIPV2 | Аутентификация RIPv2 |
| SADB_SATYPE_RSVP | Аутентификация RSVP |
| SADB_SATYPE_UNSPECIFIED | He определен |
Таблица 19.3. Типы расширений PF_KEY
| Тип заголовка расширения | Описание | Структура |
|---|---|---|
| SADB_EXT_ADDRESS_DST | Адрес получателя SA | sadb_address |
| SADB_EXT_ADDRESS_PROXY | Адрес прокси-сервера SA | sadb_address |
| SADB_EXT_ADDRESS_SRC | Адрес отправителя SA | sadb_address |
| SADB_EXT_IDENTITY_DST | Личность получателя | sadb_ident |
| SADB_EXT_IDENTITY_SRC | Личность отправителя | sadb_ident |
| SADB_EXT_KEY_AUTH | Ключ аутентификации | sadb_key |
| SADB_EXT_KEY_ENCRYPT | Ключ шифрования | sadb_key |
| SADB_EXT_LIFETIME_CURRENT | Текущее время жизни SA | sadb_lifetime |
| SADB_EXT_LIFETIME_HARD | Жесткое ограничение на время жизни SA | sadb_lifetime |
| SADB_EXT_LIFETIME_SOFT | Гибкое ограничение на время жизни SA | sadb_lifetime |
| SADB_EXT_PROPOSAL | Предлагаемая ситуация | sadb_prop |
| SADB_EXT_SA | Соглашение о безопасности | sadb_sa |
| SADB_EXT_SENSITIVITY | Важность SA | sadb_sens |
| SADB_EXT_SPIRANGE | Диапазон допустимых значений SPI | sadb_spirange |
| SADB_EXT_SUPPORTED_AUTH | Поддерживаемые алгоритмы аутентификации | sadb_supported |
| SADB_EXT_SUPPORTED_ENCRYPT | Поддерживаемые алгоритмы шифрования | sadb_supported |
Рассмотрим несколько примеров сообщений и расширений, используемых в типичных операциях с сокетами управления ключами.
19.3. Дамп базы соглашений о безопасности
Для дампа текущей базы соглашений о безопасности используется сообщение SADB_DUMP. Это самое простое из сообщений, поскольку оно не требует никаких расширений, а состоит только из 16-байтового заголовка sadb_msg. Когда процесс отправляет сообщение SADB_DUMPядру через сокет управления ключами, ядро отвечает последовательностью сообщений SADB_DUMPпо тому же сокету. В каждом сообщении содержится одна запись базы SADB. Конец последовательности обозначается сообщением со значением 0 в поле sadb_msg_seq.
Поле sadb_msg_satypeпозволяет запросить только записи определенного типа. Значения этого поля следует брать из табл. 19.2. При указании значения SADB_SATYPE_UNSPECвозвращаются все записи базы. Не все типы соглашений о безопасности поддерживаются всеми реализациями. Реализация KAME поддерживает только соглашения, относящиеся к IPSec ( SADB_SATYPE_AHи SADB_SATYPE_ESP), поэтому при попытке получить дамп записей SADB_SATYPE_RIPV2будет возвращена ошибка EINVAL. Если же записей, относящихся к запрошенному типу, в таблице нет (но они поддерживаются), функция возвращает ошибку ENOENT.
Программа, получающая записи из базы данных безопасности, приведена в листинге 19.2.
Листинг 19.2. Дамп базы соглашений о безопасности
//key/dump.c
1 void
2 sadb_dump(int type)
3 {
4 int s;
5 char buf[4096];
6 struct sadb_msg msg;
7 int goteof;
8 s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
9 /* формирование и отправка запроса SADB_DUMP */
10 bzero(&msg, sizeof(msg));
Интервал:
Закладка: