IPsec

Протокол для обеспечения защиты данных, передаваемых по IP.

Прототип:

#include <sys/types.h>
#include <netinet/in.h>
#include <netinet6/ipsec.h>
int socket( PF_KEY,
SOCK_RAW,
PF_KEY_V2 );

Описание:

IPsec - это протокол безопасности на межсетевом уровне. Он состоит из следующих подпротоколов:

AH (Authentication Header)
Гарантирует целостность IP-пакета и защищает его от промежуточного изменения или выдачи себя за другой пакет путем добавления криптографической контрольной суммы, вычисленной с помощью односторонних хэш-функций.
ESP (Encapsulated Security Payload)
Защищает полезную нагрузку IP от прослушивания путем шифрования с использованием алгоритмов шифрования с секретным ключом.

IPsec имеет следующие режимы работы:

Интерфейс ядра

Эти механизмы контролируют поведение протокола IPsec:

Эти механизмы располагаются в менеджере сокетов. Менеджер сокетов реализует интерфейс PF_KEY и позволяет определять политику IPsec, аналогичную фильтрам для отдельных пакетов. Следует обратить внимание, что код менеджера сокетов не реализует протокол обмена ключами динамического шифрования IKE (Internet Key Exchange) - эта реализация должна выполняться на уровне приложения (обычно в виде демонов) с использованием ранее описанного API.

Управление политиками

Менеджер сокетов реализует экспериментальное управление политиками. Можно управлять политикой IPsec следующими способами:

Если менеджер сокетов не находит подходящей политики, применяется общесистемное значение по умолчанию.

Для получения списка переменных 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 Да

Переменные интерпретируются следующим образом:

ipsec.ah_cleartos
При вычислении данных аутентификации AH менеджер сокетов очищает поле типа службы в заголовке IPv4, если для этого значения установлено ненулевое значение. Переменная настраивает поведение AH для взаимодействия с устройствами, реализующими RFC 1826 AH. Установите ненулевое значение (очистите поле типа службы), если необходимо соответствовать RFC 2402.
ipsec.ah_offsetmask
При вычислении данных аутентификации AH менеджер сокетов включает 16-разрядное поле смещения фрагмента (включая биты флага) в заголовок IPv4 после вычисления логического «И» с переменной. Эта переменная настраивает поведение AH для взаимодействия с устройствами, реализующими RFC 1826 AH. Установите это значение в ноль (очистите поле смещения фрагмента во время вычисления), если необходимо соответствовать RFC 2402.
ipsec.dfbit
Настраивает поведение менеджера сокетов для инкапсуляции туннельного IPv4 IPsec. Переменная предоставляется в соответствии с RFC 2403, глава 6.1.
Значение: Описание:
0 Бит DF во внешнем заголовке IPv4 сбрасывается.
1 Внешний бит DF в заголовке устанавливается из внутреннего бита DF.
2 Бит DF копируется из внутреннего заголовка во внешний.
ipsec.ecn
Если установлено значение, отличное от нуля, поведение инкапсуляции/декапсуляции туннельного IPv4 IPsec поддерживает ECN (Explicit Congestion Notification), как описано в файле IETF draft-ietf-ipsec-ecn-02.txt.
ipsec.debug
Если установлено ненулевое значение, сообщения отладки генерируются в системном журнале.

Переменные из дерева 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 ...

где:

direction
Направление, в котором применяется политика. Либо in, либо out.
bypass
(только для /etc/inetd.conf) Обойти обработку IPsec и передать пакет открытым текстом. Эта опция предназначена для привилегированных сокетов.
discard
(только для setkey) Отбросить индексы соответствия пакетов.
entrust
(только для /etc/inetd.conf) Принять во внимание Security Policy Database (SPD) в стеке. SPD устанавливается функцией setkey() (см. Справочник по Утилитам).
ipsec request ...
Поместить операцию IPsec в пакет. Можно указать одну или несколько строк request в следующем формате:

протокол/режим/источник-назначение[/уровень]

Подробное описание аргументов в строке request см. ниже.

none
(только для setkey) Не помещать операцию IPsec в пакет.

Аргументы запроса

protocol
Одно из следующих:
mode
Будет использоваться протокол безопасности, один из:
dst
src
Конечные адреса “принимающего узла” (dst) и “отправляющего узла” (src) Ассоциации Безопасности (Security Association, SA). Когда указано направление in, dst будет представлять текущий узел, а src - другой узел (пир). Если установлен режим transport, установку этих значений можно опустить.
level
Один из:

Note: Если 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 протоколы

ioctl(), socket(), sysctl()

/etc/inetd.conf, setkey в Справочнике по Утилитам.

Основано на RFC 2367, RFC 1826, RFC 2402, RFC 2403

Подробную документацию по протоколу безопасности IP можно найти на NetBSD IPsec FAQ.




Предыдущий раздел: Описание API сетевой библиотеки