Сгенерировать структуру спецификации политики 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 и возвращает указатель на буфер.
 | Необходимо освободить буфер, указатель на который вернула функция 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
in ipsec ah/transport
out ipsec esp/tunnel/10.1.1.2-10.1.1.1/use
in ipsec ipcom/transport
 | Это отличается от спецификации 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