Развертывание ASA VPN Load-Balancing кластера

Развертывание ASA VPN Load-Balancing кластера

В данной статье я бы хотел привести пошаговую инструкцию того как можно быстро развернуть самую масштабируемую на текущий момент схему Remote-Access VPN доступа на базе AnyConnect и Cisco ASAVPN Load Balancing Cluster.


Введение: Многие компании во всем мире ввиду текущей обстановки с COVID-19 предпринимают усилия по переводу своих сотрудников на удаленный режим работы. Ввиду массовости перехода на удаленную работу, критическим образом возрастает нагрузка на имеющиеся VPN шлюзы компаний и требуется очень быстрая возможность их масштабирования. С другой стороны, многие компании вынуждены второпях осваивать с нуля такое понятие как удаленная работа.


Для того чтобы помочь бизнесу реализовать в кратчайшие сроки удобный, безопасный и масштабируемый доступ VPN для сотрудников, компания Cisco предоставляет на срок до 13 недель лицензии на многофункциональный SSL-VPN клиент AnyConnect. Также можно взять ASAv на тест (Виртуальная ASA для гипервизоров VMWare/Hyper-V/KVM и облачных платформ AWS/Azure) у авторизованных партнеров или обратившись к работающим с Вами представителям Cisco https://www.cisco.com/c/en/us/products/collateral/security/adaptive-security-virtual-appliance-asav/datasheet-c78-733399.html .


Процедура выписки лицензий AnyConnect COVID-19 описана тут: https://www.cisco.com/c/en/us/support/docs/security/anyconnect-secure-mobility-client/215330-obtaining-an-emergency-covid-19-anyconne.html


Я подготовил пошаговую инструкцию простого варианта развертывания VPN Load-Balancing кластера как наиболее масштабируемой технологии VPN.
Нижеуказанный пример будет довольно простым с точки зрения применяемых алгоритмов аутентификации и авторизации, но будет хорошим вариантом для быстрого старта (чего сейчас очень многим не хватает) с возможностью углубленной адаптации под свои нужды в процессе развертывания.


Краткие сведения: Технология VPN Load Balancing Cluster это не failover и не функция кластеризации в её нативном понимании, данной технологией можно объединять совершенно различные модели ASA (с определенными ограничениями) с целью балансировки нагрузки Remote-Access VPN соединений. Cинхронизация сессий и конфигураций между нодами такого кластера отсутствует, зато возможна автоматическая балансировка нагрузки VPN соединений и обеспечение отказоустойчивости соединений VPN пока не останется хотя бы одной активной ноды в кластере. Нагрузка в кластере балансируется автоматически в зависимости от загруженности нод по количеству VPN сессий.
Для отказоустойчивости конкретных нод кластера (если это требуется) можно применять файловер, таким образом, активное соединение будет обрабатываться Primary нодой файловера. Файловер не является необходимым условием обеспечения отказоустойчивости внутри Load-Balancing кластера, сам кластер в случае отказа ноды переведет сессию пользователя на другую живую ноду, однако без сохранения статуса соединения, что как раз обеспечивается файловером. Соответственно можно при необходимости комбинировать эти две технологии.
VPN Load-Balancing кластер может содержать больше двух нод.
VPN Load-Balancing кластер поддерживается на ASA 5512-X и выше.
Поскольку каждая ASA в рамках VPN Load-Balancing кластера является независимой единицей с точки зрения проводимых настроек, то все этапы конфигурации мы проводим индивидуально на каждом отдельном устройстве.


Подробности технологии тут:
https://www.cisco.com/c/en/us/td/docs/security/asa/asa99/configuration/vpn/asa-99-vpn-config/vpn-ha.html


Логическая топология приведенного примера:



