[Из песочницы] 802.1Q для управления L2VPN ГОСТ или как сэкономить на обновлении ПО

ofyzy1y2s4edvqpybdgdyod0xqu.png

Ситуация


Я должен поднять VPN соединение между двумя площадками в сети. В серверной, кажется, были шлюзы безопасности С-Терра Шлюз версии 4.2. Схема простая. Вендор даже опубликовал рекомендованный сценарий настройки. Но… в сценарии вендора используется три сетевых интерфейса, а на моих шлюзах их только два.

Завариваю кофе, вспоминаю свой CCNA и пробую использовать то, что есть — свободные порты в управляемых коммутаторах.

Моя сеть


Моя сеть — это две территориально разделенные площадки в одном broadcast домене. Адресное пространство: 10.10.205.0/24:

xtylod9wi-ka5t3rmxxcaeqp8um.png

На руках два шлюза безопасности С-Терра Шлюз версии 4.2 с пакетом С-Терра L2.

О пакете С-Терра L2

Пакет позволяет перевести один или несколько интерфейсов шлюза в PROMISC режим. PROMISC интерфейс перехватывает фреймы канального уровня, а С-Терра L2 инкапсулирует их в UDP.
Далее UDP пакеты зашифровываются (инкапсулируются в ESP). Так получается L2-over-L3 VPN соединение. С-Терра L2 предустановлен на все шлюзы безопасности и активируется отдельной лицензией.


В рекомендуемом сценарии шлюзы безопасности размещены на границе сети, а для управления выделен отдельный интерфейс:

4vhkwwvjtu2xl7p4psh3fk-erek.png

Чтобы было понятнее опишу интерфейсы:

  • Gi0/0 — PROMISC интерфейсы;
  • Gi0/1 — L3 WAN интерфейсы;
  • Gi0/2 — выделенные интерфейсы управления. Я так понимаю, что вторым шлюзом безопасности я должен управлять через VPN туннель.


Решение


Первая кружка кофе закончилась, пока я читал на Хабре про 802.1Q — вспоминал CCNA. Вторая кружка остыла (погрею в микроволновке), пока коммутировал оборудование, как показано на рисунке:

wshxbvgobzk31tbxbrdoy0xnn08.png

Выделяю три типа трафика:

  • Основной трафик между устройствами R1 и R2. Обозначу как BULK DATA и вынесу в VLAN 205. Перед передачей между площадками BULK DATA должен быть зашифрован;
  • Трафик управления шлюзами — MGMT. Вынесу в VLAN 10. MGMT трафик до шлюза на удаленной площадке должен быть зашифрован;
  • BULK DATA и MGMT после шифрования обозначу как ESP DATA и вынесу в VLAN 100.


По моим прикидкам, передача BULK DATA/ESP DATA в сети будет выглядеть так (зелеными линиями изобразил незашифрованный трафик, красными — зашифрованный):

rjsogqw6l9aembxnwt-ops963tw.png

Передача MGMT для управления шлюзом на локальной площадке:

wzsww0eue7o6fh-g5jqq1enpvyu.png

Передача MGMT/ESP DATA для управления шлюзом на удаленной площадке:

oaw4lffykpbizv1fgjrz48gzt5u.png

5 шагов настройки


Шаг 1. Разбираюсь с BULK DATA

Выделяю для BULK DATA отдельный VLAN 205. Для этого интерфейс Gi0/2 устройств SW1 и SW2 устанавливаю в access mode с VLAN 205:

sw1(config)#
interface gi0/2
    description BULK_TO_R1
    switchport access vlan 205
    no shutdown

sw2(config)#
interface gi0/2
  description BULK_TO_R2
  switchport access vlan 205
  no shutdown


Делаю интерфейсы Gi0/0 шлюзов GW1 и GW2 PROMISC интерфейсами. Чтобы передать BULK DATA на PROMISC интерфейс, настраиваю trunk до PROMISC интерфейса:

sw1(config)#
interface gi0/0
  description LINK_TO_PROMISC_GW1
  switchport mode trunk
  switchport trunk allowed vlan 205
  switchport trunk encapsulation dot1q
  no shutdown

sw2(config)#
interface gi0/0
  description LINK_TO_PROMISC_GW2
  switchport mode trunk
  switchport trunk allowed vlan 205
  switchport trunk encapsulation dot1q
  no shutdown


b15o1uggzlhuv0sbhc1fjq6qzz4.png

Шаг 2. Разбираюсь с локальным MGMT

Согласно плану, MGMT трафик выношув VLAN 10. Адресное пространство для VLAN 10: 10.76.76.128/28.

На устройстве SW1 и SW2 создаю виртуальные интерфейсы vlan10:

sw1(config)#
interface vlan10
  ip address 10.76.76.129 255.255.255.240
  no shutdown 

sw2(config)#
interface vlan10
  ip address 10.76.76.142 255.255.255.240
  no shutdown


Делаю VLAN 10 native VLAN«ом, чтобы не настраивать 802.1Q интерфейсы на шлюзе:

