Протокол для обеспечения защиты данных, передаваемых по IP.
#include <sys/types.h>#include <netinet/in.h>#include <netinet6/ipsec.h>int socket( PF_KEY,SOCK_RAW,PF_KEY_V2 );
IPsec - это протокол безопасности на межсетевом уровне. Он состоит из следующих подпротоколов:
IPsec имеет следующие режимы работы:
Интерфейс ядра
Эти механизмы контролируют поведение протокола IPsec:
PF_KEY
. Спецификация RFC 2367 определяет API сокета PF_KEY
.
PF_KEY
API, операции setsockopt(), и интерфейс sysctl(). (Утилита sysctl является оберткой над функцией sysctl()). Функция setsockopt() определяет поведение конкретного сокета, и интерфейс sysctl() определяет поведение по умолчанию для всего хоста. Эти механизмы располагаются в менеджере сокетов. Менеджер сокетов реализует интерфейс PF_KEY
и позволяет определять политику IPsec, аналогичную фильтрам для отдельных пакетов. Следует обратить внимание, что код менеджера сокетов не реализует протокол обмена ключами динамического шифрования IKE (Internet Key Exchange) - эта реализация должна выполняться на уровне приложения (обычно в виде демонов) с использованием ранее описанного API.
Управление политиками
Менеджер сокетов реализует экспериментальное управление политиками. Можно управлять политикой IPsec следующими способами:
PF_KEY
или при помощи утилиты setkey(). В этом случае, политика по умолчанию разрешена с setkey(). Настроив политику на default, можно использовать общесистемные переменные утилиты sysctl. (Утилита sysctl отображает различные параметры времени выполнения.) Если менеджер сокетов не находит подходящей политики, применяется общесистемное значение по умолчанию.
Для получения списка переменных net.inet6.ipsec6.*, см. sysctl в Справочнике по Утилитам.
Различные переменные sysctl
Следующие переменные доступны через утилиту для настройки поведения IPsec диспетчера сокетов sysctl:
Наименование | Тип | Разрешено ли изменение? |
---|---|---|
net.inet.ipsec.ah_cleartos | Integer | Да |
net.inet.ipsec.ah_offsetmask | Integer | Да |
net.inet.ipsec.dfbit | Integer | Да |
net.inet.ipsec.ecn | Integer | Да |
net.inet.ipsec.debug | Integer | Да |
net.inet6.ipsec6.ecn | Integer | Да |
net.inet6.ipsec6.debug | Integer | Да |
Переменные интерпретируются следующим образом:
16
-разрядное поле смещения фрагмента (включая биты флага) в заголовок IPv4 после вычисления логического «И» с переменной. Эта переменная настраивает поведение AH для взаимодействия с устройствами, реализующими RFC 1826 AH. Установите это значение в ноль (очистите поле смещения фрагмента во время вычисления), если необходимо соответствовать RFC 2402. Значение: | Описание: |
---|---|
0 | Бит DF во внешнем заголовке IPv4 сбрасывается. |
1 | Внешний бит DF в заголовке устанавливается из внутреннего бита DF. |
2 | Бит DF копируется из внутреннего заголовка во внешний. |
draft-ietf-ipsec-ecn-02.txt
. Переменные из дерева net.inet6.ipsec6 имеют значение, аналогичные их аналогам из net.inet.ipsec.
Protocols
Поскольку протокол IPsec работает как дополнительный модуль к протоколам INET и INET6, IPsec поддерживает большинство протоколов, определенных для этих протоколов уровня IP. Некоторые протоколы, например ICMP или ICMP6, могут по-разному работать с IPsec. Это связано с тем, что IPsec может препятствовать процедурам ICMP или ICMP6 может просматривать полезные данные IP.
Установка политики
Можно установить политику вручную, вызвав setkey, или установить ее навсегда в /etc/inetd
.conf. Допустимые параметры политики:
для setkey():
-P direction discard -P direction ipsec request ... -P direction none
для /etc/inetd.conf :
direction bypass direction entrust direction ipsec request ...
где:
/etc/inetd
.conf) Обойти обработку IPsec и передать пакет открытым текстом. Эта опция предназначена для привилегированных сокетов. /etc/inetd
.conf) Принять во внимание Security Policy Database (SPD) в стеке. SPD устанавливается функцией setkey() (см. Справочник по Утилитам). протокол/режим/источник-назначение[/уровень]
Подробное описание аргументов в строке request см. ниже.
Аргументы запроса
1
до 32767
. Если строка запроса остается однозначной, level и косая черта перед level могут быть опущены. Однако необходимо указать их явно, чтобы избежать нежелательного поведения. Если level не указан в setkey, по умолчанию используется unique. |
Поддержка IPsec может меняться по мере развития протоколов IPsec.
Единого стандарта для API механизма политик не существует, поэтому описанный здесь API механизма политик предназначен только для реализации KAME.
Туннель AH может работать не так, как ожидается. Если настроить политику require для входящего туннеля AH, туннелированные пакеты будут отклоняться. Это связано с тем, что AH аутентифицирует инкапсулируемый (внешний) пакет, а не инкапсулированный (внутренний) пакет.
При определенных условиях менеджером сокетов может быть возвращен усеченный результат из операций SADB_DUMP
и SADB_SPDDUMP
на сокете PF_KEY
. Это происходит, если в диспетчере сокетов слишком много записей базы данных, а буфер сокета для сокета PF_KEY
слишком мал. При манипулировании большим количеством записей базы данных ключей/политик IPsec, следует увеличить размер буфера сокета.
ICMP, ICMP6, INET6, IP, IP6 протоколы
/etc/inetd.conf, setkey в Справочнике по Утилитам.
Основано на RFC 2367, RFC 1826, RFC 2402, RFC 2403
Подробную документацию по протоколу безопасности IP можно найти на NetBSD IPsec FAQ.
Предыдущий раздел: Описание API сетевой библиотеки