Настройка DMVPN (phase 2) dual cloud с протоколом динамической маршрутизации iBGP
Дополнительные файлы:
В документе представлено описание настройки DMVPN (phase2) на «С-Терра Шлюз». Инструкция предназначена для сетевых инженеров, знакомых с данной технологией по оборудованию Cisco, а также хорошо разбирающихся в базовых настройках «С-Терра Шлюз».
Инструкция применима только к шлюзам, имеющим класс сертификации КС1 (класс можно посмотреть в файле /etc/image_version, параметр CLASS) и архитектуру x64. Если требуется поддержка более высоких классов сертификации – обратитесь с запросом.
Технология DMVPN (англ. Dynamic Multipoint Virtual Private Network – динамическая многоточечная виртуальная частная сеть) позволяет динамически строить защищенные соединения без необходимости описывать каждое соединение в политике безопасности, что существенно упрощает масштабирование крупных сетей с полносвязной топологией. Автоматическое построение полносвязной защищенной топологии достигается за счет применения динамических протоколов маршрутизации и таких протоколов как NHRP (англ. Next Hop Resolution Protocol – протокол разрешения следующего узла) и multipoint GRE (англ. Generic Routing Encapsulation).
Инженер, внедряющий и эксплуатирующий технологию DMVPN на базе продукта «С-Терра Шлюз» в производственной среде, должен свободно ориентироваться в настройке базовых сценариев (например, site-to-site IPsec) продукта «С-Терра Шлюз», а также должен знать и понимать следующие технологии и протоколы: PKI, IPsec, NAT, Firewall, NHRP, GRE, OSPF, BGP, VRRP.
Перед настройкой должно быть выполнено следующее:
1. Шлюзы должны быть инициализированы.
2. На шлюзах должны быть установлены корневой сертификат и сертификат устройства.
Исключительно для тестовых целей можно использовать тестовый УЦ от «КриптоПро», веб-интерфейс: https://www.cryptopro.ru/certsrv/certrqxt.asp.
Рисунок 1. Общая схема стенда
Данная инструкция описывает настройку технологии DMVPN (phase2) на шлюзах безопасности «С-Терра Шлюз 4.2» Будет настроено две mGRE подсети (dual cloud) и использован протокол динамической маршрутизации iBGP. По окончании настройки реализуется возможность построения динамических защищенных соединений между всеми подсетями филиалов, а также подсетями филиалов и центрального офиса (см. рисунок 1).
Стенд состоит из 16 устройств:
· «С-Терра Шлюз 4.2»: Hub1, Hub2, Spoke1-n1, Spoke1-n2, Spoke2.
· Роутеры на базе ОС Debian 9: Int_router1_Hub, Ext_router1_Hub1, Ext_router2_Hub2, Core_router, Ext_router1_Spoke1, Ext_router2_Spoke1.
· Управляемые коммутаторы: Int_switch1_Hub, Int_switch1_Spoke1.
· Персональные компьютеры: host_behind_hub, host_behind_spoke1, host_behind_spoke2.
Роутеры на базе ОС Debian 9 выбраны в качестве примера. В общем случае могут быть использованы любые маршрутизаторы, поддерживающие функции NAT и динамической маршрутизации (NAT в ОС Debian 9 будет реализован при помощи iptables, а динамическая маршрутизация при помощи пакета FRR).
Между шлюзами в филиалах и центральным офисом устанавливаются статические IPsec туннели. Инициатором построения туннелей является служебный трафик протоколов NHRP/BGP.
Между филиальными шлюзами устанавливаются динамические IPsec туннели. Инициатором построения туннелей является реальный трафик защищаемых подсетей филиалов.
Допускается расположение шлюзов безопасности за устройствами, выполняющими функции трансляции сетевых адресов. Трансляция в этом случае должна быть статическая (порты 500/4500 протокола UDP должны быть проброшены на «С-Терра Шлюз»).
Для корректной работы DMVPN с NAT необходимо, чтобы режим IPsec туннеля был транспортный.
Параметры протокола IKE:
· Аутентификация при помощи цифровых сертификатов, алгоритм подписи – ГОСТ R 34.10-2012;
· Алгоритм шифрования – ГОСТ 28147-89 (ключ 256 бит);
· Алгоритм вычисления хеш-функции – ГОСТ R 34.11-2012 TC26 (ключ 256 бит);
· Алгоритм выработки общего ключа (аналог алгоритма Диффи-Хеллмана) – VKO2 ГОСТ R 34.10-2012 (ключ 256 бит).
Параметры протокола ESP:
· Комбинированный алгоритм шифрования и контроля целостности – ESP_GOST-4M-IMIT (ключ 256 бит).
· Режим туннеля – транспортный.
Динамическая маршрутизация защищаемых подсетей филиалов и центрального офиса обеспечивается протоколом Internal BGP.
Шлюзы безопасности, установленные в филиалах, отсылают маршрутную информацию о защищаемых подсетях только шлюзам в центральный офис, соответственно, получение маршрутной информации происходит тоже только из центрального офиса. Маршруты до защищаемых подсетей устанавливаются через mGRE-интерфейсы.
Все шлюзы безопасности находятся в одной автономной системе №65000. Центральные шлюзы являются роут-рефлекторами (route-reflector), а филиальные – роут-рефлектор клиентами (route-reflector client).
Между шлюзами в центральном офисе и роутером Int_router1_Hub (AS №65001) передача маршрутной информации обеспечивается при помощи eBGP.
Отказоустойчивость центрального офиса. Отказоустойчивость центрального офиса, а именно шлюзов безопасности Hub1 и Hub2, обеспечивается протоколами NHRP и BGP. Филиальные шлюзы одновременно регистрируются по протоколу NHRP в Hub1 и Hub2, а также получают маршрутную информацию обо всех защищаемых подсетях от Hub1 и Hub2 через соответствующий mGRE-интерфейс. Роутер Int_router1_Hub получает маршруты до филиальных подсетей от Hub1 и Hub2. Резервирование подключения к Интернет обеспечивается следующим принципом – каждый центральный шлюз подключается к соответствующему Интернет провайдеру.
В силу некоторых особенностей открытой реализации протокола NHRP в пакете OpenNHRP необходимо придерживаться следующего принципа на филиальных шлюзах: одна mGRE-подсеть на один центральный шлюз. То есть в данной инструкции необходимо две mGRE-подсети на филиальных шлюзах, одна для Hub1, а вторая для Hub2.
Отказоустойчивость филиала. Отказоустойчивость филиала реализована протоколом VRRP, работающим со стороны защищаемой подсети. Сервис Keepalived, реализующий протокол VRRP, при помощи скриптов дополнительно контролирует состояние канала Интернет провайдера посредством проверки доступности заданных узлов по протоколу ICMP. Если все заданные узлы недоступны определенное время (по умолчанию 10 секунд), то нода кластера переходит в состояние FAULT, что приводит к переключению кластера на резервную ноду (в случае, если она была в состоянии BACKUP), которая должна быть подключена к другому Интернет провайдеру. Резервирование подключения к Интернет обеспечивается следующим принципом – каждая нода кластера филиала подключается к соответствующему Интернет провайдеру.
На портах коммутатора Int_switch1_Spoke1, подключенных к шлюзам, обязательно должен быть включен режим portfast.
Перед настройкой стенда необходимо выполнить предварительные требования к начальному состоянию «С-Терра Шлюз», которые описаны в главе «Требования к начальному состоянию «С-Терра Шлюз».
На данном устройстве должны быть настроены IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки для ОС Debian (содержимое файла /etc/network/interfaces).
На данном устройстве должны быть настроены IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки для ОС Debian (содержимое файла /etc/network/interfaces).
На данном устройстве должны быть настроены IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки для ОС Debian (содержимое файла /etc/network/interfaces).
На данном устройстве сетевые интерфейсы, коммутирующие шлюзы Hub1, Hub2 и роутер Int_router1_Hub, должны быть в одном VLAN и в режиме portfast.
На данном устройстве сетевые интерфейсы, коммутирующие шлюзы Spoke1_n1, Spoke1_n2 и персональный компьютер host_behind_spoke1, должны быть в одном VLAN и в режиме portfast.
На данном устройстве должны быть настроены IP-адреса в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
На данном устройстве должно быть настроено:
1. IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
2. Source NAT/Destination NAT. В приложении представлены настройки iptables (содержимое файла /etc/iptables.rules).
На данном устройстве должно быть настроено:
1. IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
2. Source NAT/Destination NAT. В приложении представлены настройки iptables (содержимое файла /etc/iptables.rules).
На данном устройстве должно быть настроено:
1. IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
2. Source NAT/Destination NAT. В приложении представлены настройки iptables (содержимое файла /etc/iptables.rules).
На данном устройстве должно быть настроено:
1. IP-адреса и маршрутизация в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
2. Source NAT/Destination NAT. В приложении представлены настройки iptables (содержимое файла /etc/iptables.rules).
На данном устройстве должно быть настроено:
1. IP-адреса в соответствии с общей схемой стенда (см. рисунок 1). В приложении представлены сетевые настройки (содержимое файла /etc/network/interfaces).
2. Динамическая маршрутизация. В приложении представлены настройки FRR.
На всех шлюзах (Hub1, Hub2, Spoke1-n1, Spoke1-n2, Spoke2) нужно выполнить первоначальную подготовку. Подготовка включает в себя обновление предыдущих версий пакетов и установку новых, а также другие вспомогательные операции. Для подготовки понадобится USB-flash накопитель.
Для дальнейшей работы вам потребуются следующие файлы (доступны для скачивания вместе с данным документом):
· скрипт dmvpn_prep.bash;
· архив dmvpn_<version>.tar.
Чтобы осуществить подготовку шлюзов выполните следующие шаги:
1. Подключитесь к шлюзу консольным кабелем и войдите в CLI разграничения доступа (или Initial CLI). Для этого, после появления сообщения:
S-Terra administrative console
введите логин и пароль для CLI разграничения доступа:
Пользователь и пароль по умолчанию: administrator, s-terra. Обязательно смените пароль для пользователя administrator при помощи команды change user password.
login as: administrator
administrator's password:
administrator@sterragate]
Отключите автоматическое закрытие сессии CLI разграничения доступа по неактивности:
administrator@sterragate] session idle timeout disable
В производственной эксплуатации выполнять данную команду запрещено.
2. Войдите в linux bash, чтобы попасть в linux bash выполните следующую команду в CLI разграничения доступа:
administrator@sterragate] system
Entering system shell...
root@sterragate:~#
3. Скопируйте скрипт dmvpn_prep.bash и архив dmvpn_<version>.tar на USB-flash накопитель и подключите его в свободный USB порт на «С-Терра Шлюз» (USB-flash накопитель автоматически примонтируется в директорию /media/<ID>).
4. Скопируйте скрипт dmvpn_prep.bash и архив dmvpn_<version>.tar из /media/<ID> в директорию /root, например:
root@sterragate:~# cp /media/9C13-E314/dmvpn* /root
5. Дайте права на запуск скрипту dmvpn_prep.bash:
root@sterragate:~# chmod u+x dmvpn_prep.bash
6. Запустите скрипт dmvpn_prep.bash и дождитесь его завершения:
root@sterragate:~# ./dmvpn_prep.bash
##################################################
Preparation of S-Terra Gate 4.2 for DMVPN scenario
##################################################
...
#######################################################
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Preparation completed successfully, please, reboot OS
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#######################################################
7. Перезагрузите шлюз:
root@sterragate:~# reboot
8. Повторите предыдущие пункты на всех оставшихся шлюзах.
Перед началом настроек убедитесь в том, что была выполнена процедура подготовки шлюзов, описанная в главе «Подготовка устройств «С-Терра Шлюз».
Краткий план настройки:
1. Базовые сетевые настройки.
2. Настройка IPsec и Firewall.
3. Настройка mGRE-интерфейса.
4. Настройка NHRP.
5. Настройка BGP.
1. Войдите в CLI разграничения доступа (или Initial CLI). Для этого, после появления сообщения:
S-Terra administrative console
введите логин и пароль для CLI разграничения доступа:
Пользователь и пароль по умолчанию: administrator, s-terra. Обязательно смените пароль для пользователя administrator при помощи команды change user password.
login as: administrator
administrator's password:
administrator@sterragate]
2. Базовые сетевые настройки осуществляются из cisco-like консоли шлюза, чтобы попасть в нее выполните следующую команду в CLI разграничения доступа:
Пользователь и пароль по умолчанию: cscons, csp. Обязательно смените пароль для пользователя cscons и enable пароль. Под пользователем cscons можно осуществлять удаленное управление шлюзом по SSH.
administrator@sterragate] configure
sterragate login: cscons
Password:
S-Terra Gate 4.2.18201 (amd64)
sterragate#
3. Настройте имя устройства, IP-адреса и маршрут по умолчанию в соответствии с общей схемой стенда (см. рисунок 1):
sterragate#configure terminal
sterragate(config)#hostname hub1
hub1(config)#interface GigabitEthernet0/0
hub1(config-if)# ip address 100.100.100.2 255.255.255.0
hub1(config-if)# no shutdown
hub1(config-if)#interface GigabitEthernet0/1
hub1(config-if)# ip address 192.168.255.10 255.255.255.0
hub1(config-if)# no shutdown
hub1(config-if)#ip route 0.0.0.0 0.0.0.0 100.100.100.1
hub1(config)#end
4. Проверьте доступность маршрута по умолчанию:
hub1#ping 100.100.100.1
PING 100.100.100.1 (100.100.100.1) 100(128) bytes of data.
108 bytes from 100.100.100.1: icmp_req=1 ttl=64 time=0.404 ms
108 bytes from 100.100.100.1: icmp_req=2 ttl=64 time=0.216 ms
108 bytes from 100.100.100.1: icmp_req=3 ttl=64 time=0.232 ms
108 bytes from 100.100.100.1: icmp_req=4 ttl=64 time=0.212 ms
108 bytes from 100.100.100.1: icmp_req=5 ttl=64 time=0.230 ms
--- 100.100.100.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4002ms
rtt min/avg/max/mdev = 0.212/0.258/0.404/0.075 ms
Настройки IPsec и Firewall осуществляются из cisco-like консоли шлюза.
1. Параметры IKE:
hub1#conf t
hub1(config)#crypto isakmp identity dn
hub1(config)#crypto isakmp session-time-max 10
hub1(config)#crypto isakmp keepalive 1 3
hub1(config)#crypto isakmp keepalive retry-count 3
hub1(config)#
hub1(config)#crypto isakmp policy 1
hub1(config-isakmp)# encr gost
hub1(config-isakmp)# hash gost341112-256-tc26
hub1(config-isakmp)# authentication gost-sig
hub1(config-isakmp)# group vko2
hub1(config-isakmp)#
hub1(config-isakmp)#exit
2. Параметры IPsec
2.1. Список доступа для трафика:
При работе «С-Терра Шлюз» версии 4.2 через NAT в транспортном IPsec режиме нельзя указывать в фильтрах для трафика, требующего шифрование, протоколы отличные от IP. То есть нельзя написать: permit gre host 100.100.100.2 any.
hub1(config)#ip access-list extended IPSEC_DMVPN
hub1(config-ext-nacl)# deny icmp host 100.100.100.2 any
hub1(config-ext-nacl)# deny udp host 100.100.100.2 any
hub1(config-ext-nacl)# deny tcp host 100.100.100.2 any
hub1(config-ext-nacl)# deny ip host 100.100.100.2 host 224.0.0.5
hub1(config-ext-nacl)# deny ip host 100.100.100.2 host 224.0.0.6
hub1(config-ext-nacl)# deny ip host 100.100.100.2 host 224.0.0.18
hub1(config-ext-nacl)# permit ip host 100.100.100.2 any
hub1(config-ext-nacl)#exit
hub1(config)#
После исключения из шифрования (строки с deny) протоколов ICMP/UDP/TCP под фильтр permit ip host 100.100.100.2 any попадет как раз GRE трафик.
2.2. Включите автоматическую фрагментацию больших пакетов:
hub1(config)#crypto ipsec df-bit clear
2.3. Задайте алгоритм шифрования и режим работы IPsec:
hub1(config)#crypto ipsec transform-set GOST esp-gost28147-4m-imit
hub1(cfg-crypto-trans)# mode transport
hub1(cfg-crypto-trans)#exit
hub1(config)#
2.4. Создайте динамическую крипто-карту и привяжите ее к статической:
hub1(config)#crypto dynamic-map DMAP 1
hub1(config-crypto-map)# match address IPSEC_DMVPN
hub1(config-crypto-map)# set transform-set GOST
hub1(config-crypto-map)# set dead-connection history off
hub1(config-crypto-map)#crypto map VPN 1 ipsec-isakmp dynamic DMAP
hub1(config)#
3. Параметры Firewall:
3.1. Список доступа для трафика:
Список доступа должен блокировать открытый трафик из защищаемый подсети шлюза в подсети RFC1918/RFC6598 (считаем, что трафик непубличных подсетей должен обязательно шифроваться), а также незашифрованный GRE.
hub1(config)#ip access-list extended FIREWALL_OUT
hub1(config-ext-nacl)# deny ip 192.168.100.0 0.0.0.255 100.64.0.0 0.63.255.255
hub1(config-ext-nacl)# deny ip 192.168.100.0 0.0.0.255 172.16.0.0 0.15.255.255
hub1(config-ext-nacl)# deny ip 192.168.100.0 0.0.0.255 192.168.0.0 0.0.255.255
hub1(config-ext-nacl)# deny ip 192.168.100.0 0.0.0.255 10.0.0.0 0.255.255.255
hub1(config-ext-nacl)# deny gre any any
hub1(config-ext-nacl)# permit ip any any
hub1(config-ext-nacl)#exit
hub1(config)#
4. Прикрепите крипто-карту и список доступа на внешний интерфейс:
hub1(config)#interface GigabitEthernet0/0
hub1(config-if)# ip access-group FIREWALL_OUT out
hub1(config-if)# crypto map VPN
hub1(config-if)#exit
5. Отключите проверку списка отозванных сертификатов (CRL):
Если требуется проверка CRL (рекомендуется) – смотрите настройку в базовых сценариях.
hub1(config)#crypto pki trustpoint s-terra_technological_trustpoint
hub1(ca-trustpoint)# revocation-check none
hub1(ca-trustpoint)#exit
hub1(config)#
6. Примените введенные настройки:
Настройки применяются по выходе из консоли при помощи команды end.
hub1(config)#end
7. Проверьте доступность маршрута по умолчанию:
hub1#ping 100.100.100.1
PING 100.100.100.1 (100.100.100.1) 100(128) bytes of data.
108 bytes from 100.100.100.1: icmp_req=1 ttl=64 time=0.465 ms
108 bytes from 100.100.100.1: icmp_req=2 ttl=64 time=0.231 ms
108 bytes from 100.100.100.1: icmp_req=3 ttl=64 time=0.213 ms
108 bytes from 100.100.100.1: icmp_req=4 ttl=64 time=0.239 ms
108 bytes from 100.100.100.1: icmp_req=5 ttl=64 time=0.255 ms
--- 100.100.100.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4002ms
rtt min/avg/max/mdev = 0.213/0.280/0.465/0.094 ms
Параметры IPsec и Firewall приведены в приложении.
На центральных шлюзах должно быть по одному mGRE-интерфейсу, а на филиальных – по два (по одному на каждый центральный шлюз).
1. Настройки mGRE интерфейсов осуществляются из linux bash, чтобы попасть в linux bash выполните следующую команду в CLI разграничения доступа:
administrator@hub1] system
Entering system shell...
root@hub1:~#
2. Создайте файл /etc/network/interfaces.d/mgre0 и добавьте в него следующе содержимое:
Имя mGRE-интерфейса должно соответствовать шаблону: mgreN, где N – целое число.
auto mgre0
iface mgre0 inet static
address 10.10.10.100
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
3. Поднимите mGRE-интерфейс:
root@hub1:~# ifup mgre0
4. Убедитесь, что mGRE-интерфейс создан с нужными параметрами:
root@hub1:~# ip tunnel show mgre0
mgre0: gre/ip remote any local any ttl 64 tos inherit key 1
root@hub1:~# ip address show dev mgre0
5: mgre0: <MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN
link/gre 0.0.0.0 brd 0.0.0.0
inet 10.10.10.100/24 brd 10.10.10.255 scope global mgre0
Настройки mGRE-интерфейса приведены в приложении.
Настройка NHRP осуществляются из linux bash.
1. Приведите файл /etc/opennhrp/opennhrp.conf к виду:
interface mgre0
multicast dynamic
holding-time 7200
cisco-authentication secret
non-caching
2. Добавьте сервис OpenNHRP в автозагрузку и запустите его:
root@hub1:~# update-rc.d opennhrp enable
update-rc.d: using dependency based boot sequencing
root@hub1:~# service opennhrp start
opennhrp[3263]: OpenNHRP upstream/0.14.1-10-ge6ad153 starting
opennhrp[3263]: Interface lo: configured UP, mtu=16436
opennhrp[3263]: Interface eth0: configured UP, mtu=1500
opennhrp[3263]: Interface eth1: configured UP, mtu=1500
opennhrp[3263]: Interface gre0: config change, mtu=1476
opennhrp[3263]: Interface mgre0: configured UP, mtu=1400
opennhrp[3263]: Interface mgre0: GRE configuration changed. Purged 0 peers.
opennhrp[3263]: Filter code installed (20 opcodes)
Настройки NHRP приведены в приложении.
Динамическая маршрутизация настраивается через консоль сервиса FRR (аналог Quagga).
1. Войдите в консоль сервиса FRR, для этого нужно из linux bash набрать следующую команду:
root@hub1:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
hub1#
2. Настройте BGP (см. описание https://frrouting.org/user-guide/bgp.html):
hub1# configure terminal
hub1(config)# router bgp 65000
hub1(config-router)# bgp router-id 10.10.10.100
hub1(config-router)# bgp log-neighbor-changes
hub1(config-router)# bgp deterministic-med
hub1(config-router)# bgp network import-check
hub1(config-router)# timers bgp 3 9
hub1(config-router)# neighbor spokes-ibgp peer-group
hub1(config-router)# neighbor spokes-ibgp remote-as 65000
hub1(config-router)# neighbor 10.10.10.1 peer-group spokes-ibgp
hub1(config-router)# neighbor 10.10.10.2 peer-group spokes-ibgp
hub1(config-router)# neighbor 10.10.10.3 peer-group spokes-ibgp
hub1(config-router)# neighbor 192.168.255.1 remote-as 65001
hub1(config-router)#
hub1(config-router)# address-family ipv4 unicast
hub1(config-router-af)# neighbor spokes-ibgp route-reflector-client
hub1(config-router-af)# neighbor spokes-ibgp next-hop-self
hub1(config-router-af)# neighbor spokes-ibgp soft-reconfiguration inbound
hub1(config-router-af)# neighbor 10.10.10.1 route-map FROM-SPOKE1-N1-IN in
hub1(config-router-af)# neighbor 10.10.10.2 route-map FROM-SPOKE1-N2-IN in
hub1(config-router-af)# exit-address-family
hub1(config-router)#
hub1(config-router)# route-map FROM-SPOKE1-N1-IN permit 1
hub1(config-route-map)# set local-preference 100
hub1(config-route-map)#
hub1(config-route-map)# route-map FROM-SPOKE1-N2-IN permit 1
hub1(config-route-map)# set local-preference 50
hub1(config-route-map)#
hub1(config-route-map)# end
hub1# write
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Integrated configuration saved to /etc/frr/frr.conf
[OK]
Настройки BGP приведены в приложении.
Перед началом настроек убедитесь в том, что была выполнена процедура подготовки шлюзов, описанная в главе «Подготовка устройств «С-Терра Шлюз».
Настройка устройства Hub2 осуществляется аналогично устройству Hub1 с учетом соответствующих IP-адресов (см. рисунок 1).
Значение mGRE key на Hub1 и Hub2 должно быть различным.
В приложении представлены соответствующие конфигурационные файлы.
Перед началом настроек убедитесь в том, что была выполнена процедура подготовки шлюзов, описанная в главе «Подготовка устройств «С-Терра Шлюз».
Краткий план настройки:
1. Базовые сетевые настройки.
2. Настройка IPsec и Firewall.
3. Настройка mGRE-интерфейсов.
4. Настройка NHRP.
5. Настройка BGP.
6. Настройка VRRP.
1. Войдите в CLI разграничения доступа (или Initial CLI). Для этого, после появления сообщения:
S-Terra administrative console
введите логин и пароль для CLI разграничения доступа:
Пользователь и пароль по умолчанию: administrator, s-terra. Обязательно смените пароль для пользователя administrator при помощи команды change user password.
login as: administrator
administrator's password:
administrator@sterragate]
2. Базовые сетевые настройки осуществляются из cisco-like консоли шлюза, чтобы попасть в нее выполните следующую команду в CLI разграничения доступа:
Пользователь и пароль по умолчанию: cscons, csp. Обязательно смените пароль для пользователя cscons и enable пароль. Под пользователем cscons можно осуществлять удаленное управление шлюзом по SSH.
administrator@sterragate] configure
sterragate login: cscons
Password:
S-Terra Gate 4.2.18201 (amd64)
sterragate#
3. Настройте имя устройства, IP-адреса и маршрут по умолчанию в соответствии с общей схемой стенда (см. рисунок 1):
sterragate#configure terminal
sterragate(config)#hostname spoke1-n1
spoke1-n1(config)#interface GigabitEthernet0/0
spoke1-n1(config-if)# ip address 100.100.1.2 255.255.255.0
spoke1-n1(config-if)# no shutdown
spoke1-n1(config-if)#interface GigabitEthernet0/1
spoke1-n1(config-if)# ip address 192.168.1.10 255.255.255.0
spoke1-n1(config-if)# no shutdown
spoke1-n1(config-if)#ip route 0.0.0.0 0.0.0.0 100.100.1.1
spoke1-n1(config)#end
4. Проверьте доступность маршрута по умолчанию:
spoke1-n1#ping 100.100.1.1
PING 100.100.1.1 (100.100.1.1) 100(128) bytes of data.
108 bytes from 100.100.1.1: icmp_req=1 ttl=64 time=0.331 ms
108 bytes from 100.100.1.1: icmp_req=2 ttl=64 time=0.219 ms
108 bytes from 100.100.1.1: icmp_req=3 ttl=64 time=0.171 ms
108 bytes from 100.100.1.1: icmp_req=4 ttl=64 time=0.187 ms
108 bytes from 100.100.1.1: icmp_req=5 ttl=64 time=0.163 ms
--- 100.100.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 0.163/0.214/0.331/0.062 ms
Настройки IPsec и Firewall осуществляются из cisco-like консоли шлюза.
1. Параметры IKE:
spoke1-n1#conf t
spoke1-n1(config)#crypto isakmp identity dn
spoke1-n1(config)#crypto isakmp session-time-max 10
spoke1-n1(config)#crypto isakmp keepalive 1 3
spoke1-n1(config)#crypto isakmp keepalive retry-count 3
spoke1-n1(config)#
spoke1-n1(config)#crypto isakmp policy 1
spoke1-n1(config-isakmp)# encr gost
spoke1-n1(config-isakmp)# hash gost341112-256-tc26
spoke1-n1(config-isakmp)# authentication gost-sig
spoke1-n1(config-isakmp)# group vko2
spoke1-n1(config-isakmp)#
spoke1-n1(config-isakmp)#exit
2. Параметры IPsec
2.1. Список доступа для трафика:
При работе «С-Терра Шлюз» версии 4.2 через NAT в транспортном IPsec режиме нельзя указывать в фильтрах для трафика, требующего шифрование, протоколы отличные от IP. То есть нельзя написать: permit gre host 100.100.1.2 any.
spoke1-n1(config)#ip access-list extended IPSEC_DMVPN
spoke1-n1(config-ext-nacl)# deny icmp host 100.100.1.2 any
spoke1-n1(config-ext-nacl)# deny udp host 100.100.1.2 any
spoke1-n1(config-ext-nacl)# deny tcp host 100.100.1.2 any
spoke1-n1(config-ext-nacl)# deny ip host 100.100.1.2 host 224.0.0.5
spoke1-n1(config-ext-nacl)# deny ip host 100.100.1.2 host 224.0.0.6
spoke1-n1(config-ext-nacl)# deny ip host 100.100.1.2 host 224.0.0.18
spoke1-n1(config-ext-nacl)# permit ip host 100.100.1.2 any
spoke1-n1(config-ext-nacl)#exit
spoke1-n1(config)#
После исключения из шифрования (строки с deny) протоколов ICMP/UDP/TCP под фильтр permit ip host 100.100.1.2 any попадет как раз GRE трафик.
2.2. Включите автоматическую фрагментацию больших пакетов:
spoke1-n1(config)#crypto ipsec df-bit clear
2.3. Задайте алгоритм шифрования и режим работы IPsec:
spoke1-n1(config)#crypto ipsec transform-set GOST esp-gost28147-4m-imit
spoke1-n1(cfg-crypto-trans)# mode transport
spoke1-n1(cfg-crypto-trans)#exit
spoke1-n1(config)#
2.4. Создайте динамическую крипто-карту и привяжите ее к статической:
spoke1-n1(config)#crypto dynamic-map DMAP 1
spoke1-n1(config-crypto-map)# match address IPSEC_DMVPN
spoke1-n1(config-crypto-map)# set transform-set GOST
spoke1-n1(config-crypto-map)# set dead-connection history off
spoke1-n1(config-crypto-map)#crypto map VPN 1 ipsec-isakmp dynamic DMAP
spoke1-n1(config)#
3. Параметры Firewall:
3.1. Список доступа для трафика:
Список доступа должен блокировать открытый трафик из защищаемый подсети шлюза в подсети RFC1918/RFC6598 (считаем, что трафик непубличных подсетей должен обязательно шифроваться), а также незашифрованный GRE.
spoke1-n1(config)#ip access-list extended FIREWALL_OUT
spoke1-n1(config-ext-nacl)# deny ip 192.168.1.0 0.0.0.255 100.64.0.0 0.63.255.255
spoke1-n1(config-ext-nacl)# deny ip 192.168.1.0 0.0.0.255 172.16.0.0 0.15.255.255
spoke1-n1(config-ext-nacl)# deny ip 192.168.1.0 0.0.0.255 192.168.0.0 0.0.255.255
spoke1-n1(config-ext-nacl)# deny ip 192.168.1.0 0.0.0.255 10.0.0.0 0.255.255.255
spoke1-n1(config-ext-nacl)# deny gre any any
spoke1-n1(config-ext-nacl)# permit ip any any
spoke1-n1(config-ext-nacl)#exit
spoke1-n1(config)#
4. Прикрепите крипто-карту и список доступа на внешний интерфейс:
spoke1-n1(config)#interface GigabitEthernet0/0
spoke1-n1(config-if)# ip access-group FIREWALL_OUT out
spoke1-n1(config-if)# crypto map VPN
spoke1-n1(config-if)#exit
5. Отключите проверку списка отозванных сертификатов (CRL):
Если требуется проверка CRL (рекомендуется) – смотрите настройку в базовых сценариях.
spoke1-n1(config)#crypto pki trustpoint s-terra_technological_trustpoint
spoke1-n1(ca-trustpoint)#revocation-check none
spoke1-n1(ca-trustpoint)#exit
spoke1-n1(config)#
6. Примените введенные настройки:
Настройки применяются по выходе из консоли при помощи команды end.
spoke1-n1(config)#end
7. Проверьте доступность маршрута по умолчанию:
spoke1-n1#ping 100.100.1.1
PING 100.100.1.1 (100.100.1.1) 100(128) bytes of data.
108 bytes from 100.100.1.1: icmp_req=1 ttl=64 time=0.409 ms
108 bytes from 100.100.1.1: icmp_req=2 ttl=64 time=0.247 ms
108 bytes from 100.100.1.1: icmp_req=3 ttl=64 time=0.183 ms
108 bytes from 100.100.1.1: icmp_req=4 ttl=64 time=0.183 ms
108 bytes from 100.100.1.1: icmp_req=5 ttl=64 time=0.212 ms
--- 100.100.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.183/0.246/0.409/0.086 ms
Параметры IPsec и Firewall приведены в приложении.
1. Настройки mGRE интерфейсов осуществляются из linux bash, чтобы попасть в linux bash выполните следующую команду в CLI разграничения доступа:
administrator@spoke1-n1] system
Entering system shell...
root@spoke1-n1:~#
2. Создайте файл /etc/network/interfaces.d/mgre0 и добавьте в него следующе содержимое:
Имя mGRE-интерфейса должно соответствовать шаблону: mgreN, где N – целое число.
auto mgre0
iface mgre0 inet static
address 10.10.10.1
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
3. Создайте файл /etc/network/interfaces.d/mgre1 и добавьте в него следующе содержимое:
Имя mGRE-интерфейса должно соответствовать шаблону: mgreN, где N – целое число.
auto mgre1
iface mgre1 inet static
address 10.10.20.1
netmask 255.255.255.0
pre-up ip tunnel add mgre1 mode gre key 2 ttl 64 tos inherit
pre-up ip link set mgre1 mtu 1400
pre-up ip link set mgre1 multicast on
4. Поднимите mGRE-интерфейсы:
root@spoke1-n1:~# ifup mgre0
root@spoke1-n1:~# ifup mgre1
5. Убедитесь, что mGRE-интерфейсы созданы с нужными параметрами:
root@spoke1-n1:~# ip tunnel show mgre0
mgre0: gre/ip remote any local any ttl 64 tos inherit key 1
root@spoke1-n1:~# ip tunnel show mgre1
mgre1: gre/ip remote any local any ttl 64 tos inherit key 2
root@spoke1-n1:~# ip address show dev mgre0
5: mgre0: <MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN
link/gre 0.0.0.0 brd 0.0.0.0
inet 10.10.10.1/24 brd 10.10.10.255 scope global mgre0
root@spoke1-n1:~# ip address show dev mgre1
6: mgre1: <MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN
link/gre 0.0.0.0 brd 0.0.0.0
inet 10.10.20.1/24 brd 10.10.20.255 scope global mgre1
Настройки mGRE-интерфейсов приведены в приложении.
Настройка NHRP осуществляются из linux bash.
1. Приведите файл /etc/opennhrp/opennhrp.conf к виду:
На всех филиальных шлюзах настройки (/etc/opennhrp/opennhrp.conf) NHRP должны быть одинаковыми.
interface mgre0
map 10.10.10.100/24 172.16.100.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
interface mgre1
map 10.10.20.200/24 172.17.200.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
2. Добавьте сервис OpenNHRP в автозагрузку и запустите его:
root@spoke1-n1:~# update-rc.d opennhrp enable
update-rc.d: using dependency based boot sequencing
root@spoke1-n1:~# service opennhrp start
opennhrp[3381]: OpenNHRP upstream/0.14.1-10-ge6ad153 starting
opennhrp[3381]: Interface lo: configured UP, mtu=16436
opennhrp[3381]: Interface eth0: configured UP, mtu=1500
opennhrp[3381]: Interface eth1: configured UP, mtu=1500
opennhrp[3381]: Interface gre0: config change, mtu=1476
opennhrp[3381]: Interface mgre0: configured UP, mtu=1400
opennhrp[3381]: Interface mgre0: GRE configuration changed. Purged 1 peers.
opennhrp[3381]: Interface mgre1: configured UP, mtu=1400
opennhrp[3381]: Interface mgre1: GRE configuration changed. Purged 1 peers.
opennhrp[3381]: Filter code installed (23 opcodes)
3. Через некоторое время проверьте, что между Spoke1-n1 и центральными шлюзами Hub1, Hub2 поднялись IPsec туннели (если туннели не поднялись – проверьте настройки сети/IPsec/Firewall/NHRP, лог-файл /var/log/cspvpngate.log):
root@spoke1-n1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 1 (100.100.1.2,4500)-(172.17.200.2,4500) active 1936 1828
2 2 (100.100.1.2,4500)-(172.16.100.2,4500) active 1936 1828
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 2440 2496
2 2 (100.100.1.2,*)-(172.16.100.2,*) * ESP nat-t-trans 1240 896
Настройки NHRP приведены в приложении.
Динамическая маршрутизация настраивается через консоль сервиса FRR (аналог Quagga).
1. Войдите в консоль сервиса FRR, для этого нужно из linux bash набрать следующую команду:
root@spoke1-n1:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke1-n1#
2. Настройте BGP (см. описание https://frrouting.org/user-guide/bgp.html):
spoke1-n1# conf t
spoke1-n1(config)# router bgp 65000
spoke1-n1(config-router)# bgp router-id 192.168.1.10
spoke1-n1(config-router)# bgp log-neighbor-changes
spoke1-n1(config-router)# bgp network import-check
spoke1-n1(config-router)# timers bgp 3 9
spoke1-n1(config-router)# neighbor 10.10.10.100 remote-as 65000
spoke1-n1(config-router)# neighbor 10.10.20.200 remote-as 65000
spoke1-n1(config-router)#
spoke1-n1(config-router)# address-family ipv4 unicast
spoke1-n1(config-router-af)# network 192.168.1.0/24
spoke1-n1(config-router-af)# neighbor 10.10.10.100 route-map FROM-HUB1-IN in
spoke1-n1(config-router-af)# neighbor 10.10.20.200 route-map FROM-HUB2-IN in
spoke1-n1(config-router-af)# exit-address-family
spoke1-n1(config-router)#
spoke1-n1(config-router)# route-map FROM-HUB2-IN permit 1
spoke1-n1(config-route-map)# set local-preference 50
spoke1-n1(config-route-map)#
spoke1-n1(config-route-map)# route-map FROM-HUB1-IN permit 1
spoke1-n1(config-route-map)# set local-preference 100
spoke1-n1(config-route-map)#
spoke1-n1(config-route-map)# end
spoke1-n1# write
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Integrated configuration saved to /etc/frr/frr.conf
[OK]
Настройки BGP приведены в приложении.
Настройка VRRP осуществляются из linux bash.
1. Приведите файл /etc/keepalived/scripts/notify_backup к виду:
#!/bin/bash
# Script to run during BACKUP transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Если нода переходит в состояние BACKUP, то выключаем BGP пиринг с центральными шлюзами.
2. Приведите файл /etc/keepalived/scripts/notify_fault к виду:
#!/bin/bash
# Script to run during FAULT transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Если нода переходит в состояние FAULT, то выключаем BGP пиринг с центральными шлюзами.
3. Приведите файл /etc/keepalived/scripts/notify_master к виду:
#!/bin/bash
# Script to run during MASTER transit
vtysh -c "conf t" -c "router bgp 65000" -c "no neighbor 10.10.10.100 shutdown" -c "no neighbor 10.10.20.200 shutdown"
exit 0
Если нода переходит в состояние MASTER, то включаем BGP пиринг с центральными шлюзами.
4. Приведите файл /etc/keepalived/keepalived.conf к виду:
vrrp_script check_run_service_vpnsvc {
script "/etc/keepalived/scripts/check_run_service 'vpnsvc'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_opennhrp {
script "/etc/keepalived/scripts/check_run_service 'opennhrp'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_bgpd {
script "/etc/keepalived/scripts/check_run_service 'bgpd'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_zebra {
script "/etc/keepalived/scripts/check_run_service 'zebra'"
fall 5
rise 5
interval 1
}
vrrp_script check_isp_link {
script "/etc/keepalived/scripts/check_ping 'eth0' '172.16.1.1 172.17.1.1' "
fall 15
rise 10
timeout 5
interval 1
}
vrrp_instance eth1_1 {
interface eth1
track_interface {
eth0
}
track_script {
check_run_service_vpnsvc
check_run_service_opennhrp
check_run_service_bgpd
check_run_service_zebra
check_isp_link
}
virtual_ipaddress {
192.168.1.1/24
}
nopreempt
garp_master_refresh 5
priority 100
advert_int 1
virtual_router_id 1
notify_master /etc/keepalived/scripts/notify_master
notify_backup /etc/keepalived/scripts/notify_backup
notify_fault /etc/keepalived/scripts/notify_fault
}
Сервис Keepalived проверяет:
· запущены ли сервисы vpnsvc, opennhrp, bgpd, zebra и, если какой-либо из них остановлен, то нода переводится в состояние FAULT;
· доступность канала Интернет через интерфейс eth0, доступность канала определяется по доступности хостов по протоколу ICMP, если все хосты недоступны, то нода переводится в состояние FAULT;
· состояние сетевого интерфейса eth0, если интерфейс теряет несущую (отключили сетевой кабель) или переходит в состояние down, то нода переводится в состояние FAULT.
5. Добавьте сервис Keepalived в автозагрузку и запустите его:
root@spoke1-n1:~# update-rc.d keepalived enable
update-rc.d: using dependency based boot sequencing
root@spoke1-n1:~# service keepalived start
Starting keepalived: keepalived.
6. Убедитесь, что нода перешла в состояние MASTER (см. рисунок 2):
root@spoke1-n1:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
Рисунок 2. Успешный переход кластера в состояние MASTER
7. Убедитесь, что на внутреннем интерфейсе eth1 появился кластерный VIP-адрес:
root@spoke1-n1:~# ip address show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:70:a0:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.1/24 scope global secondary eth1
Настройки VRRP приведены в приложении.
Перед началом настроек убедитесь в том, что была выполнена процедура подготовки шлюзов, описанная в главе «Подготовка устройств «С-Терра Шлюз».
Настройка устройства Spoke1-n2 осуществляется аналогично устройству Spoke1-n1 с учетом соответствующих IP-адресов (см. рисунок 1).
Значение bgp router-id у резервной ноды должно отличаться от значения основной ноды (Spoke1-n1).
Значение priority в VRRP у резервной ноды должно быть меньше чем у основной.
В приложении представлены соответствующие конфигурационные файлы.
Перед началом настроек убедитесь в том, что была выполнена процедура подготовки шлюзов, описанная в главе «Подготовка устройств «С-Терра Шлюз».
Настройка устройства Spoke2 осуществляется аналогично устройству Spoke1-n1 (за исключением отсутствия необходимости настраивать VRRP) с учетом соответствующих IP-адресов (см. рисунок 1).
В приложении представлены соответствующие конфигурационные файлы.
Проверка работоспособности стенда проводится в трех состояниях:
1. Все узлы в центральном офисе и филиалах функционируют и исправны.
2. Проблема на основном шлюзе в центральном офисе: отказ центрального шлюза, отказ внешнего сетевого интерфейса.
3. Проблема на основной ноде кластера в филиале: отказ основной ноды кластера, недоступность Интернет провайдера, недоступность сервиса opennhrp.
1. Убедитесь, что на центральных шлюзах установлены IPsec-туннели со всеми филиальными шлюзами, для этого в linux bash выполните следующую команду:
root@hub1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 1 (100.100.100.2,4500)-(172.16.1.2,4500) active 1828 1936
2 2 (100.100.100.2,4500)-(172.16.2.2,4500) active 2828 2928
3 3 (100.100.100.2,4500)-(172.17.1.2,4500) active 1828 1936
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.100.2,*)-(172.16.1.2,*) * ESP nat-t-trans 19664 15936
2 2 (100.100.100.2,*)-(172.16.2.2,*) * ESP nat-t-trans 25976 29528
3 3 (100.100.100.2,*)-(172.17.1.2,*) * ESP nat-t-trans 5696 4952
root@hub2:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 1 (100.100.200.2,4500)-(172.16.1.2,4500) active 1928 2036
2 2 (100.100.200.2,4500)-(172.16.2.2,4500) active 2828 2928
3 3 (100.100.200.2,4500)-(172.17.1.2,4500) active 1828 1936
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.200.2,*)-(172.16.1.2,*) * ESP nat-t-trans 18720 16864
2 2 (100.100.200.2,*)-(172.16.2.2,*) * ESP nat-t-trans 13416 17272
3 3 (100.100.200.2,*)-(172.17.1.2,*) * ESP nat-t-trans 12040 9680
Видно, что на каждом центральном шлюзе установлено по три IPsec-туннеля – два с нодами кластера в первом филиале (IP-адреса 172.16.1.2, 172.17.1.2) и третий со шлюзом во втором филиале (IP-адрес: 172.16.2.2). Строка «ESP nat-t-trans» свидетельствует о том, что IPsec-туннель работает в транспортном режиме через NAT.
2. Убедитесь, что на центральных шлюзах протокол NHRP верно отображает информацию о филиальных шлюзах, для этого в linux bash выполните следующую команду:
root@hub1:~# opennhrpctl show
Status: ok
Interface: mgre0
Type: local
Protocol-Address: 10.10.10.255/32
Alias-Address: 10.10.10.100
Flags: up
Interface: mgre0
Type: local
Protocol-Address: 10.10.10.100/32
Flags: up
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.10.1/32
NBMA-Address: 172.16.1.2
NBMA-NAT-OA-Address: 100.100.1.2
Flags: up
Expires-In: 0:09
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.10.3/32
NBMA-Address: 172.16.2.2
Flags: up
Expires-In: 0:08
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.10.2/32
NBMA-Address: 172.17.1.2
NBMA-NAT-OA-Address: 100.101.1.2
Flags: up
Expires-In: 0:07
root@hub2:~# opennhrpctl show
Status: ok
Interface: mgre0
Type: local
Protocol-Address: 10.10.20.255/32
Alias-Address: 10.10.20.200
Flags: up
Interface: mgre0
Type: local
Protocol-Address: 10.10.20.200/32
Flags: up
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.20.1/32
NBMA-Address: 172.16.1.2
NBMA-NAT-OA-Address: 100.100.1.2
Flags: up
Expires-In: 0:09
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.20.3/32
NBMA-Address: 172.16.2.2
Flags: up
Expires-In: 0:08
Interface: mgre0
Type: dynamic
Protocol-Address: 10.10.20.2/32
NBMA-Address: 172.17.1.2
NBMA-NAT-OA-Address: 100.101.1.2
Flags: up
Expires-In: 0:07
Видно, что на каждом центральном шлюзе протокол NHRP корректно отображает информацию о филиальных шлюзах (записи с пометкой «Type: dynamic»), а именно mGRE-адрес (Protocol-Address) соответствует NBMA IP-адресу (NBMA-Address). Также верно отображается информация об исходном IP-адресе до выполнения процедуры трансляции (NBMA-NAT-OA-Address) для тех шлюзов, которые находятся за устройствами, выполняющими функции NAT.
3. Убедитесь, что на центральных шлюзах подсистема ip neighbor ядра ОС Linux корректно отображает информацию о маппинге mGRE-адреса в NBMA-адрес филиальных шлюзов, для этого в linux bash выполните следующую команду:
root@hub1:~# ip neighbor show
10.10.10.1 dev mgre0 lladdr 172.16.1.2 REACHABLE
192.168.255.1 dev eth1 lladdr 00:0c:29:c8:07:da REACHABLE
10.10.10.2 dev mgre0 lladdr 172.17.1.2 REACHABLE
100.100.100.1 dev eth0 lladdr 00:0c:29:03:3e:0c REACHABLE
10.10.10.3 dev mgre0 lladdr 172.16.2.2 REACHABLE
root@hub2:~# ip neighbor show
10.10.20.2 dev mgre0 lladdr 172.17.1.2 REACHABLE
100.100.200.1 dev eth0 lladdr 00:0c:29:71:db:c1 DELAY
10.10.20.1 dev mgre0 lladdr 172.16.1.2 REACHABLE
10.10.20.3 dev mgre0 lladdr 172.16.2.2 REACHABLE
Видно, что на каждом центральном шлюзе маппинг mGRE-адреса в NBMA-адрес филиальных шлюзов выполнен верно. Маппинги имеют статус REACHABLE.
4. Убедитесь, что на центральных шлюзах корректно работает протокол BGP, для этого зайдите в linux bash выполните следующие команды:
root@hub1:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
hub1# show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 10.10.10.100, local AS number 65000 vrf-id 0
BGP table version 5
RIB entries 5, using 760 bytes of memory
Peers 4, using 81 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.10.10.1 4 65000 117 119 0 0 0 00:05:39 1
10.10.10.2 4 65000 0 2 0 0 0 never Active
10.10.10.3 4 65000 109 110 0 0 0 00:04:31 1
192.168.255.1 4 65001 176 176 0 0 0 00:08:25 1
Total number of neighbors 4
hub1# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.1.0/24 [200/0] via 10.10.10.1, mgre0, 00:06:35
B>* 192.168.2.0/24 [200/0] via 10.10.10.3, mgre0, 00:05:27
B>* 192.168.100.0/24 [20/0] via 192.168.255.1, eth1, 00:09:20
root@hub2:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
hub2# show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 10.10.20.200, local AS number 65000 vrf-id 0
BGP table version 5
RIB entries 5, using 760 bytes of memory
Peers 4, using 81 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.10.20.1 4 65000 144 146 0 0 0 00:07:02 1
10.10.20.2 4 65000 0 5 0 0 0 never Active
10.10.20.3 4 65000 138 139 0 0 0 00:05:57 1
192.168.255.1 4 65001 200 200 0 0 0 00:09:39 1
Total number of neighbors 4
hub2# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.1.0/24 [200/0] via 10.10.20.1, mgre0, 00:07:29
B>* 192.168.2.0/24 [200/0] via 10.10.20.3, mgre0, 00:06:25
B>* 192.168.100.0/24 [20/0] via 192.168.255.1, eth1, 00:10:06
Видно, что на каждом центральном шлюзе по протоколу BGP установлено соседство с основной нодой кластера в филиале №1, со шлюзом в филиале №2 и роутером Int_router1_Hub. Соседство с резервной нодой кластера в филиале №1 отсутствует, как и требуется (нода, которая находится в состоянии BACKUP/FAULT не участвует в BGP).
Маршруты до филиальных подсетей (192.168.1.0/24 и 192.168.2.0/24) в таблице маршрутизации присутствуют, а также до 192.168.100.0/24.
5. Убедитесь, что основная нода кластера в филиале №1 находится в состоянии MASTER, для этого в linux bash выполните следующие команды:
root@spoke1-n1:~# ip address show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:70:a0:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.1/24 scope global secondary eth1
root@spoke1-n1:~# tcpdump -i eth1 -n -c 4 vrrp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:55:37.067997 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 100, authtype none, intvl 1s, length 20
13:55:38.069075 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 100, authtype none, intvl 1s, length 20
13:55:39.070165 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 100, authtype none, intvl 1s, length 20
13:55:40.071247 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 100, authtype none, intvl 1s, length 20
4 packets captured
4 packets received by filter
0 packets dropped by kernel
Видно, что на внутреннем интерфейсе eth1 имеется VIP-адрес 192.168.1.1, а также с данного интерфейса (с IP-адреса 192.168.1.10) отсылаются VRRP пакеты.
6. Убедитесь, что защищенное соединение между основной нодой кластера в филиале №1 и шлюзом в филиале №2 успешно строится, для этого запустите ping с устройства host-b-spoke1 на устройство host-b-spoke2 и проверьте наличие IPsec-туннеля на основной ноде кластера в филиале №1:
root@host-b-spoke1:~# ping 192.168.2.100 -c 4
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=61 time=2.03 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=62 time=323 ms
64 bytes from 192.168.2.100: icmp_seq=3 ttl=62 time=0.728 ms
64 bytes from 192.168.2.100: icmp_seq=4 ttl=62 time=0.808 ms
--- 192.168.2.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.728/81.831/323.760/139.678 ms
root@spoke1-n1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 5 (100.100.1.2,4500)-(172.16.100.2,4500) active 1936 1828
2 6 (100.100.1.2,4500)-(172.17.200.2,4500) active 2036 1928
3 7 (100.100.1.2,4500)-(172.16.2.2,4500) active 1936 1836
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 60560 79336
2 2 (100.100.1.2,*)-(172.16.100.2,*) * ESP nat-t-trans 63648 84856
3 3 (100.100.1.2,*)-(172.16.2.2,*) * ESP nat-t-trans 288 288
Видно, что пакеты успешно дошли от host-b-spoke1 до host-b-spoke2, а также построился IPsec-туннель между основной нодой кластера в филиале №1 и шлюзом в филиале №2.
Смоделируем отказ внешнего сетевого интерфейса eth0 на основном центральном шлюзе Hub1 и проверим работоспособность стенда.
1. Переведите внешний сетевой интерфейс eth0 на основном центральном шлюзе Hub1 в состояние DOWN, для этого в linux bash выполните следующую команду:
root@hub1:~# ifconfig eth0 down
2. Подождите некоторое время и убедитесь в том, что на основной ноде кластера в филиале №1 и на шлюзе в филиале №2 IPsec-туннель с Hub1 отсутствует и маршруты в защищаемые подсети доступны через mGRE-интерфейс mgre1, для этого в linux bash выполните следующие команды:
root@spoke1-n1:~# sa_mgr show
ISAKMP sessions: 1 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 6 (100.100.1.2,4500)-(172.17.200.2,4500) active 2036 1928
2 7 (100.100.1.2,4500)-(172.16.2.2,4500) active 1936 1836
3 8 (100.100.1.2,500)-(172.16.100.2,500) incompleted 388 0
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 65880 87264
2 3 (100.100.1.2,*)-(172.16.2.2,*) * ESP nat-t-trans 288 288
root@spoke1-n1:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke1-n1# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.2.0/24 [200/0] via 10.10.20.3, mgre1, 00:12:35
B>* 192.168.100.0/24 [200/0] via 10.10.20.200, mgre1, 00:12:35
root@spoke2:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 1 (172.16.2.2,4500)-(172.17.200.2,4500) active 2928 2828
2 3 (172.16.2.2,4500)-(172.16.1.2,4500) active 1836 1936
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 2 (172.16.2.2,*)-(172.17.200.2,*) * ESP nat-t-trans 219016 189272
2 3 (172.16.2.2,*)-(172.16.1.2,*) * ESP nat-t-trans 288 288
root@spoke2:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke2# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.1.0/24 [200/0] via 10.10.20.1, mgre1, 00:14:19
B>* 192.168.100.0/24 [200/0] via 10.10.20.200, mgre1, 00:14:19
3. Убедитесь, что трафик между защищаемым подсетями филиала №1 и центрального офиса шифруется, для этого запустите ping с устройства host-b-spoke1 на устройство host-b-hub и удостоверьтесь в прохождении пакетов:
root@host-b-spoke1:~# ping 192.168.100.100 -c 4
PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data.
64 bytes from 192.168.100.100: icmp_seq=1 ttl=61 time=1.13 ms
64 bytes from 192.168.100.100: icmp_seq=2 ttl=61 time=1.05 ms
64 bytes from 192.168.100.100: icmp_seq=3 ttl=61 time=1.09 ms
64 bytes from 192.168.100.100: icmp_seq=4 ttl=61 time=1.05 ms
--- 192.168.100.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 1.052/1.086/1.138/0.047 ms
4. Убедитесь, что защищенное соединение между основной нодой кластера в филиале №1 и шлюзом в филиале №2 успешно строится, для этого запустите ping с устройства host-b-spoke1 на устройство host-b-spoke2 и проверьте наличие IPsec-туннеля на основной ноде кластера в филиале №1:
root@host-b-spoke1:~# ping 192.168.2.100 -c 4
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=61 time=1.78 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=62 time=0.771 ms
64 bytes from 192.168.2.100: icmp_seq=3 ttl=62 time=0.839 ms
64 bytes from 192.168.2.100: icmp_seq=4 ttl=62 time=0.809 ms
--- 192.168.2.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.771/1.051/1.786/0.425 ms
root@spoke1-n1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 6 (100.100.1.2,4500)-(172.17.200.2,4500) active 2036 1928
2 7 (100.100.1.2,4500)-(172.16.2.2,4500) active 1936 1836
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 173584 203232
2 3 (100.100.1.2,*)-(172.16.2.2,*) * ESP nat-t-trans 576 576
5. Переведите внешний сетевой интерфейс eth0 на основном центральном шлюзе Hub1 в состояние UP, для этого в linux bash выполните следующую команду:
root@hub1:~# ifconfig eth0 up
6. Подождите некоторое время (до пяти минут) и убедитесь в том, что на основной ноде кластера в филиале №1 и на шлюзе в филиале №2 IPsec-туннель с Hub1 создан и маршруты в защищаемые подсети вновь доступны через mGRE-интерфейс mgre0, для этого в linux bash выполните следующие команды:
root@spoke1-n1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 6 (100.100.1.2,4500)-(172.17.200.2,4500) active 2036 1928
2 7 (100.100.1.2,4500)-(172.16.2.2,4500) active 1936 1836
3 51 (100.100.1.2,4500)-(172.16.100.2,4500) active 2136 2028
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 1 (100.100.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 184088 214232
2 3 (100.100.1.2,*)-(172.16.2.2,*) * ESP nat-t-trans 576 576
3 4 (100.100.1.2,*)-(172.16.100.2,*) * ESP nat-t-trans 288 0
root@spoke1-n1:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke1-n1# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.2.0/24 [200/0] via 10.10.10.3, mgre0, 00:00:45
B>* 192.168.100.0/24 [200/0] via 10.10.10.100, mgre0, 00:00:45
root@spoke2:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 1 (172.16.2.2,4500)-(172.17.200.2,4500) active 2928 2828
2 3 (172.16.2.2,4500)-(172.16.1.2,4500) active 1836 1936
3 51 (172.16.2.2,4500)-(172.16.100.2,4500) active 2328 2228
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 2 (172.16.2.2,*)-(172.17.200.2,*) * ESP nat-t-trans 379584 338448
2 3 (172.16.2.2,*)-(172.16.1.2,*) * ESP nat-t-trans 576 576
3 4 (172.16.2.2,*)-(172.16.100.2,*) * ESP nat-t-trans 49448 50408
root@spoke2:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke2# show ip route bgp
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke2# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.1.0/24 [200/0] via 10.10.10.1, mgre0, 00:02:28
B>* 192.168.100.0/24 [200/0] via 10.10.10.100, mgre0, 00:04:58
Видно, что в случае отказа внешнего сетевого интерфейса eth0 основного шлюза Hub1 в центральном офисе динамическое построение защищенных соединений продолжает функционировать, защищаемая подсеть центрального офиса доступна с филиальных шлюзов.
При восстановлении внешнего сетевого интерфейса eth0 все также корректно отрабатывает. Проверку с полным отключением Hub1 повторите по аналогии.
Смоделируем полный отказ основной ноды кластера в филиале №1, а также отказ Интернет провайдера и проверим работоспособность стенда.
1. Полный отказ основной ноды кластера в филиале №1.
1.1. Выключите основную ноду, для этого в linux bash выполните следующую команду:
root@spoke1-n1:~# poweroff
1.2. Убедитесь, что резервная нода перешла в состояние MASTER, для этого в linux bash выполните следующие команды:
root@spoke1-n2:~# ip address show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9a:f0:bc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.20/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.1/24 scope global secondary eth1
root@spoke1-n2:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
May 16 11:21:57 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Instance(eth1_1) Transition to MASTER STATE
May 16 11:21:58 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Instance(eth1_1) Entering MASTER STATE
May 16 11:21:58 spoke1-n2 Keepalived_vrrp[2793]: Opening script file /etc/keepalived/scripts/notify_master
Видно, что кластерный VIP-адрес (192.168.1.1) присутствует на внутреннем интерфейсе eth1 и в лог-файле есть строки (Transition to MASTER STATE/ Entering MASTER STATE), свидетельствующие о переходе ноды в состояние MASTER.
1.3. Убедитесь, что на резервной ноде по протоколу BGP установлено соседство с центральными шлюзами и получены маршруты в защищаемые подсети, для этого в linux bash выполните следующие команды:
root@spoke1-n2:~# vtysh
Hello, this is FRRouting (version 4.1-dev).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
spoke1-n2# show ip bgp summary
IPv4 Unicast Summary:
BGP router identifier 192.168.1.20, local AS number 65000 vrf-id 0
BGP table version 3
RIB entries 5, using 760 bytes of memory
Peers 2, using 40 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
10.10.10.100 4 65000 23 21 0 0 0 00:00:52 2
10.10.20.200 4 65000 23 21 0 0 0 00:00:52 2
Total number of neighbors 2
spoke1-n2# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
> - selected route, * - FIB route
B>* 192.168.2.0/24 [200/0] via 10.10.10.3, mgre0, 00:01:15
B>* 192.168.100.0/24 [200/0] via 10.10.10.100, mgre0, 00:01:15
1.4. Убедитесь, что защищенное соединение между резервной нодой кластера в филиале №1 и шлюзом в филиале №2 успешно строится, для этого запустите ping с устройства host-b-spoke1 на устройство host-b-spoke2 и проверьте наличие IPsec-туннеля на резервной ноде кластера в филиале №1:
root@host-b-spoke1:~# ping 192.168.2.100 -c 4
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=61 time=1.96 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=62 time=455 ms
64 bytes from 192.168.2.100: icmp_seq=3 ttl=62 time=0.792 ms
64 bytes from 192.168.2.100: icmp_seq=4 ttl=62 time=0.784 ms
--- 192.168.2.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.784/114.653/455.074/196.542 ms
root@spoke1-n2:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 23 (100.101.1.2,4500)-(172.17.200.2,4500) active 2100 2192
2 24 (100.101.1.2,4500)-(172.16.100.2,4500) active 2100 2192
3 25 (100.101.1.2,4500)-(172.16.2.2,4500) active 1936 1836
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 4 (100.101.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 240 152
2 5 (100.101.1.2,*)-(172.16.100.2,*) * ESP nat-t-trans 408 240
3 6 (100.101.1.2,*)-(172.16.100.2,*) * ESP nat-t-trans 12576 12608
4 7 (100.101.1.2,*)-(172.17.200.2,*) * ESP nat-t-trans 11616 11648
5 8 (100.101.1.2,*)-(172.16.2.2,*) * ESP nat-t-trans 288 288
1.5. Запустите основную ноду кластера, дождитесь ее полной загрузки и убедитесь, что она перешла в состояние BACKUP (основная нода не перехватит роль MASTER, так как в настройках VRRP стоит опция nopreempt), для этого в linux bash выполните следующие команды:
root@spoke1-n1:~# ip address show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:70:a0:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
root@spoke1-n1:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
...
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Instance(eth1_1) Entering BACKUP STATE
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: Opening script file /etc/keepalived/scripts/notify_backup
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Script(check_run_service_vpnsvc) succeeded
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Script(check_run_service_zebra) succeeded
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Script(check_run_service_bgpd) succeeded
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Script(check_run_service_opennhrp) succeeded
May 16 11:39:05 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Script(check_isp_link) succeeded
Видно, что основная нода находится в состоянии BACKUP.
2. Отказ Интернет провайдера.
2.1. Чтобы смоделировать отказ Интернет провайдера заблокируем ICMP пакеты от резервной ноды кластера (предполагается, что резервная нода находится в состоянии MASTER, а основная в BACKUP) на роутере Core_router, для этого в linux bash выполните следующую команду:
root@core-router:~# iptables -A INPUT -s 172.17.1.2 -p icmp -j DROP
2.2. Убедитесь, что резервная нода кластера перешла в состояние FAULT, для этого в linux bash выполните следующую команду:
root@spoke1-n2:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
...
May 16 11:50:27 spoke1-n2 Keepalived_vrrp[2793]: pid 5797 exited with status 256
May 16 11:50:28 spoke1-n2 Keepalived_vrrp[2793]: pid 5817 exited with status 256
May 16 11:50:29 spoke1-n2 Keepalived_vrrp[2793]: pid 5838 exited with status 256
May 16 11:50:30 spoke1-n2 Keepalived_vrrp[2793]: pid 5859 exited with status 256
May 16 11:50:31 spoke1-n2 Keepalived_vrrp[2793]: pid 5880 exited with status 256
May 16 11:50:32 spoke1-n2 Keepalived_vrrp[2793]: pid 5901 exited with status 256
May 16 11:50:33 spoke1-n2 Keepalived_vrrp[2793]: pid 5922 exited with status 256
May 16 11:50:34 spoke1-n2 Keepalived_vrrp[2793]: pid 5943 exited with status 256
May 16 11:50:35 spoke1-n2 Keepalived_vrrp[2793]: pid 5964 exited with status 256
May 16 11:50:36 spoke1-n2 Keepalived_vrrp[2793]: pid 5985 exited with status 256
May 16 11:50:37 spoke1-n2 Keepalived_vrrp[2793]: pid 6006 exited with status 256
May 16 11:50:38 spoke1-n2 Keepalived_vrrp[2793]: pid 6027 exited with status 256
May 16 11:50:39 spoke1-n2 Keepalived_vrrp[2793]: pid 6048 exited with status 256
May 16 11:50:40 spoke1-n2 Keepalived_vrrp[2793]: pid 6069 exited with status 256
May 16 11:50:41 spoke1-n2 Keepalived_vrrp[2793]: pid 6090 exited with status 256
May 16 11:50:41 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Script(check_isp_link) failed
May 16 11:50:42 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Instance(eth1_1) Entering FAULT STATE
May 16 11:50:42 spoke1-n2 Keepalived_vrrp[2793]: Opening script file /etc/keepalived/scripts/notify_fault
May 16 11:50:42 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Instance(eth1_1) Now in FAULT state
2.3. Убедитесь, что основная нода кластера перешла в состояние MASTER, для этого в linux bash выполните следующую команду:
root@spoke1-n1:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
...
May 16 11:50:43 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Instance(eth1_1) Transition to MASTER STATE
May 16 11:50:44 spoke1-n1 Keepalived_vrrp[2838]: VRRP_Instance(eth1_1) Entering MASTER STATE
May 16 11:50:44 spoke1-n1 Keepalived_vrrp[2838]: Opening script file /etc/keepalived/scripts/notify_master
2.4. Удалите на роутере Core_router правила, блокирующие ICMP добавленные ранее, для этого в linux bash выполните следующую команду:
root@core-router:~# iptables -D INPUT -s 172.17.1.2 -p icmp -j DROP
2.5. Убедитесь, что резервная нода кластера перешла в состояние BACKUP, для этого в linux bash выполните следующую команду:
root@spoke1-n2:~# tail -n 300 /var/log/cspvpngate.log | grep Keepalived
...
May 16 11:56:20 spoke1-n2 Keepalived_vrrp[2793]: pid 13632 exited with status 256
May 16 11:56:21 spoke1-n2 Keepalived_vrrp[2793]: pid 13653 exited with status 256
May 16 11:56:22 spoke1-n2 Keepalived_vrrp[2793]: pid 13674 exited with status 256
May 16 11:56:23 spoke1-n2 Keepalived_vrrp[2793]: pid 13695 exited with status 256
May 16 11:56:24 spoke1-n2 Keepalived_vrrp[2793]: pid 13716 exited with status 256
May 16 11:56:25 spoke1-n2 Keepalived_vrrp[2793]: pid 13737 exited with status 256
May 16 11:56:35 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Script(check_isp_link) succeeded
May 16 11:56:36 spoke1-n2 Keepalived_vrrp[2793]: VRRP_Instance(eth1_1) Entering BACKUP STATE
May 16 11:56:36 spoke1-n2 Keepalived_vrrp[2793]: Opening script file /etc/keepalived/scripts/notify_backup
Видно, что в случае полного отказа основной ноды кластера роль MASTER на себя берет резервная нода и успешно обрабатывает трафик. При отказе Интернет провайдера нода кластера переходит в состояние FAULT, а в случае восстановления в BACKUP.
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Ext_router1_Hub1
auto ens32
iface ens32 inet static
address 172.16.100.1
netmask 255.255.255.0
# To Ext_router2_Hub2
auto ens34
iface ens34 inet static
address 172.17.200.1
netmask 255.255.255.0
# To Spoke2
auto ens35
iface ens35 inet static
address 172.16.2.1
netmask 255.255.255.0
# To Ext_router2_Spoke1
auto ens36
iface ens36 inet static
address 172.17.1.1
netmask 255.255.255.0
# To Ext_router1_Spoke1
auto ens37
iface ens37 inet static
address 172.16.1.1
netmask 255.255.255.0
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Core_router
auto ens32
iface ens32 inet static
address 172.16.100.2
netmask 255.255.255.0
gateway 172.16.100.1
pre-up /etc/iptables.rules
# To Hub1
auto ens34
iface ens34 inet static
address 100.100.100.1
netmask 255.255.255.0
post-up ip route add 192.168.100.0/24 via 100.100.100.2
Содержимое файла /etc/iptables.rules:
EXTIF="ens32"
INTIF="ens34"
LAN_RANGE="100.100.100.0/24"
INET_IP1="172.16.100.2"
IPSECGW="100.100.100.2"
# Flush previous rules, delete chains and reset counters
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -F
# Default policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Enable loopback traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate DNAT -j ACCEPT
# Drop invalid state packets
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
### INPUT ###
# SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### OUTPUT ###
# SSH
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### FORWARD ###
iptables -A FORWARD -i $INTIF -o $EXTIF -m conntrack --ctstate NEW -j ACCEPT
### SNAT ###
iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $INET_IP1
### DNAT ###
# IKE/500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 500 -j DNAT --to-destination $IPSECGW:500
# NAT-T/4500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 4500 -j DNAT --to-destination $IPSECGW:4500
### LOGGING ###
iptables -A INPUT -j LOG --log-level debug --log-prefix '[FW INPUT]: '
iptables -A OUTPUT -j LOG --log-level debug --log-prefix '[FW OUTPUT]: '
iptables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD]: '
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Core_router
auto ens32
iface ens32 inet static
address 172.17.200.2
netmask 255.255.255.0
gateway 172.17.200.1
pre-up /etc/iptables.rules
# To Hub2
auto ens34
iface ens34 inet static
address 100.100.200.1
netmask 255.255.255.0
post-up ip route add 192.168.100.0/24 via 100.100.200.2
Содержимое файла /etc/iptables.rules:
EXTIF="ens32"
INTIF="ens34"
LAN_RANGE="100.100.200.0/24"
INET_IP1="172.17.200.2"
IPSECGW="100.100.200.2"
# Flush previous rules, delete chains and reset counters
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -F
# Default policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Enable loopback traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate DNAT -j ACCEPT
# Drop invalid state packets
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
### INPUT ###
# SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### OUTPUT ###
# SSH
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### FORWARD ###
iptables -A FORWARD -i $INTIF -o $EXTIF -m conntrack --ctstate NEW -j ACCEPT
### SNAT ###
iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $INET_IP1
### DNAT ###
# IKE/500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 500 -j DNAT --to-destination $IPSECGW:500
# NAT-T/4500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 4500 -j DNAT --to-destination $IPSECGW:4500
### LOGGING ###
iptables -A INPUT -j LOG --log-level debug --log-prefix '[FW INPUT]: '
iptables -A OUTPUT -j LOG --log-level debug --log-prefix '[FW OUTPUT]: '
iptables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD]: '
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Core_router
auto ens32
iface ens32 inet static
address 172.16.1.2
netmask 255.255.255.0
gateway 172.16.1.1
pre-up /etc/iptables.rules
# To Spoke1_n1
auto ens34
iface ens34 inet static
address 100.100.1.1
netmask 255.255.255.0
post-up ip route add 192.168.1.0/24 via 100.100.1.2
Содержимое файла /etc/iptables.rules:
EXTIF="ens32"
INTIF="ens34"
LAN_RANGE="100.100.1.0/24"
INET_IP1="172.16.1.2"
IPSECGW="100.100.1.2"
# Flush previous rules, delete chains and reset counters
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -F
# Default policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Enable loopback traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate DNAT -j ACCEPT
# Drop invalid state packets
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
### INPUT ###
# SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### OUTPUT ###
# SSH
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### FORWARD ###
iptables -A FORWARD -i $INTIF -o $EXTIF -m conntrack --ctstate NEW -j ACCEPT
### SNAT ###
iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $INET_IP1
### DNAT ###
# IKE/500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 500 -j DNAT --to-destination $IPSECGW:500
# NAT-T/4500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 4500 -j DNAT --to-destination $IPSECGW:4500
### LOGGING ###
iptables -A INPUT -j LOG --log-level debug --log-prefix '[FW INPUT]: '
iptables -A OUTPUT -j LOG --log-level debug --log-prefix '[FW OUTPUT]: '
iptables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD]: '
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Core_couter
auto ens32
iface ens32 inet static
address 172.17.1.2
netmask 255.255.255.0
gateway 172.17.1.1
pre-up /etc/iptables.rules
# To Spoke1_n2
auto ens34
iface ens34 inet static
address 100.101.1.1
netmask 255.255.255.0
post-up ip route add 192.168.1.0/24 via 100.101.1.2
Содержимое файла /etc/iptables.rules:
EXTIF="ens32"
INTIF="ens34"
LAN_RANGE="100.101.1.0/24"
INET_IP1="172.17.1.2"
IPSECGW="100.101.1.2"
# Flush previous rules, delete chains and reset counters
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -F
# Default policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Enable loopback traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -o $INTIF -m conntrack --ctstate DNAT -j ACCEPT
# Drop invalid state packets
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
### INPUT ###
# SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### OUTPUT ###
# SSH
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# ICMP
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
### FORWARD ###
iptables -A FORWARD -i $INTIF -o $EXTIF -m conntrack --ctstate NEW -j ACCEPT
### SNAT ###
iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to-source $INET_IP1
### DNAT ###
# IKE/500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 500 -j DNAT --to-destination $IPSECGW:500
# NAT-T/4500
iptables -t nat -A PREROUTING --dst $INET_IP1 -p udp --dport 4500 -j DNAT --to-destination $IPSECGW:4500
### LOGGING ###
iptables -A INPUT -j LOG --log-level debug --log-prefix '[FW INPUT]: '
iptables -A OUTPUT -j LOG --log-level debug --log-prefix '[FW OUTPUT]: '
iptables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD]: '
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens32
iface ens32 inet static
address 192.168.100.100
netmask 255.255.255.0
gateway 192.168.100.1
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens32
iface ens32 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens32
iface ens32 inet static
address 192.168.2.100
netmask 255.255.255.0
gateway 192.168.2.1
Содержимое файла /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
# To Hubs
auto ens32
iface ens32 inet static
address 192.168.255.1
netmask 255.255.255.0
# To LAN
auto ens34
iface ens34 inet static
address 192.168.100.1
netmask 255.255.255.0
Настройки сервиса FRR (vtysh):
frr version 4.0
frr defaults traditional
hostname int-router1-hub
no ipv6 forwarding
username cumulus nopassword
!
service integrated-vtysh-config
!
router bgp 65001
bgp router-id 192.168.255.1
coalesce-time 1000
timers bgp 3 9
neighbor 192.168.255.10 remote-as 65000
neighbor 192.168.255.20 remote-as 65000
!
address-family ipv4 unicast
network 192.168.100.0/24
neighbor 192.168.255.10 route-map FROM-HUB1-IN in
neighbor 192.168.255.20 route-map FROM-HUB2-IN in
exit-address-family
!
route-map FROM-HUB1-IN permit 1
set local-preference 100
!
route-map FROM-HUB2-IN permit 1
set local-preference 50
!
line vty
!
end
!
version 12.4
no service password-encryption
!
crypto ipsec df-bit clear
crypto isakmp identity dn
crypto isakmp session-time-max 10
crypto isakmp keepalive 1 3
crypto isakmp keepalive retry-count 3
username cscons privilege 15 password 0 csp
aaa new-model
!
hostname hub1
enable password csp
!
crypto isakmp policy 1
encr gost
hash gost341112-256-tc26
authentication gost-sig
group vko2
!
crypto ipsec transform-set GOST esp-gost28147-4m-imit
mode transport
!
ip access-list extended FIREWALL_OUT
deny ip 192.168.100.0 0.0.0.255 100.64.0.0 0.63.255.255
deny ip 192.168.100.0 0.0.0.255 172.16.0.0 0.15.255.255
deny ip 192.168.100.0 0.0.0.255 192.168.0.0 0.0.255.255
deny ip 192.168.100.0 0.0.0.255 10.0.0.0 0.255.255.255
deny gre any any
permit ip any any
!
ip access-list extended IPSEC_DMVPN
deny icmp host 100.100.100.2 any
deny udp host 100.100.100.2 any
deny tcp host 100.100.100.2 any
deny ip host 100.100.100.2 host 224.0.0.5
deny ip host 100.100.100.2 host 224.0.0.6
deny ip host 100.100.100.2 host 224.0.0.18
permit ip host 100.100.100.2 any
!
crypto dynamic-map DMAP 1
match address IPSEC_DMVPN
set transform-set GOST
set dead-connection history off
!
crypto map VPN 1 ipsec-isakmp dynamic DMAP
!
interface GigabitEthernet0/0
ip address 100.100.100.2 255.255.255.0
ip access-group FIREWALL_OUT out
crypto map VPN
!
interface GigabitEthernet0/1
ip address 192.168.255.10 255.255.255.0
!
!
ip route 0.0.0.0 0.0.0.0 100.100.100.1
!
crypto pki trustpoint s-terra_technological_trustpoint
revocation-check none
crypto pki certificate chain s-terra_technological_trustpoint
certificate 2B6E3351FD6EB2AD48200203CB5BA141
3082024C308201FBA00302010202102B6E3351FD6EB2AD48200203CB5BA14130
...
E34EE9640D905032C1F1E3B4491257D5
quit
!
end
Содержимое файла /etc/network/interfaces.d/mgre0:
auto mgre0
iface mgre0 inet static
address 10.10.10.100
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
Содержимое файла /etc/opennhrp/opennhrp.conf:
interface mgre0
multicast dynamic
holding-time 7200
cisco-authentication secret
non-caching
frr version 4.1-dev
frr defaults traditional
hostname hub1
username sterra nopassword
!
service integrated-vtysh-config
!
router bgp 65000
bgp router-id 10.10.10.100
bgp log-neighbor-changes
bgp deterministic-med
bgp network import-check
timers bgp 3 9
neighbor spokes-ibgp peer-group
neighbor spokes-ibgp remote-as 65000
neighbor 10.10.10.1 peer-group spokes-ibgp
neighbor 10.10.10.2 peer-group spokes-ibgp
neighbor 10.10.10.3 peer-group spokes-ibgp
neighbor 192.168.255.1 remote-as 65001
!
address-family ipv4 unicast
neighbor spokes-ibgp route-reflector-client
neighbor spokes-ibgp next-hop-self
neighbor spokes-ibgp soft-reconfiguration inbound
neighbor 10.10.10.1 route-map FROM-SPOKE1-N1-IN in
neighbor 10.10.10.2 route-map FROM-SPOKE1-N2-IN in
exit-address-family
!
route-map FROM-SPOKE1-N2-IN permit 1
set local-preference 50
!
route-map FROM-SPOKE1-N1-IN permit 1
set local-preference 100
!
line vty
!
end
!
version 12.4
no service password-encryption
!
crypto ipsec df-bit clear
crypto isakmp identity dn
crypto isakmp session-time-max 10
crypto isakmp keepalive 1 3
crypto isakmp keepalive retry-count 3
username cscons privilege 15 password 0 csp
aaa new-model
!
hostname hub2
enable password csp
!
crypto isakmp policy 1
encr gost
hash gost341112-256-tc26
authentication gost-sig
group vko2
!
crypto ipsec transform-set GOST esp-gost28147-4m-imit
mode transport
!
ip access-list extended IPSEC_DMVPN
deny icmp host 100.100.200.2 any
deny udp host 100.100.200.2 any
deny tcp host 100.100.200.2 any
deny ip host 100.100.200.2 host 224.0.0.5
deny ip host 100.100.200.2 host 224.0.0.6
deny ip host 100.100.200.2 host 224.0.0.18
permit ip host 100.100.200.2 any
!
ip access-list extended FIREWALL_OUT
deny ip 192.168.100.0 0.0.0.255 100.64.0.0 0.63.255.255
deny ip 192.168.100.0 0.0.0.255 172.16.0.0 0.15.255.255
deny ip 192.168.100.0 0.0.0.255 192.168.0.0 0.0.255.255
deny ip 192.168.100.0 0.0.0.255 10.0.0.0 0.255.255.255
deny gre any any
permit ip any any
!
crypto dynamic-map DMAP 1
match address IPSEC_DMVPN
set transform-set GOST
set dead-connection history off
!
crypto map VPN 1 ipsec-isakmp dynamic DMAP
!
interface GigabitEthernet0/0
ip address 100.100.200.2 255.255.255.0
ip access-group FIREWALL_OUT out
crypto map VPN
!
interface GigabitEthernet0/1
ip address 192.168.255.20 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 100.100.200.1
!
crypto pki trustpoint s-terra_technological_trustpoint
revocation-check none
crypto pki certificate chain s-terra_technological_trustpoint
certificate 2B6E3351FD6EB2AD48200203CB5BA141
3082024C308201FBA00302010202102B6E3351FD6EB2AD48200203CB5BA14130
...
E34EE9640D905032C1F1E3B4491257D5
quit
!
end
Содержимое файла /etc/network/interfaces.d/mgre0:
auto mgre0
iface mgre0 inet static
address 10.10.20.200
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 2 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
Содержимое файла /etc/opennhrp/opennhrp.conf:
interface mgre0
multicast dynamic
holding-time 7200
cisco-authentication secret
non-caching
frr version 4.1-dev
frr defaults traditional
hostname hub2
username sterra nopassword
!
service integrated-vtysh-config
!
router bgp 65000
bgp router-id 10.10.20.200
bgp log-neighbor-changes
bgp deterministic-med
bgp network import-check
timers bgp 3 9
neighbor spokes-ibgp peer-group
neighbor spokes-ibgp remote-as 65000
neighbor 10.10.20.1 peer-group spokes-ibgp
neighbor 10.10.20.2 peer-group spokes-ibgp
neighbor 10.10.20.3 peer-group spokes-ibgp
neighbor 192.168.255.1 remote-as 65001
!
address-family ipv4 unicast
neighbor spokes-ibgp route-reflector-client
neighbor spokes-ibgp next-hop-self
neighbor spokes-ibgp soft-reconfiguration inbound
neighbor 10.10.20.1 route-map FROM-SPOKE1-N1-IN in
neighbor 10.10.20.2 route-map FROM-SPOKE1-N2-IN in
exit-address-family
!
route-map FROM-SPOKE1-N2-IN permit 1
set local-preference 50
!
route-map FROM-SPOKE1-N1-IN permit 1
set local-preference 100
!
line vty
!
end
!
version 12.4
no service password-encryption
!
crypto ipsec df-bit clear
crypto isakmp identity dn
crypto isakmp session-time-max 10
crypto isakmp keepalive 1 3
crypto isakmp keepalive retry-count 3
username cscons privilege 15 password 0 csp
aaa new-model
!
hostname spoke1-n1
enable password csp
!
crypto isakmp policy 1
encr gost
hash gost341112-256-tc26
authentication gost-sig
group vko2
!
crypto ipsec transform-set GOST esp-gost28147-4m-imit
mode transport
!
ip access-list extended IPSEC_DMVPN
deny icmp host 100.100.1.2 any
deny udp host 100.100.1.2 any
deny tcp host 100.100.1.2 any
deny ip host 100.100.1.2 host 224.0.0.5
deny ip host 100.100.1.2 host 224.0.0.6
deny ip host 100.100.1.2 host 224.0.0.18
permit ip host 100.100.1.2 any
!
ip access-list extended FIREWALL_OUT
deny ip 192.168.1.0 0.0.0.255 100.64.0.0 0.63.255.255
deny ip 192.168.1.0 0.0.0.255 172.16.0.0 0.15.255.255
deny ip 192.168.1.0 0.0.0.255 192.168.0.0 0.0.255.255
deny ip 192.168.1.0 0.0.0.255 10.0.0.0 0.255.255.255
deny gre any any
permit ip any any
!
!
crypto dynamic-map DMAP 1
match address IPSEC_DMVPN
set transform-set GOST
set dead-connection history off
!
crypto map VPN 1 ipsec-isakmp dynamic DMAP
!
interface GigabitEthernet0/0
ip address 100.100.1.2 255.255.255.0
ip access-group FIREWALL_OUT out
crypto map VPN
!
interface GigabitEthernet0/1
ip address 192.168.1.10 255.255.255.0
!
!
ip route 0.0.0.0 0.0.0.0 100.100.1.1
!
crypto pki trustpoint s-terra_technological_trustpoint
revocation-check none
crypto pki certificate chain s-terra_technological_trustpoint
certificate 2B6E3351FD6EB2AD48200203CB5BA141
3082024C308201FBA00302010202102B6E3351FD6EB2AD48200203CB5BA14130
...
E34EE9640D905032C1F1E3B4491257D5
quit
!
end
Содержимое файла /etc/network/interfaces.d/mgre0:
auto mgre0
iface mgre0 inet static
address 10.10.10.1
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
Содержимое файла /etc/network/interfaces.d/mgre1:
auto mgre1
iface mgre1 inet static
address 10.10.20.1
netmask 255.255.255.0
pre-up ip tunnel add mgre1 mode gre key 2 ttl 64 tos inherit
pre-up ip link set mgre1 mtu 1400
pre-up ip link set mgre1 multicast on
Содержимое файла /etc/opennhrp/opennhrp.conf:
interface mgre0
map 10.10.10.100/24 172.16.100.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
interface mgre1
map 10.10.20.200/24 172.17.200.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
frr version 4.1-dev
frr defaults traditional
hostname spoke1-n1
username sterra nopassword
!
service integrated-vtysh-config
!
router bgp 65000
bgp router-id 192.168.1.10
bgp log-neighbor-changes
bgp network import-check
timers bgp 3 9
neighbor 10.10.10.100 remote-as 65000
neighbor 10.10.20.200 remote-as 65000
!
address-family ipv4 unicast
network 192.168.1.0/24
neighbor 10.10.10.100 route-map FROM-HUB1-IN in
neighbor 10.10.20.200 route-map FROM-HUB2-IN in
exit-address-family
!
route-map FROM-HUB1-IN permit 1
set local-preference 100
!
route-map FROM-HUB2-IN permit 1
set local-preference 50
!
line vty
!
end
Содержимое файла /etc/keepalived/scripts/notify_backup:
#!/bin/bash
# Script to run during BACKUP transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/scripts/notify_fault:
#!/bin/bash
# Script to run during FAULT transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/scripts/notify_master:
#!/bin/bash
# Script to run during MASTER transit
vtysh -c "conf t" -c "router bgp 65000" -c "no neighbor 10.10.10.100 shutdown" -c "no neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/keepalived.conf:
vrrp_script check_run_service_vpnsvc {
script "/etc/keepalived/scripts/check_run_service 'vpnsvc'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_opennhrp {
script "/etc/keepalived/scripts/check_run_service 'opennhrp'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_bgpd {
script "/etc/keepalived/scripts/check_run_service 'bgpd'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_zebra {
script "/etc/keepalived/scripts/check_run_service 'zebra'"
fall 5
rise 5
interval 1
}
vrrp_script check_isp_link {
script "/etc/keepalived/scripts/check_ping 'eth0' '172.16.1.1 172.17.1.1' "
fall 15
rise 10
timeout 5
interval 1
}
vrrp_instance eth1_1 {
interface eth1
track_interface {
eth0
}
track_script {
check_run_service_vpnsvc
check_run_service_opennhrp
check_run_service_bgpd
check_run_service_zebra
check_isp_link
}
virtual_ipaddress {
192.168.1.1/24
}
nopreempt
garp_master_refresh 5
priority 100
advert_int 1
virtual_router_id 1
notify_master /etc/keepalived/scripts/notify_master
notify_backup /etc/keepalived/scripts/notify_backup
notify_fault /etc/keepalived/scripts/notify_fault
}
!
version 12.4
no service password-encryption
!
crypto ipsec df-bit clear
crypto isakmp identity dn
crypto isakmp session-time-max 10
crypto isakmp keepalive 1 3
crypto isakmp keepalive retry-count 3
username cscons privilege 15 password 0 csp
aaa new-model
!
hostname spoke1-n2
enable password csp
!
crypto isakmp policy 1
encr gost
hash gost341112-256-tc26
authentication gost-sig
group vko2
!
crypto ipsec transform-set GOST esp-gost28147-4m-imit
mode transport
!
ip access-list extended IPSEC_DMVPN
deny icmp host 100.101.1.2 any
deny udp host 100.101.1.2 any
deny tcp host 100.101.1.2 any
deny ip host 100.101.1.2 host 224.0.0.5
deny ip host 100.101.1.2 host 224.0.0.6
deny ip host 100.101.1.2 host 224.0.0.18
permit ip host 100.101.1.2 any
!
ip access-list extended FIREWALL_OUT
deny ip 192.168.1.0 0.0.0.255 100.64.0.0 0.63.255.255
deny ip 192.168.1.0 0.0.0.255 172.16.0.0 0.15.255.255
deny ip 192.168.1.0 0.0.0.255 192.168.0.0 0.0.255.255
deny ip 192.168.1.0 0.0.0.255 10.0.0.0 0.255.255.255
deny gre any any
permit ip any any
!
!
crypto dynamic-map DMAP 1
match address IPSEC_DMVPN
set transform-set GOST
set dead-connection history off
!
crypto map VPN 1 ipsec-isakmp dynamic DMAP
!
interface GigabitEthernet0/0
ip address 100.101.1.2 255.255.255.0
ip access-group FIREWALL_OUT out
crypto map VPN
!
interface GigabitEthernet0/1
ip address 192.168.1.20 255.255.255.0
!
!
ip route 0.0.0.0 0.0.0.0 100.101.1.1
!
crypto pki trustpoint s-terra_technological_trustpoint
revocation-check none
crypto pki certificate chain s-terra_technological_trustpoint
certificate 2B6E3351FD6EB2AD48200203CB5BA141
3082024C308201FBA00302010202102B6E3351FD6EB2AD48200203CB5BA14130
...
E34EE9640D905032C1F1E3B4491257D5
quit
!
end
Содержимое файла /etc/network/interfaces.d/mgre0:
auto mgre0
iface mgre0 inet static
address 10.10.10.2
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
Содержимое файла /etc/network/interfaces.d/mgre1:
auto mgre1
iface mgre1 inet static
address 10.10.20.2
netmask 255.255.255.0
pre-up ip tunnel add mgre1 mode gre key 2 ttl 64 tos inherit
pre-up ip link set mgre1 mtu 1400
pre-up ip link set mgre1 multicast on
Содержимое файла /etc/opennhrp/opennhrp.conf:
interface mgre0
map 10.10.10.100/24 172.16.100.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
interface mgre1
map 10.10.20.200/24 172.17.200.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
frr version 4.1-dev
frr defaults traditional
hostname spoke1-n2
username sterra nopassword
!
service integrated-vtysh-config
!
router bgp 65000
bgp router-id 192.168.1.20
bgp log-neighbor-changes
bgp network import-check
timers bgp 3 9
neighbor 10.10.10.100 remote-as 65000
neighbor 10.10.20.200 remote-as 65000
!
address-family ipv4 unicast
network 192.168.1.0/24
neighbor 10.10.10.100 route-map FROM-HUB1-IN in
neighbor 10.10.20.200 route-map FROM-HUB2-IN in
exit-address-family
!
route-map FROM-HUB2-IN permit 1
set local-preference 50
!
route-map FROM-HUB1-IN permit 1
set local-preference 100
!
line vty
!
end
Содержимое файла /etc/keepalived/scripts/notify_backup:
#!/bin/bash
# Script to run during BACKUP transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/scripts/notify_fault:
#!/bin/bash
# Script to run during FAULT transit
vtysh -c "conf t" -c "router bgp 65000" -c "neighbor 10.10.10.100 shutdown" -c "neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/scripts/notify_master:
#!/bin/bash
# Script to run during MASTER transit
vtysh -c "conf t" -c "router bgp 65000" -c "no neighbor 10.10.10.100 shutdown" -c "no neighbor 10.10.20.200 shutdown"
exit 0
Содержимое файла /etc/keepalived/keepalived.conf:
vrrp_script check_run_service_vpnsvc {
script "/etc/keepalived/scripts/check_run_service 'vpnsvc'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_opennhrp {
script "/etc/keepalived/scripts/check_run_service 'opennhrp'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_bgpd {
script "/etc/keepalived/scripts/check_run_service 'bgpd'"
fall 5
rise 5
interval 1
}
vrrp_script check_run_service_zebra {
script "/etc/keepalived/scripts/check_run_service 'zebra'"
fall 5
rise 5
interval 1
}
vrrp_script check_isp_link {
script "/etc/keepalived/scripts/check_ping 'eth0' '172.16.1.1 172.17.1.1' "
fall 15
rise 10
timeout 5
interval 1
}
vrrp_instance eth1_1 {
interface eth1
track_interface {
eth0
}
track_script {
check_run_service_vpnsvc
check_run_service_opennhrp
check_run_service_bgpd
check_run_service_zebra
check_isp_link
}
virtual_ipaddress {
192.168.1.1/24
}
nopreempt
garp_master_refresh 5
priority 50
advert_int 1
virtual_router_id 1
notify_master /etc/keepalived/scripts/notify_master
notify_backup /etc/keepalived/scripts/notify_backup
notify_fault /etc/keepalived/scripts/notify_fault
}
!
version 12.4
no service password-encryption
!
crypto ipsec df-bit clear
crypto isakmp identity dn
crypto isakmp session-time-max 10
crypto isakmp keepalive 1 3
crypto isakmp keepalive retry-count 3
username cscons privilege 15 password 0 csp
aaa new-model
!
!
hostname spoke2
enable password csp
!
crypto isakmp policy 1
encr gost
hash gost341112-256-tc26
authentication gost-sig
group vko2
!
crypto ipsec transform-set GOST esp-gost28147-4m-imit
mode transport
!
ip access-list extended IPSEC_DMVPN
deny icmp host 172.16.2.2 any
deny udp host 172.16.2.2 any
deny tcp host 172.16.2.2 any
deny ip host 172.16.2.2 host 224.0.0.5
deny ip host 172.16.2.2 host 224.0.0.6
deny ip host 172.16.2.2 host 224.0.0.18
permit ip host 172.16.2.2 any
!
ip access-list extended FIREWALL_OUT
deny ip 192.168.2.0 0.0.0.255 100.64.0.0 0.63.255.255
deny ip 192.168.2.0 0.0.0.255 172.16.0.0 0.15.255.255
deny ip 192.168.2.0 0.0.0.255 192.168.0.0 0.0.255.255
deny ip 192.168.2.0 0.0.0.255 10.0.0.0 0.255.255.255
deny gre any any
permit ip any any
!
crypto dynamic-map DMAP 1
match address IPSEC_DMVPN
set transform-set GOST
set dead-connection history off
!
crypto map VPN 1 ipsec-isakmp dynamic DMAP
!
interface GigabitEthernet0/0
ip address 172.16.2.2 255.255.255.0
ip access-group FIREWALL_OUT out
crypto map VPN
!
interface GigabitEthernet0/1
ip address 192.168.2.1 255.255.255.0
!
!
ip route 0.0.0.0 0.0.0.0 172.16.2.1
!
crypto pki trustpoint s-terra_technological_trustpoint
revocation-check none
crypto pki certificate chain s-terra_technological_trustpoint
certificate 2B6E3351FD6EB2AD48200203CB5BA141
3082024C308201FBA00302010202102B6E3351FD6EB2AD48200203CB5BA14130
...
E34EE9640D905032C1F1E3B4491257D5
quit
!
end
Содержимое файла /etc/network/interfaces.d/mgre0:
auto mgre0
iface mgre0 inet static
address 10.10.10.3
netmask 255.255.255.0
pre-up ip tunnel add mgre0 mode gre key 1 ttl 64 tos inherit
pre-up ip link set mgre0 mtu 1400
pre-up ip link set mgre0 multicast on
Содержимое файла /etc/network/interfaces.d/mgre1:
auto mgre1
iface mgre1 inet static
address 10.10.20.3
netmask 255.255.255.0
pre-up ip tunnel add mgre1 mode gre key 2 ttl 64 tos inherit
pre-up ip link set mgre1 mtu 1400
pre-up ip link set mgre1 multicast on
Содержимое файла /etc/opennhrp/opennhrp.conf:
interface mgre0
map 10.10.10.100/24 172.16.100.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
interface mgre1
map 10.10.20.200/24 172.17.200.2 register
multicast nhs
holding-time 7200
cisco-authentication secret
non-caching
frr version 4.1-dev
frr defaults traditional
hostname spoke2
username sterra nopassword
!
service integrated-vtysh-config
!
router bgp 65000
bgp router-id 192.168.2.1
bgp log-neighbor-changes
bgp network import-check
timers bgp 3 9
neighbor 10.10.10.100 remote-as 65000
neighbor 10.10.20.200 remote-as 65000
!
address-family ipv4 unicast
network 192.168.2.0/24
neighbor 10.10.10.100 route-map FROM-HUB1-IN in
neighbor 10.10.20.200 route-map FROM-HUB2-IN in
exit-address-family
!
route-map FROM-HUB2-IN permit 1
set local-preference 50
!
route-map FROM-HUB1-IN permit 1
set local-preference 100
!
line vty
!
end