sw1(config)#
interface gi0/1
  description LINK_TO_WAN_GW1
  switchport mode trunk
  switchport trunk allowed vlan 10
  switchport trunk native vlan 10
  switchport trunk encapsulation dot1q
  no shutdown

sw2(config)#
interface gi0/1
  description LINK_TO_WAN_GW2
  switchport mode trunk
  switchport trunk allowed vlan 10
  switchport trunk native vlan 10
  switchport trunk encapsulation dot1q
  no shutdown


hnowhxb7xzkwzcpnruz6al2d3m0.png

Настраиваю интерфейсы Gi0/1 шлюзов безопасности:

GW1(config)#
interface gi0/1
   ip address 10.76.76.137 255.255.255.240
   no shutdown

GW2(config)#
interface gi0/1
  ip address 10.76.76.138 255.255.255.240
  no shutdown


Теперь GW1 доступен по SSH с устройства SW1:

sw1#ssh –l root 10.76.76.137
Password:
S-Terra Gate 4.2.18201 (amd64)
root@GW1~#


Аналогично GW2 доступен по SSH с устройства SW2:

sw2#ssh –l root 10.76.76.138
Password:
S-Terra Gate 4.2.18201 (amd64)
root@GW2~#


Неплохо, налил еще кружечку кофе.

Шаг 3. Разбираюсь с MGMT до шлюза на удаленной площадке

MGMT трафик до шлюза на удаленной площадке должен шифроваться. Для этого прокину VLAN 10 через VPN. В VPN туннель попадет весь трафик, перехваченный с PROMISC интерфейса. Добавлю в trunk до PROMISC интерфейса VLAN 10:

sw1(config)#
interface gi0/0
  description LINK_TO_PROMISC_GW1  
  switchport trunk allowed vlan 10, 205

sw2(config)#
interface gi0/0
  description LINK_TO_PROMISC_GW1  
  switchport trunk allowed vlan 10, 205


Не тратьте полчаса на траблшутинг!

На PROMISC интерфейс не должен попадать ESP DATA, поэтому важно исключить VLAN 100 из транков LINK_TO_PROMISC_GW1 и LINK_TO_PROMISC_GW2 в вариантах:

switchport trunk allowed vlan 1-99,101-4096


Шаг 4. Дошел до ESP DATA

Выделяю ESP DATA в VLAN 100 на шлюзах GW1 и GW2. Адресное пространство для VLAN 100: 192.168.10.0/30

Для этого на WAN интерфейсе Gi0/1 шлюзов GW1 и GW2 создаю 802.1Q интерфейс Gi0/1.100.
Выходящий трафик с такого интерфейса будет принадлежать VLAN 100:

GW1(config)#
interface gi0/1.100
   ip address 192.168.10.1 255.255.255.252
   no shutdown

GW2(config)#
interface gi0/1.100
  ip address 192.168.10.2 255.255.255.252
  no shutdown


ztuxmgcv8oopfa_kdd4_g5q_uei.png

Разрешаю прохождение VLAN 100 в trunk LINK_TO_WAN_GW1 и LINK_TO_WAN_GW2:

sw1(config)#
interface gi0/1
  description LINK_TO_WAN_GW1
  switchport trunk allowed vlan 10,100

sw2(config)#
interface gi0/1
  description LINK_TO_WAN_GW2
  switchport trunk allowed vlan 10,100


Линк между устройствами SW1 и SW2 также должен передать тегированный VLAN 100 трафик:

sw1(config)#
interface gi0/3
  description LINK_TO_SW2
  switchport mode trunk
  switchport trunk allowed vlan 100
  switchport trunk encapsulation dot1q
  no shutdown

sw2(config)#
interface gi0/3
  description LINK_TO_SW1
  switchport mode trunk
  switchport trunk allowed vlan 100
  switchport trunk encapsulation dot1q
  no shutdown


Шаг 5. Настраиваю С-Терра L2 и IPsec VPN с ГОСТом

С-Терра L2 настраивается в операционной системе с помощью конфигурационного файла /opt/VPNagent/etc/l2.conf. Для GW1:

vif tap0
bridge br0
capture eth0
remote 192.168.10.2
mssfix 1400
passtos


где:

capture eth0 — выбор PROMISC интерфейса, remote 192.168.10.2 — IP адрес IPsec пира (Gi0/1.100 интерфейс шлюза GW2).

Для GW2:

vif tap0
bridge br0
capture eth0
remote 192.168.10.1
mssfix 1400
passtos


Настраиваю параметры IKE/IPsec. Для GW1:
Шлюзы будут использовать в качестве идентификаторов hostname, задам предопределенный ключ для аутентификации (Правилам Пользования для аутентификации нужно использовать цифровые сертификаты, поменяю потом):

GW1(config)#
crypto isakmp identity hostname
ip host GW2 192.168.10.2
crypto isakmp key KEY hostname GW2


Настраиваю параметры dead peer detection (DPD):

GW1(config)#
crypto isakmp keepalive 10 2
crypto isakmp keepalive retry-count 5