Первичное развертывание:


  1. Разворачиваем из образа экземпляры ASAv нужных нам шаблонов (ASAv5/10/30/50).


  2. Назначаем интерфейсы INSIDE/OUTSIDE на одинаковые VLAN (Outside в своем VLAN, INSIDE в своем, но общем в рамках кластера см. топологию), важном чтобы интерфейсы одного типа находились в одном L2 сегменте.


  3. Лицензии:


    • На момент установка ASAv не будет иметь никаких лицензий и будет ограничена производительностью 100кбит/сек.
    • Для установки лицензии Вам необходимо сгенерировать токен в Вашем кабинете Smart-Account: https://software.cisco.com/ -> Smart Software Licensing
    • В открывшемся окне после нажмите кнопку New Token


    • Убедитесь, что в открывшемся окне имеется активно поле и установлена галочка Allow export-controlled functionality… Без данного поля активного Вы не сможете использовать функции сильного шифрования и соответственно VPN. Если данное поле не активно, пожалуйста обратитесь к Вашей аккаунт-команде с запросом активации.


    • После нажатия кнопки Create Token, создастся токен, который мы будем использовать для получения лицензии на ASAv, скопируем его:


    • Повторим шаги C,D,E для каждой развернутой ASAv.
    • Для того чтобы было проще копировать токен, разрешим временно telnet. Настроим каждую ASA (пример ниже иллюстрирует настройки на ASA-1). telnet с outside не работает, если очень надо, смените security-level на 100 на outside, потом верните назад.

    ! ciscoasa(config)# int gi0/0 ciscoasa(config)# nameif outside ciscoasa(config)# ip address 192.168.31.30 255.255.255.0 ciscoasa(config)# no shut ! ciscoasa(config)# int gi0/1 ciscoasa(config)# nameif inside ciscoasa(config)# ip address 192.168.255.2 255.255.255.0 ciscoasa(config)# no shut ! ciscoasa(config)# telnet 0 0 inside ciscoasa(config)# username admin password cisco priv 15 ciscoasa(config)# ena password cisco ciscoasa(config)# aaa authentication telnet console LOCAL ! ciscoasa(config)# route outside 0 0 192.168.31.1 ! ciscoasa(config)# wr !


    ! ciscoasa(config)# clock set 19:21:00 Mar 18 2020 ciscoasa(config)# clock timezone MSK 3 ciscoasa(config)# ntp server 192.168.99.136 ! ciscoasa(config)# dns domain-lookup outside ciscoasa(config)# DNS server-group DefaultDNS ciscoasa(config-dns-server-group)# name-server 192.168.99.132  ! ! Проверим работу DNS: ! ciscoasa(config-dns-server-group)# ping ya.ru Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 87.250.250.242, timeout is 2 seconds: !!!!! ! ! Проверим синхронизацию NTP: ! ciscoasa(config)# show ntp associations    address         ref clock     st  when  poll reach  delay  offset    disp *~192.168.99.136   91.189.94.4       3    63    64    1    36.7    1.85    17.5 * master (synced), # master (unsynced), + selected, - candidate, ~ configured ! ! Установим конфигурацию нашей ASAv для Smart-Licensing (в соответствии с Вашим профилем, в моем случае 100М для примера) ! ciscoasa(config)# license smart ciscoasa(config-smart-lic)# feature tier standard ciscoasa(config-smart-lic)# throughput level 100M ! ! В случае необходимости можно настроить доступ в Интернет через прокси используйте следущий блок комманд: !call-home !  http-proxy ip_address port port ! ! Далее мы вставляем скопированный из портала Smart-Account токен (<token>) и регистрируем лицензию ! ciscoasa(config)# end ciscoasa# license smart register idtoken <token>

    • Проверяем что устройство успешно зарегистрировало лицензию и опции шифрования доступны:



  4. Настраиваем базовый SSL-VPN на каждом шлюзе


    • Далее настраиваем доступ через SSH и ASDM:

    ciscoasa(config)# ssh ver 2 ciscoasa(config)# aaa authentication ssh console LOCAL ciscoasa(config)# aaa authentication http console LOCAL ciscoasa(config)# hostname vpn-demo-1 vpn-demo-1(config)# domain-name ashes.cc vpn-demo-1(config)# cry key gen rsa general-keys modulus 4096  vpn-demo-1(config)# ssh 0 0 inside   vpn-demo-1(config)# http 0 0 inside ! ! Поднимем сервер HTTPS для ASDM на порту 445 чтобы не пересекаться с SSL-VPN порталом ! vpn-demo-1(config)# http server enable 445  !

    • Для работы ASDM надо сначала скачать его с сайта cisco.com, в моем случае это следующий файл:


    • Для работы AnyConnect клиента надо загрузить на каждую ASA образ для каждой используемой десктопной ОС клиента (планируемой к использованию Linux/Windows/MAC) нужен будет файл с Headend Deployment Package в названии:


    • Скачанные файлы можно выложить, к примеру, на FTP сервер и закачать на каждую отдельную ASA:


    • Настраиваем ASDM и Self-Signed сертификат для SSL-VPN (в продуктиве сертификат рекомендуется использовать доверенный). Установленный FQDN Виртуального адреса кластера (vpn-demo.ashes.cc), а также каждый FQDN ассоциированный с внешним адресом каждой ноды кластера должен разрешаться в внешней зоне DNS на IP адрес интерфейса OUTSIDE (либо на mapped адрес, если используется проброс порта udp/443 (DTLS) и tcp/443(TLS)). Детальная информация по требованиям к сертификату указана в разделе Certificate Verification документации.

    ! vpn-demo-1(config)# crypto ca trustpoint SELF vpn-demo-1(config-ca-trustpoint)# enrollment self vpn-demo-1(config-ca-trustpoint)# fqdn vpn-demo.ashes.cc vpn-demo-1(config-ca-trustpoint)# subject-name cn=*.ashes.cc, ou=ashes-lab, o=ashes, c=ru vpn-demo-1(config-ca-trustpoint)# serial-number              vpn-demo-1(config-ca-trustpoint)# crl configure vpn-demo-1(config-ca-crl)# cry ca enroll SELF % The fully-qualified domain name in the certificate will be: vpn-demo.ashes.cc Generate Self-Signed Certificate? [yes/no]: yes vpn-demo-1(config)#  ! vpn-demo-1(config)# sh cry ca certificates  Certificate Status: Available Certificate Serial Number: 4d43725e Certificate Usage: General Purpose Public Key Type: RSA (4096 bits) Signature Algorithm: SHA256 with RSA Encryption Issuer Name:  serialNumber=9A439T02F95 hostname=vpn-demo.ashes.cc cn=*.ashes.cc ou=ashes-lab o=ashes c=ru Subject Name: serialNumber=9A439T02F95 hostname=vpn-demo.ashes.cc cn=*.ashes.cc ou=ashes-lab o=ashes c=ru Validity Date:  start date: 00:16:17 MSK Mar 19 2020 end   date: 00:16:17 MSK Mar 17 2030 Storage: config Associated Trustpoints: SELF   CA Certificate Status: Available Certificate Serial Number: 0509 Certificate Usage: General Purpose Public Key Type: RSA (4096 bits) Signature Algorithm: SHA1 with RSA Encryption Issuer Name:  cn=QuoVadis Root CA 2 o=QuoVadis Limited c=BM Subject Name:  cn=QuoVadis Root CA 2 o=QuoVadis Limited c=BM Validity Date:  start date: 21:27:00 MSK Nov 24 2006 end   date: 21:23:33 MSK Nov 24 2031 Storage: config Associated Trustpoints: _SmartCallHome_ServerCA               

    • Для проверки работы ASDM не забывайте указывать порт, например:


    • Проведем базовые настройки туннеля:
    • Сделаем доступным через туннель корпоративную сеть, а интернет пустим напрямую (не самый безопасный метод при отсутствии средств защиты на подключаемом хосте, возможно проникновение через зараженный хост и вывод корп. данных, опция split-tunnel-policy tunnelall пустит весь трафик хоста в туннель. Тем не менее Split-Tunnel дает возможность разгрузить шлюз VPN и не обрабатывать трафик Интернета хоста)
    • Выдадим хостам в туннель адреса из подсети 192.168.20.0/24 (пул с 10 по 30 адресов (для ноды #1)). На каждой ноде кластера VPN пул должен быть свой.
    • Проведем базовую аутентификацию локально созданным пользователем на ASA (Так делать не рекомендуется, это самый простой метод), лучше делать аутентификацию через LDAP/RADIUS, а еще лучше привязать Multi-Factor Authentication (MFA), например Cisco DUO.

    ! vpn-demo-1(config)# ip local pool vpn-pool 192.168.20.10-192.168.20.30 mask 255.255.255.0 ! vpn-demo-1(config)# access-list split-tunnel standard permit 192.168.0.0 255.255.0.0 ! vpn-demo-1(config)# group-policy SSL-VPN-GROUP-POLICY internal vpn-demo-1(config)# group-policy SSL-VPN-GROUP-POLICY attributes vpn-demo-1(config-group-policy)# vpn-tunnel-protocol ssl-client  vpn-demo-1(config-group-policy)# split-tunnel-policy tunnelspecified vpn-demo-1(config-group-policy)# split-tunnel-network-list value split-tunnel vpn-demo-1(config-group-policy)# dns-server value 192.168.99.132 vpn-demo-1(config-group-policy)# default-domain value ashes.cc vpn-demo-1(config)# tunnel-group DefaultWEBVPNGroup general-attributes vpn-demo-1(config-tunnel-general)#  default-group-policy SSL-VPN-GROUP-POLICY vpn-demo-1(config-tunnel-general)#  address-pool vpn-pool ! vpn-demo-1(config)# username dkazakov password cisco vpn-demo-1(config)# username dkazakov attributes vpn-demo-1(config-username)# service-type remote-access ! vpn-demo-1(config)# ssl trust-point SELF vpn-demo-1(config)# webvpn vpn-demo-1(config-webvpn)#  enable outside vpn-demo-1(config-webvpn)#  anyconnect image disk0:/anyconnect-win-4.8.03036-webdeploy-k9.pkg vpn-demo-1(config-webvpn)#  anyconnect enable !

    • (ОПЦИОНАЛЬНО): В вышеприведенном примере мы использовали локального пользователя на МСЭ для аутентификации удаленных пользователей, что конечно, кроме как в лаборатории слабо применимо. Я приведу пример того, как быстро адаптировать настройку для аутентификации на RADIUS сервере, для примера использован Cisco Identity Services Engine:

    vpn-demo-1(config-aaa-server-group)# dynamic-authorization vpn-demo-1(config-aaa-server-group)# interim-accounting-update vpn-demo-1(config-aaa-server-group)# aaa-server RADIUS (outside) host 192.168.99.134 vpn-demo-1(config-aaa-server-host)# key cisco vpn-demo-1(config-aaa-server-host)# exit vpn-demo-1(config)# tunnel-group DefaultWEBVPNGroup general-attributes vpn-demo-1(config-tunnel-general)# authentication-server-group  RADIUS  !

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




    • Сделаем настройку Transparent NAT чтобы трафик между клиентом и ресурсами сети корпоративной сети не натировался:

    vpn-demo-1(config-network-object)#  subnet 192.168.20.0 255.255.255.0 ! vpn-demo-1(config)# nat (inside,outside) source static any any destination static vpn-users vpn-users no-proxy-arp

    • (ОПЦИОНАЛЬНО): Чтобы выпустить наших клиентов в Интернет через ASA (при использовании tunnelall опции) с использованием PAT, а также выходить через тот же интерфейс OUTSIDE, откуда они соединяются нужно сделать следующие настройки

    vpn-demo-1(config-network-object)# nat (outside,outside) source dynamic vpn-users interface vpn-demo-1(config)# nat (inside,outside) source dynamic any interface vpn-demo-1(config)# same-security-traffic permit intra-interface  !

    • Крайне важно при использовании кластера дать возможность внутренней сети понять на какую ASA маршрутизировать обратный трафик к пользователям, для этого необходимо нужно сделать редистрибьюцию маршрутов /32 адресов, выдаваемых клиентам.
      На текущий момент кластер мы еще не настраивали, но у нас уже есть работающие VPN шлюзы, к которым можно индивидуально подключиться по FQDN или IP.


    Мы видим подключенного клиента в таблице маршрутизации первой ASA:



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


    ! vpn-demo-1(config)# route-map RMAP-VPN-REDISTRIBUTE permit 1 vpn-demo-1(config-route-map)#  match ip address VPN-REDISTRIBUTE ! vpn-demo-1(config)# router ospf 1 vpn-demo-1(config-router)#  network 192.168.255.0 255.255.255.0 area 0 vpn-demo-1(config-router)#  log-adj-changes vpn-demo-1(config-router)#  redistribute static metric 5000 subnets route-map RMAP-VPN-REDISTRIBUTE

    Теперь у нас есть маршрут до клиента с второго шлюза ASA-2 и пользователи, подключенные к разным VPN шлюзам в рамках кластера могут, например, общаться через корпоративный софтфон напрямую, также как и обратный трафик от запрашиваемых пользователем ресурсов будет приходить на нужный VPN шлюз:



  5. Переходим к настройке Load-Balancing кластера.


    Адрес 192.168.31.40 будет использоваться как Virtual IP ( VIP — к нему будут первично соединяться все VPN клиенты), с этого адреса Master кластера будет делать REDIRECT на менее загруженную ноду кластера. Не забудьте прописать прямую и обратную DNS запись как для каждого внешнего адреса/FQDN каждой ноды кластера, так и для VIP.


    vpn-demo-1(config)# vpn load-balancing vpn-demo-1(config-load-balancing)# interface lbpublic outside vpn-demo-1(config-load-balancing)# interface lbprivate inside vpn-demo-1(config-load-balancing)# priority 10 vpn-demo-1(config-load-balancing)# cluster ip address 192.168.31.40 vpn-demo-1(config-load-balancing)# cluster port 4000 vpn-demo-1(config-load-balancing)# redirect-fqdn enable vpn-demo-1(config-load-balancing)# cluster key cisco vpn-demo-1(config-load-balancing)# cluster encryption vpn-demo-1(config-load-balancing)# cluster port 9023 vpn-demo-1(config-load-balancing)# participate vpn-demo-1(config-load-balancing)#

    • Проверяем работу кластера с двумя подключенными клиентами:


    • Сделаем опыт работы клиента более удобным с автоматически загружаемым профилем AnyConnect через ASDM.


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



    После следующего подключения клиента данный профиль будет автоматически скачан и установлен в AnyConnect клиент, таким образом останется при необходимости подключения просто выбрать его из списка:



    Поскольку, используя ASDM мы создали этот профиль только на одной ASA, не забудьте повторить действия на остальных ASA кластера.



Вывод: Таким образом, мы быстро развернули кластер из нескольких VPN шлюзов с автоматической балансировкой нагрузки. Добавить новые ноды к кластеру не составляет труда, получив простое горизонтальное масштабирование путем развертывания новых виртуальных машин ASAv или использования аппаратных ASA. Многофункциональный клиент AnyConnect может сильно расширить возможности безопасного удаленного подключения с использованием функции Posture (оценки состояния), наиболее эффективно применяемой совместно с системой централизованного контроля и учета доступа Identity Services Engine.

Alt text