Алгоритм работы конвертора

1.   Подготовительный этап:

Инициализация лога.

Инициализация локальных настроек.

2.   Написание служебной информации в комментариях:

Фраза "This is automatically generated LSP".

Дата и время конвертации. 

3.   Создание заголовка конфигурации:

Служебная информация (версия и т.п.).

Настройки LDAP и CRL-processing.

Глобальные настройки лога.

4.   Обработка интерфейсов. Подробнее см. «Описание обработки интерфейсов». При этом формируются правила фильтрации, в том числе и IPsec (APPLY).

5.   Для APPLY правила происходит поиск подходящего ISAKMP правила:

Сначала делается попытка найти подходящее правило на  Preshared  key.

Также берется первое по счету правило  rsa-sig.

6.   Если подобрано правило на Preshared key – прописывается аутентификационная информация с соответствующим именем ключа.

Для main  mode  LocalID прописывается в зависимости от команды  crypto  isakmp  identity:

·       Если crypto  isakmp  identity  address (вариант по умолчанию), а также в случае crypto  isakmp  identity  dn  (вариант, неприменимый для  preshared  keys),  LocalID в конфигурацию не пишется (обозначает – использовать локальный IP-адрес).

·       Если crypto  isakmp  identity  hostname, пишется:
    LocalID  = IdentityEntry( KeyID *= “<local_id>” )
где <local_id> – представление в виде Hex-string полного DNS-адреса, составленного из локального hostname, заданного с помощью команды hostname <…> и доменного имени, заданного с помощью команды ip  domain  name <…>. Если доменное имя отсутствует, или в  hostname  присутствует хотя бы одна точка, <local_id> составляется только из  hostname.

RemoteID прописывается по следующим правилам:

·       Если ключ привязан к IP-адресу с помощью команды
crypto  isakmp  key <…> address <…>,
то формируется правило с аутентификацией по данному ключу:

AuthMethodPreshared<...> (
    [ LocalID  = IdentityEntry( KeyID *= “<local_id>” ) ] –
    если необходимо
    RemoteID = IdentityEntry( IPv4Address *= <peer_ip> )
    SharedIKESecret = <...>
)

·       Если ключ привязан к hostname с помощью команды
crypto isakmp key <…> hostname <…>, а hostname привязан к IP-адресу с помощью команды ip host <hostname> <ip-addr>,  то формируется правило с аутентификацией по hostname и IP-address:

AuthMethodPreshared <...> (
    [ LocalID  = IdentityEntry( KeyID *= “<local_id>” ) ] –
    если необходимо
    RemoteID = IdentityEntry(
    IPv4Address *= <peer_ip> KeyID *= “<peer_id>” )
    SharedIKESecret = <...>
)
где <peer_id> – представление в виде Hex-string hostname-а из команды crypto isakmp key <…> hostname <…>.

·       Если ключ привязан к hostname с помощью команды
crypto isakmp key <…> hostname <…> и используется динамический crypto map, формируется правило с аутентификацией по hostname:

AuthMethodPreshared <...> (
    [ LocalID  = IdentityEntry( KeyID *= “<local_id>” ) ] –
    если необходимо
    RemoteID = IdentityEntry( KeyID *= “<peer_id>” )
    SharedIKESecret = <...>
)

·       Если удается подобрать дополнительные IP-адреса и hostname, для которых задаются те же самые ключи, тогда эти IP-адреса и KeyID (из hostname-ов) добавляются в RemoteID.

7.   Если подобрано правило RSA sig – прописывается правило аутентификации в виде:

{ AuthMethodRSASign | AuthMethodDSSSign | AuthMethodGostSign } auth_ca(

    LocalID        =  IdentityEntry( ... )

    [ RemoteID       =  IdentityEntry( ... ) ] |

    [ DoNotMapRemoteIDToCert = TRUE ]

    AcceptCredentialFrom      *= CertDescription(

       X509IssuerDN  *= "..."

       SerialNumber  =  "..."

       X509SubjectDN *= "..."

    )

    SendRequestMode =  { AUTO | NEVER | ALWAYS }

    SendCertMode    =  { AUTO | NEVER | ALWAYS }

)

ModeAuthMethod *= auth_ca

 

·       LocalID для main mode формируется по следующим правилам:

·       Если crypto isakmp identity hostname, пишется:
LocalID =  IdentityEntry( FQDN* = USER_SPECIFIC_DATA )

·       Если crypto isakmp identity dn:
LocalID =IdentityEntry( DistinguishedName* = USER_SPECIFIC_DATA )

·       Если crypto isakmp identity address:
LocalID = IdentityEntry(IPv4Address* = USER_SPECIFIC_DATA)

·       RemoteID формируется по следующим правилам:

·       Если к crypto map привязана identity, в которой прописан один или несколько dn, пишется:
RemoteID = IdentityEntry (
  
DistinguishedName* = CertDescription(Subject* =“<dn1>”),
                      
 CertDescription( Subject* =“<dn2>”), ...
 
 FQDN* = “<fqdn1>”, “<fqdn2>” ...
)

·       Если к crypto map не привязана identity, то пишется DoNotMapRemoteIDToCert = TRUE

данная логика предназначена для того, чтобы в качестве remote identity работал IP-адрес и в том случае, когда он отсутствует в сертификате (типичная ситуация). Это бывает полезно при использовании разных типов аутентификации в пределах одной конфигурации – на сертификатах и на preshared keys.

·       Если в LSP уже присутствует идентичная структура AuthMethod…Sign, новая структура не пишется. В структуре IKERule пишется ссылка на уже существующую структуру.

8.   В зависимости от наличия команды crypto isakmp keepalive и ее параметров в IKERule прописываются настройки DPD:

Если команда  crypto  isakmp  keepalive не задана (по умолчанию), прописывается DoNotUseDPD = TRUE.

Если команда задана, пишутся параметры:

DPDIdleDuration = <secs>
DPDResponseDuration = <retries>
DPDRetries = <dpd_retries>

где <secs> – первый аргумент команды;
      <retries> – второй аргумент команды;
     <dpd_retries> – параметр dpd_retries из файла cs_conv.ini.
        См. описание настройки dpd_retries.

Внимание!!!  Поведение по умолчанию отличается от настроек DPD в версии 2.0. Там всегда (вне зависимости от crypto  isakmp  keepalive) выставлялись настройки DPD по умолчанию, характерные для Native-LSP:  DPDIdleDuration = 60; DPDResponseDuration = 5; DPDRetries = 3.
Сейчас по умолчанию DPD выключен.

9.   Если в LSP уже присутствует идентичная структура IKERule, новая структура не пишется. В структуре IPsecAction пишется ссылка на уже существующую структуру.

10. Если в LSP уже присутствует идентичная структура IPsecAction, новая структура не пишется.

11. В конце конвертирования делается попытка загрузить сформированную конфигурацию.

Если конфигурацию не удалось загрузить, она сохраняется в файле erroneous_lsp.txt (с выдачей сообщения в лог). Файл расположен в каталоге /var/cspvpn.