Развертывание 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.

Процедура выписки лицензий AnyConnect COVID-19 описана тут.

Я подготовил пошаговую инструкцию простого варианта развертывания 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 кластера является независимой единицей с точки зрения проводимых настроек, то все этапы конфигурации мы проводим индивидуально на каждом отдельном устройстве.

Подробности технологии тут

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

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

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

  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

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

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

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

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

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

    • Повторим шаги 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
    !

    • Для регистрации токена в облаке Smart-Account необходимо предоставить доступ в Интернет для ASA, детали тут.

    Если коротко, то ASA нужен:

    • доступ по HTTPS в Интернет;
    • синхронизация времени (корректнее по NTP);
    • прописанный DNS сервер;
      • Заходим по telnet на наши ASA и проводим настройки для активации лицензии через Smart-Account.

    !
    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>

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

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

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

  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, в моем случае это следующий файл:

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

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

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

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

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

    • Настраиваем 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 не забывайте указывать порт, например:

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

    • Проведем базовые настройки туннеля:
    • Сделаем доступным через туннель корпоративную сеть, а интернет пустим напрямую (не самый безопасный метод при отсутствии средств защиты на подключаемом хосте, возможно проникновение через зараженный хост и вывод корп. данных, опция 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, понимать корпоративное это устройство или личное и проводить оценку состояния подключаемого устройства.

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

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

    • Сделаем настройку 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 Load-Balancing кластера

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

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

    Чтобы весь наш 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 шлюз:

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

  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)#

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

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

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

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

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

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

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

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

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

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

Источник: habr.com

Добавить комментарий