Задаю параметры IPsec Phase I:

GW1(config)#
crypto isakmp policy 1
  encr gost
  hash gost3411-256-tc26
  auth pre-share
  group vko2


Задаю параметры IPsec Phase II:

GW1(config)#
crypto ipsec transform-set TSET esp-gost28147-4m-imit
   mode tunnel


Поскольку перехваченные PROMISC интерфейсом L2 фреймы инкапсулируются в UDP, то список доступа, определяющий трафик для шифрования:

GW1(config)#
ip access-list extended LIST
   permit udp host 192.168.10.1 host 192.168.10.2


Создаю криптокарту и привязываю ее к Gi0/1.100:

GW1(config)#
crypto map CMAP 1 ipsec-isakmp
  match address LIST
  set transform-set TSET
  set peer 192.168.10.2
interface gi0/1.100
  crypto map CMAP


Указываю маршрут по умолчанию через IP адрес IPsec пира:

GW1(config)#
ip route 0.0.0.0 0.0.0.0 192.168.10.2 	


Конфигурация шлюза GW2:

GW2(config)#
crypto isakmp identity hostname
ip host GW1 192.168.10.1
crypto isakmp key KEY hostname GW1
crypto isakmp keepalive 10 2
crypto isakmp keepalive retry-count 5
crypto isakmp policy 1
  encr gost
  hash gost3411-256-tc26
  auth pre-share
  group vko2
crypto ipsec transform-set TSET esp-gost28147-4m-imit
  mode tunnel
ip access-list extended LIST
  permit udp host 192.168.10.2 host 192.168.10.1
crypto map CMAP 1 ipsec-isakmp
  match address LIST
  set transform-set TSET
  set peer 192.168.10.1
interface gi0/1.100
  crypto map CMAP
ip route 0.0.0.0 0.0.0.0 192.168.10.1


Получилось?


С устройства R1 запускаю ping до R2:

R1#ping 10.10.205.2 
Type escape sequence to abort. 

Sending 5, 100-byte ICMP Echos to 10.10.205.2, timeout is 2 seconds: 
!!!!! 
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/2/3 ms

R2 отвечает на ICMP. Неужели получилось? Проверяю ARP таблицы устройств R1 и R2:

R1#show arp 
Protocol  Address          Age (min)  Hardware Addr   Type   Interface 
Internet  10.10.205.1             -   aabb.cc00.5020  ARPA   GigabitEthernet0/2 
Internet  10.10.205.2            54   aabb.cc00.6020  ARPA   GigabitEthernet0/2

R2#show arp 
Protocol  Address          Age (min)  Hardware Addr   Type   Interface 
Internet  10.10.205.1            52   aabb.cc00.5020  ARPA   GigabitEthernet0/2 
Internet  10.10.205.2             -   aabb.cc00.6020  ARPA   GigabitEthernet0/2


Устройства R1 и R2 считают, что находятся в одной broadcast подсети.

Устройства SW1 и SW2 считают, что соединены друг с другом двумя линками:

sw1#show cdp neighbors
Device ID    Local Intrfce   Holdtme     Capability  Platform  Port ID 
sw2          Gi0/0           146             R S I  Linux Uni Gi0/0 
sw2          Gi0/3           146             R S I  Linux Uni Gi0/3 
R1           Gi0/2           156              R B   Linux Uni Gi0/2

sw2#show cdp neighbors
Device ID    Local Intrfce   Holdtme     Capability  Platform  Port ID 
sw1          Gi0/0           140             R S I  Linux Uni Gi0/0 
sw1          Gi0/3           140             R S I  Linux Uni Gi0/3 
R2           Gi0/2           156              R B   Linux Uni Gi0/2


Пробую подключиться к GW2 по SSH с устройства SW1:

sw1#ssh –l root 10.76.76.138
Password:
S-Terra Gate 4.2.18201 (amd64)
root@GW2~#


Вывод: площадки 1 и 2 прозрачно связаны в единый broadcast домен. Проверю, есть ли в канале шифрование:

Статистика IPsec туннеля на устройстве GW1:

root@GW1:~# sa_mgr show 
ISAKMP sessions: 0 initiated, 0 responded

ISAKMP connections: 
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd 
1 2 (192.168.10.1,500)-(192.168.10.2,500) active 31378 31502

IPsec connections: 
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd 
1 2 (192.168.10.1,*)-(192.168.10.2,*) 17 ESP tunn 508224 27672


Поднят IPsec туннель между 192.168.10.1 и 192.168.10.2.

Проверил, между устройствами SW1 и SW2 передается только ESP трафик, не считая STP. Вот дамп трафика с интерфейса gi0/3 устройства SW1:

e2-eiykc2pvlf6omenysrwajnc0.png

В итоге


Выпил три кружки кофе — потом не спал всю ночь, но не пришлось покупать новое железо и обновляться. Может и стоило, в версии 4.3 вендор довел L2 до ума. Думаю взять версию 4.3 на тестирование.

Анонимный инженер
t.me/anonimous_engineer

© Habrahabr.ru