# Настройка site-to-site VPN с помощью VyOS

В этом руководстве рассмотрено создание VPN-туннеля site-to-site между частной сетью и Beeline Cloud с использованием VyOS версии 1.4.0.

В процессе выполнения этого руководства вы:

- настроите VPN-сервер IKEv2 на виртуальной машине с VyOS, расположенной в Beeline Cloud;
- подключитесь к VPN-серверу из частной сети;
- настроите маршрутизацию для беспрепятсвенного хождения трафика между частной сетью и Beeline Cloud.

Виртуальная частная сеть (VPN) позволяет надежно шифровать трафик, проходящий через ненадежные сети, например в кафе, на конференции или в аэропорту.

Internet Key Exchange v2 (IKEv2) — это протокол, обеспечивающий прямое туннелирование IPSEC между сервером и клиентом. В реализациях VPN IKEv2 IPSEC обеспечивает шифрование сетевого трафика. IKEv2 изначально поддерживается на некоторых платформах (OS X 10.11+, iOS 9.1+ и Windows 10) без необходимости установки дополнительных приложений и довольно плавно справляется с перебоями в работе клиентов.

## Перед началом работы

Условные обозначения:

- **customer site**: локальное защищенное пространство;
- **beeline cloud**: изолированное пространство в Beeline Cloud, в котором создаются ресурсы.

Для настройки site-to-site VPN понадобится:

- одна виртуальная машина с ОС VyOS версии 1.4.0 в **beeline cloud** в качестве [промежуточной ВМ (джамп-хоста)](./../compute-servers-jump-create.md);
- одна виртуальная машина с ОС VyOS версии 1.4.0, созданная в **customer site** с доступом в интернет с постоянным публичным IP-адресом `client real ip`.
- если в сети **customer site** используется ISO-образ VyOS, то установите OC VyOS на виртуальную машину согласно официальной документации.

![Схема](./image/ipsec.svg)

## 1. Посмотреть IP-адреса

Для настройки VPN-туннеля необходимо узнать публичный и внутренний IP-адреса виртуальных машин, на которых конфигурируется маршрутизатор VyOS.

В руководстве используются следующие значения IP-адресов виртуальных машин с ОС VyOS:

|  IP-адрес | **beeline cloud** | **customer site** |
|---|---|---|
| публичный IP | 77.41.188.88  | 77.41.188.163 |
| внутренний IP | 10.0.0.10 | 172.16.0.10 |

### Узнать публичный IP-адрес маршрутизатора

Для маршрутизатора на стороне **customer site** IP-адреса можно узнать c помощью команд:

- для публичного IP-адреса:

  ```sh
  curl ifconfig.me
  ```

- для внутреннего IP-адреса:

  ```sh
  ip a
  ```

Для маршрутизатора на стороне **beeline cloud** публичный IP-адрес можно узнать на странице сервиса **Виртуальные машины** в разделе **IP-адреса**.

IP-адрес `10.0.0.10` является внутренним и сопоставляется с публичным IP-адресом (Floating IP или FIP). Значение публичного IP-адреса указано в поле **Имя** в разделе **IP-адреса**. По публичному IP-адресу можно подключиться к маршрутизатору VyOS по SSH.

## 2. Сгенерировать ключевые пары

1. Выполните команды для генерации ключевых пар на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   :::: tabs

   = beeline cloud

   - Откройте терминал и подключитесь к маршрутизатору VyOS сети **beeline cloud** по публичному IP-адресу:
      ```bash
      ssh vyos@77.41.188.88
      ```
   - Перейдите в режим конфигурирования:
      ```bash
      configure
      ```
   - Сгнерируйте сертификаты для аутентификации, во время выполнения команды согласитесь со всеми значениями по умолчанию, нажав `Enter`:
      ```bash
      run generate pki key-pair install 'beeline-cloud'
      show pki key-pair 'beeline-cloud' public
      ```
   Результатом команды будет публичный ключ.

   = customer site

   - Откройте еще один терминал и подключитесь к ВМ с VyOS **customer site** по внутреннему IP-адресу:
     ```bash
     ssh vyos@172.16.0.10
     ```
   - Перейдите в режим конфигурирования:
     ```bash
     configure
     ```
   - Сгнерируйте сертификаты для аутентификации, во время выполнения команды согласитесь со всеми значениями по умолчанию, нажав `Enter`:
     ```bash
     run generate pki key-pair install 'customer-site'
     show pki key-pair 'customer-site' public
     ```
   Результатом команды будет публичный ключ.

   ::::

2. Публичные ключи, полученные на шаге 1, необходимо перекрестно добавить на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:
   :::: tabs

   = beeline cloud

   ```bash
   set pki key-pair 'customer-site' public key 'FAAOCAQ8AMII...' # - ключ из customer site
   ```

   = customer site

   ```bash
   set pki key-pair 'beeline-cloud' public key 'MIIBIjANBgkqh...' # - ключ из beeline cloud
   ```

   ::::

## 3. Настроить IPSEC

1. Выберите сетевой интерфейс, на котором будет настраиваться IPSEC-туннель, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   :::: tabs

   = beeline cloud

   ```bash
   set vpn ipsec interface eth1
   ```

   = customer site

   - Узнайте имя сетевого интерфейса на маршрутизаторе, на котором будет настраиваться IPSEC:
  
     ```bash
     show interfaces
     ```

   - Настройте интерфейс IPSEC:

     ```bash
     set vpn ipsec interface <имя_сетевого_интерфейса>
     ```

   ::::

