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.