ipsec_set_policy()

Сгенерировать структуру спецификации политики IPsec из строки

Прототип:

#include <netinet6/ipsec.h>
char* ipsec_set_policy( char *policy,
int len );

Аргументы:

policy
Строка, описывающая структуру sadb_x_policy и, опционально, структуру sadb_x_ipsecrequest, в формате, приведенном ниже.
len
Длина строки политики.

Библиотека:

libipsec

Описание:

Функция ipsec_set_policy() генерирует структуру спецификации политики IPsec, а именно структуру sadb_x_policy и потенциально структуру sadb_x_ipsecrequest из спецификации политики, заданной в виде С-строки. Функция ipsec_set_policy() выделяет буфер, сохраняет в нем соответствующую структуру спецификации политики IPsec и возвращает указатель на буфер.


Note: Необходимо освободить буфер, указатель на который вернула функция ipsec_set_policy() путем вызова free(). См. пример ниже.

Спецификации политики могут включать следующие переменные:

direction
Направление применения политики. Возможны значения in и out.
priority_specification
Приоритет политики. Это целое число со знаком, которое контролирует размещение политики в базе данных политик безопасности (SPD). Политики с более высоким приоритетом помещаются ближе к началу списка, а политики с более низким приоритетом - ближе к концу списка. Политики с равным приоритетом добавляются в конце группы таких политик. Вы можете указать приоритет только после компиляции libipsec.

Спецификации политики включают следующее:

direction [priority_specification] discard
Отбросить все пакеты, соответствующие политике.
direction [priority_specification] entrust
Уточнить у SPD, заданной в setkey().
direction [priority_specification] bypass
Обходить обработку IPsec, т.е. передавать пакеты в открытом виде. Для привилегированных сокетов.
direction [priority_specification] ipsec request ...
Соответствующие пакеты подлежат обработке IPsec. За строкой ipsec следует одна или несколько строк запроса, которые имеют следующий формат:
protocol / mode / src - dst [/level]

Элементы строки следующие:
protocol
ah, esp, или ipcomp.
mode
Либо transport либо tunnel.
src
dst
Конечные точки IPsec; src - это отправляющий узел, а dst - принимающий узел. Следовательно, при направлении in, dst - это текущий узел, а src - другой узел (одноранговый узел). Если задан режим transport, вы можете опустить и src, и dst.
level
default, use, require или unique.
default
io-pkt следует обратиться к политике системы по умолчанию, определенной sysctl().
use
соответствующая SA (security association) используется, когда она доступна, поскольку io-pkt по возможности может выполнять операцию IPsec с пакетами. В этом случае пакеты передаются в открытом виде (когда SA недоступен) или в зашифрованном виде (когда SA доступен).
require
требуется соответствующая SA, поскольку io-pkt должен выполнять операцию IPsec с пакетами.
unique
аналогичен require, но добавляет ограничение, согласно которому SA для исходящего трафика используется только для этой политики. Вам может понадобиться идентификатор, чтобы связать политику и SA, когда вы определяете SA вручную. Вы указываете десятичное число в качестве идентификатора, например:
unique: number
где number лежит в диапазоне от 1 до 32767.

Если строка запроса однозначна, вы можете опустить уровень и косую черту (/) перед ним. Однако лучше явно указать уровень, чтобы избежать неопределенного поведения.

Если вы опускаете уровень, используется уровень по умолчанию (для получения и установки которого можно использовать sysctl()). Например:
  • Если sysctl сообщает, что net.inet.ipsec.esp_net_deflev = 1, то, по умолчанию, для режима туннелирования требуется политика IPsec. То есть, если вы определяете правило, определяющее туннелирование IPSec от A к B, тогда уровень является обязательным.
  • Если вы используете sysctl для отключения net.inet.ipsec.esp_net_deflev, тогда, если вы определяете правило, определяющее туннелирование IPSec от A к B, правило IPSec не применяется от A к B.

Ниже приведен пример информации о политике:

in discard
out ipsec esp/transport//require
in ipsec ah/transport//require
out ipsec esp/tunnel/10.1.1.2-10.1.1.1/use
in ipsec ipcom/transport//use esp/transport//use


Note: Это отличается от спецификации setkey(), в которой не используются entrust или bypass.

Возвращаемое значение:

Указатель на выделенный для спецификации политики буфер. Если возникла ошибка функция возвращает NULL.

Примеры:

#include <netinet6/ipsec.h>
#include <sys/socket.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main( void )
{
char *sadb;
char *policy = "in discard";
int len;
sadb = ipsec_set_policy( policy, strlen( policy ) );
if ( sadb == NULL )
{
fprintf( stderr, "ipsec_set_policy: %s\n", ipsec_strerror() );
return (1);
}
len = ipsec_get_policylen( sadb );
printf( "len: %d\n", len );
policy = NULL;
policy = ipsec_dump_policy( sadb, NULL );
if ( policy == NULL )
{
fprintf( stderr, "ipsec_dump_policy: %s\n", ipsec_strerror() );
return (1);
}
printf( "policy: %s\n", policy );
free( policy );
free( sadb );
return (0);
}

Классификация:

Unix

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

IPsec, ipsec_strerror()

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




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