2. Для настройки IPSEC-туннеля используется протокол IKE набора протоколов IPSEC, который имеет две фазы.
    - для настройки первой фазы выполните команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

    ```bash
    set vpn ipsec ike-group aes256-sha256 dead-peer-detection action 'restart'
    set vpn ipsec ike-group aes256-sha256 dead-peer-detection interval '30'
    set vpn ipsec ike-group aes256-sha256 dead-peer-detection timeout '120'
    set vpn ipsec ike-group aes256-sha256 key-exchange 'ikev2'
    set vpn ipsec ike-group aes256-sha256 lifetime '3600'
    set vpn ipsec ike-group aes256-sha256 proposal 1 dh-group '19'
    ```

    - для настройки второй фазы выполните команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

    ```bash
    set vpn ipsec esp-group aes256-sha256 proposal 1 encryption aes256
    set vpn ipsec esp-group aes256-sha256 proposal 1 hash sha256
    set vpn ipsec esp-group aes256-sha256 lifetime '28800' 
    set vpn ipsec esp-group aes256-sha256 mode 'tunnel' 
    set vpn ipsec esp-group aes256-sha256 pfs 'dh-group19' 
    ```

3. Настройте пиры и аутентификацию с использованием [публичных ключевых пар](#2-сгенерировать-ключевые-пары), выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   :::: tabs

   = beeline cloud

   ```bash
   set vpn ipsec site-to-site peer CUSTOMER-SITE authentication mode 'rsa'
   set vpn ipsec site-to-site peer CUSTOMER-SITE authentication rsa local-key 'beeline-cloud'
   set vpn ipsec site-to-site peer CUSTOMER-SITE authentication rsa remote-key 'customer-site'
   ```

   = customer site
  
   ```bash
   set vpn ipsec site-to-site peer BEELINE-CLOUD authentication mode 'rsa'
   set vpn ipsec site-to-site peer BEELINE-CLOUD authentication rsa local-key 'customer-site'
   set vpn ipsec site-to-site peer BEELINE-CLOUD authentication rsa remote-key 'beeline-cloud'
   ```

   ::::
4. Настройте для пиров адреса подключения, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   На этом шаге [укажите ваши значения IP-адресов](#1-посмотреть-ip-адреса) виртуальных машин с VyOS.

   :::: tabs

   = beeline cloud

   ```bash
   set vpn ipsec site-to-site peer CUSTOMER-SITE ike-group 'aes256-sha256'
   set vpn ipsec site-to-site peer CUSTOMER-SITE local-address '10.0.0.10'
   set vpn ipsec site-to-site peer CUSTOMER-SITE remote-address '77.41.188.163'
   set vpn ipsec site-to-site peer CUSTOMER-SITE tunnel 0 esp-group 'aes256-sha256'
   set vpn ipsec site-to-site peer CUSTOMER-SITE default-esp-group 'aes256-sha256'
   ```

   = customer site

   ```bash
   set vpn ipsec site-to-site peer BEELINE-CLOUD ike-group 'aes256-sha256'
   set vpn ipsec site-to-site peer BEELINE-CLOUD local-address '172.16.0.10'
   set vpn ipsec site-to-site peer BEELINE-CLOUD remote-address '77.41.188.88'
   set vpn ipsec site-to-site peer BEELINE-CLOUD tunnel 0 esp-group 'aes256-sha256'
   set vpn ipsec site-to-site peer BEELINE-CLOUD default-esp-group 'aes256-sha256'
   ```

   ::::
5. Настройте статические маршруты, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   Для примера, в **customer site** используется сеть с адресом `172.16/16`, в **beeline cloud** — две сети: `10/8` и `192.168/16`.

   :::: tabs

   = beeline cloud

   ```bash
   set vpn ipsec site-to-site peer CUSTOMER-SITE tunnel 0 local prefix '10.0.0.0/8'
   set vpn ipsec site-to-site peer CUSTOMER-SITE tunnel 0 local prefix '192.168.0.0/16'
   set vpn ipsec site-to-site peer CUSTOMER-SITE tunnel 0 remote prefix '172.16.0.0/16'
   ```

   = customer site

   ```bash
   set vpn ipsec site-to-site peer BEELINE-CLOUD tunnel 0 local prefix '172.16.0.0/16'
   set vpn ipsec site-to-site peer BEELINE-CLOUD tunnel 0 remote prefix '10.0.0.0/8'
   set vpn ipsec site-to-site peer BEELINE-CLOUD tunnel 0 remote prefix '192.168.0.0/16'
   ```

   ::::
6. Укажите *инициатора* и *ответчика*, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

   :::: tabs

   = beeline cloud

   ```bash
   set vpn ipsec site-to-site peer CUSTOMER-SITE connection-type respond
   ```

   = customer site

   ```bash
   set vpn ipsec site-to-site peer BEELINE-CLOUD connection-type initiate
   ```

   ::::
7. Сохраните конфигурации, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

    ```bash
    save
    ```

8. Примените конфигурации, выполнив команду на маршрутизаторах в сети **beeline cloud** и в сети **customer site**:

    ```bash
    commit
    ```

## 4. Проверить соединение

Выполните команду на любом из маршрутизаторов в сети **beeline cloud** или в сети **customer site**:

```bash
run show vpn ipsec status
ping -c 3 172.16.0.10
ping -c 3 10.0.0.10
```

## Диагностика неисправностей

Если во время применения конфигурации команда `commit` завершится с ошибкой, то попробуйте выполнить команды для диагностики неисправностей.

Основные команды для диагностики проблем:

- `run show vpn ipsec status`
- `run show vpn ipsec state`
- `run show vpn ipsec sa`
- `run show vpn ipsec policy`
- `run show log vpn`
