> For the complete documentation index, see [llms.txt](https://adavyshin.gitbook.io/networks/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://adavyshin.gitbook.io/networks/docs/nastroika-ipsec-vpn.md).

# Настройка IPsec VPN

💡 В IKEv2 на Cisco есть два режима аутентификации с ключами RSA:

* `rsa-sig` (подпись) — используется при наличии сертификата (PKI).
* `rsa-nonce` — более простой режим: публичные ключи RSA вручную импортируются на роутеры (без полноценного PKI).

Так как в задании нам указали IKEv2, то нам остаётся использовать подход с `rsa-sig`, где нам необходимо на маршрутизаторах сделать запросы на сертификат `CSR`, потом подписать эти запросы на Certificate Authority, который развёрнут на <kbd>HQ-DC</kbd>.&#x20;

### Конфигурация маршрутизатора <kbd>BR1-ROUTER</kbd>

Первым действием мы сгенерируем пару ключей, которую будем использовать для подписи CSR.

```
crypto key generate rsa modulus 2048 label br1.keys
```

Далее необходимо создать такую сущность как trustpoint, эта точка доверия является своего рода указателем области юрисдикции центра сертификации. И внутри этой trustpoint будет находится и сертификат, который будет использовать маршрутизатор.

<pre class="language-editorconfig"><code class="lang-editorconfig">ip host br2-router 198.19.102.2
ip domain name gns3.lab
!
crypto pki trustpoint TP-gns3.lab
 enrollment terminal
 subject-name CN=br1-router.gns3.lab
 revocation-check none
 rsakeypair br1.keys
exit

crypto pki enroll TP-gns3.lab
% Start certificate enrollment .. 

% The subject name in the certificate will include: CN=br1-router.gns3.lab
% The subject name in the certificate will include: br1-router.gns3.lab
% Include the router serial number in the subject name? [yes/no]: no
% Include an IP address in the subject name? [no]: no
Display Certificate Request to terminal? [yes/no]: yes
<a data-footnote-ref href="#user-content-fn-1">Текст CSR...</a>
</code></pre>

Далее необходимо нам необходимо открыть Web Enrollment нашего СA открыть URL: <http://172.16.1.10/certsrv/>. Первым действием мы скачиваем корневой сертификат, `Download a CA certificate`. Выбираем `Base 64` и нажимаем `Download CA certificate`. Как скачается, снова открываем предыдущий URL убрав лишнее справа. \
Далее нажимаете на `Request a certificate`, далее - `Or, submit an advanced certificate request`   &#x20;

<figure><img src="/files/wwkDKISHSVuJQCcq0MZt" alt=""><figcaption></figcaption></figure>

В открывшимся окне, в поле Base-64-encoded CSR копируем текст, который выдал в терминале маршрутизатор, а в поле Certificate Template - `Web Server`.

<figure><img src="/files/bkD8otmwCDI7LboA0oIe" alt=""><figcaption></figcaption></figure>

После жмём Submit, где потом у нас появится скачать только сертификат `Download certificate` (без chain) в формате `Base 64 encoded` и скачиваем его. Затем открываем проводник на Windows, и переходим в директорию куда скачали файлы с сертификатами. Выбираем открыть с помощью... и открываем их с помощью блокнота. Так как это Base 64, то вы увидим набор обычных латинских символов с цифрами, и открывающая и закрывающая строка:

```
-----BEGIN CERTIFICATE-----
MIIE3TCCA8WgAwIBAgITJwAAAAbTx8Yi4sXIFAAAAAAABjANBg...
-----END CERTIFICATE-----
```

После того как открыли оба сертификата: корневой и маршрутизатора, возвращаемся в CLI роутера:\
первое импортируем корневой сертификат центра сертификации CA:

```editorconfig
BR1-ROUTER(config)#crypto pki authenticate TP-gns3.lab

Enter the base 64 encoded CA certificate.
End with a blank line or the word "quit" on a line by itself

### Вставляем корневой сертификат сюда, прямо со строчками
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIQMp5AqhAh7q9EpdfrZDuA0jANBgkqhkiG9w0B

% Do you accept this certificate? [yes/no]: yes
Trustpoint CA certificate accepted.
% Certificate successfully imported
```

Далее импортируем сертификат самого маршрутизатора

```editorconfig
BR1-ROUTER(config)#crypto pki import TP-gns3.lab certificate

Enter the base 64 encoded certificate.
End with a blank line or the word "quit" on a line by itself

-----BEGIN CERTIFICATE-----
MIIE3TCCA8WgAwIBAgITJwAAAAXkDI8pXe0tEAAAAAAABTANBgkqhkiG9w0BA...
-----END CERTIFICATE-----

% Router Certificate successfully imported
```

Выполним необходимую конфигурацию на маршрутизаторе <kbd>BR1-ROUTER</kbd>:

```
crypto ikev2 proposal IKEV2-PROP
 encryption aes-cbc-256
 integrity sha256
 group 14
```

```
crypto ikev2 policy IKEV2-POL
 proposal IKEV2-PROP
```

```
crypto ikev2 profile IKEV2-PROF
 match identity remote fqdn br2-router.gns3.lab
 identity local fqdn br1-router.gns3.lab
 authentication remote rsa-sig
 authentication local rsa-sig
 pki trustpoint TP-gns3.lab
```

Создаём политики применяемые к пользовательским данным, она же `Phase 2`, с точки зрения CLI имеет название `transform-set`

```
crypto ipsec transform-set IPSEC-TS esp-aes 256 esp-sha256-hmac
 mode tunnel
```

Создаём сущность, которая соединит политики Phase 1 и Phase 2

```
crypto ipsec profile IPSEC-PROF
 set transform-set IPSEC-TS
 set ikev2-profile IKEV2-PROF
```

Создаём туннельный интерфейс `Tunnel0`, который и является точкой входа, для инкапсуляции пользовательских данных. На туннельный адресах я использую технический  диапазон ([FC 2544](https://datatracker.ietf.org/doc/html/rfc2544)), который отчасти является приватным.

```
interface Tunnel0
 ip address 172.32.0.1 255.255.255.252
 tunnel mode ipsec ipv4
 tunnel source Gi0/0
 tunnel destination 198.19.102.2
 tunnel protection ipsec profile IPSEC-PROF
```

### Настройка маршрутизатора <kbd>BR2-ROUTER</kbd>

Здесь особо каждое действие не комментируем, так как оно являются аналогичным с <kbd>a-gw1</kbd>, но в некоторых моментах есть диаметрально противоположные параметры:

```
crypto key generate rsa modulus 2048 label br2.keys
```

Создаём trustpoint и работаем с сертификатами:

```
ip host br1-router 198.19.101.2
ip domain name gns3.lab
!
crypto pki trustpoint TP-gns3.lab
 enrollment terminal
 subject-name CN=br2-router.gns3.lab
 revocation-check none
 rsakeypair br2.keys
exit

crypto pki enroll TP-gns3.lab
% Start certificate enrollment .. 

% The subject name in the certificate will include: CN=br2-router.gns3.lab
% The subject name in the certificate will include: br2-router.gns3.lab
% Include the router serial number in the subject name? [yes/no]: no
% Include an IP address in the subject name? [no]: no
Display Certificate Request to terminal? [yes/no]: yes

Текст CSR...
```

{% hint style="info" %}
При работе с запросом на сертификат от spb-gw1, действуем по аналогии, заходим на Web Enrollment CA на контроллере домена по URL и подписываем запрос по шаблону Web Server
{% endhint %}

Подгружаем сертификат CA:

```
BR2-ROUTER(config)#crypto pki authenticate TP-gns3.lab

Enter the base 64 encoded CA certificate.
End with a blank line or the word "quit" on a line by itself

### Вставляем корневой сертификат сюда, прямо со строчками
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIQMp5AqhAh7q9EpdfrZDuA0jANBgkqhkiG9w0B

% Do you accept this certificate? [yes/no]: yes
Trustpoint CA certificate accepted.
% Certificate successfully imported
```

Загружаем сертификат для второго маршрутизатора:

```
BR2-ROUTER(config)#crypto pki import TP-gns3.lab certificate

Enter the base 64 encoded certificate.
End with a blank line or the word "quit" on a line by itself

-----BEGIN CERTIFICATE-----
MIIE3TCCA8WgAwIBAgITJwAAAAXkDI8pXe0tEAAAAAAABTANBgkqhkiG9w0BA...
-----END CERTIFICATE-----

% Router Certificate successfully imported
```

```
crypto ikev2 proposal IKEV2-PROP
 encryption aes-cbc-256
 integrity sha256
 group 14
!
crypto ikev2 policy IKEV2-POL
 proposal IKEV2-PROP
!
crypto ikev2 profile IKEV2-PROF
 match identity remote fqdn br1-router.gns3.lab
 identity local fqdn br2-router.gns3.lab
 authentication remote rsa-sig
 authentication local rsa-sig
 pki trustpoint TP-gns3.lab
!
crypto ipsec transform-set IPSEC-TS esp-aes 256 esp-sha256-hmac
 mode tunnel
!
crypto ipsec profile IPSEC-PROF
 set transform-set IPSEC-TS
 set ikev2-profile IKEV2-PROF
!
interface Tunnel0
 ip address 172.31.0.2 255.255.255.252
 tunnel mode ipsec ipv4
 tunnel source Gi0/0
 tunnel destination 198.19.101.2
 tunnel protection ipsec profile IPSEC-PROF
```

### Диагностика и анализ сделанного

Первым признаком того, что вы всё сделали правильно, это syslog-сообщение, что интерфейс `Tunnel0`\
перешёл в состояние `UP`, так как туннельный режим у нас чистый `IPsec` (tunnel mode ipsec ipv4) в туннельном режиме, а не `GRE over IPsec` (tunnel mode gre ip - выбор по умолчанию).

Также представлены команды, которые покажут, что у вас происходит с IKE и IPSec:

```
BR1-ROUTER# sh crypto ikev2 sa
 IPv4 Crypto IKEv2  SA 

Tunnel-id Local                 Remote                fvrf/ivrf            Status 
2         198.19.101.2/500     198.19.102.2/500     none/none            READY  
      Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:14, Auth sign: RSA, Auth verify: RSA
      Life/Active Time: 86400/35 sec
```

```
a-gw1# show crypto ipsec sa

interface: Tunnel0
    Crypto map tag: Tunnel0-head-0, local addr 198.19.101.2

   protected vrf: (none)
   local  ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
   remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
   current_peer 198.19.102.2 port 500
     PERMIT, flags={origin_is_acl,}
    #pkts encaps: 5, #pkts encrypt: 5, #pkts digest: 5
    #pkts decaps: 5, #pkts decrypt: 5, #pkts verify: 5
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 203.1.113.100, remote crypto endpt.: 203.2.113.100
     plaintext mtu 1438, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet0/0
     current outbound spi: 0xD5ADE48A(3584943242)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
      spi: 0x5683756B(1451455851)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel, }
        conn id: 6, flow_id: SW:6, sibling_flags 80000040, crypto map: Tunnel0-head-0
        sa timing: remaining key lifetime (k/sec): (4343016/1429)
        IV size: 16 bytes
        replay detection support: Y
        Status: ACTIVE(ACTIVE)

     inbound ah sas:

     inbound pcp sas:

     outbound esp sas:
      spi: 0xD5ADE48A(3584943242)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel, }
        conn id: 5, flow_id: SW:5, sibling_flags 80000040, crypto map: Tunnel0-head-0
        sa timing: remaining key lifetime (k/sec): (4343016/1429)
        IV size: 16 bytes
        replay detection support: Y
        Status: ACTIVE(ACTIVE)

     outbound ah sas:

     outbound pcp sas:
```

[^1]: Вот его и копируем)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://adavyshin.gitbook.io/networks/docs/nastroika-ipsec-vpn.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
