В данной статье я бы хотел привести пошаговую инструкцию того как можно быстро развернуть самую масштабируемую на текущий момент схему Remote-Access VPN доступа на базе AnyConnect и Cisco ASA – VPN Load Balancing Cluster.
Введение: Многие компании во всем мире ввиду текущей обстановки с COVID-19 предпринимают усилия по переводу своих сотрудников на удаленный режим работы. Ввиду массовости перехода на удаленную работу, критическим образом возрастает нагрузка на имеющиеся VPN шлюзы компаний и требуется очень быстрая возможность их масштабирования. С другой стороны, многие компании вынуждены второпях осваивать с нуля такое понятие как удаленная работа.
Я подготовил пошаговую инструкцию простого варианта развертывания 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 кластера является независимой единицей с точки зрения проводимых настроек, то все этапы конфигурации мы проводим индивидуально на каждом отдельном устройстве.
Разворачиваем из образа экземпляры ASAv нужных нам шаблонов (ASAv5/10/30/50).
Назначаем интерфейсы INSIDE/OUTSIDE на одинаковые VLAN (Outside в своем VLAN, INSIDE в своем, но общем в рамках кластера см. топологию), важном чтобы интерфейсы одного типа находились в одном L2 сегменте.
Лицензии:
На момент установка 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
!
Для регистрации токена в облаке 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>
Проверяем что устройство успешно зарегистрировало лицензию и опции шифрования доступны:
Настраиваем базовый 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.
(ОПЦИОНАЛЬНО): В вышеприведенном примере мы использовали локального пользователя на МСЭ для аутентификации удаленных пользователей, что конечно, кроме как в лаборатории слабо применимо. Я приведу пример того, как быстро адаптировать настройку для аутентификации на RADIUS сервере, для примера использован Cisco Identity Services Engine:
Данная интеграция дала возможность не только быстро интегрировать процедуру аутентификации с сервисом каталогов 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, откуда они соединяются нужно сделать следующие настройки
Крайне важно при использовании кластера дать возможность внутренней сети понять на какую ASA маршрутизировать обратный трафик к пользователям, для этого необходимо нужно сделать редистрибьюцию маршрутов /32 адресов, выдаваемых клиентам.
На текущий момент кластер мы еще не настраивали, но у нас уже есть работающие VPN шлюзы, к которым можно индивидуально подключиться по FQDN или IP.
Мы видим подключенного клиента в таблице маршрутизации первой ASA:
Чтобы весь наш VPN кластер и вся корпоративная сеть знала маршрут до нашего клиента, проведем редистрибьюцию клиентского префикса в протокол динамической маршрутизации, к примеру OSPF:
Теперь у нас есть маршрут до клиента с второго шлюза ASA-2 и пользователи, подключенные к разным VPN шлюзам в рамках кластера могут, например, общаться через корпоративный софтфон напрямую, также как и обратный трафик от запрашиваемых пользователем ресурсов будет приходить на нужный VPN шлюз:
Переходим к настройке Load-Balancing кластера.
Адрес 192.168.31.40 будет использоваться как Virtual IP ( VIP — к нему будут первично соединяться все VPN клиенты), с этого адреса Master кластера будет делать REDIRECT на менее загруженную ноду кластера. Не забудьте прописать прямую и обратную DNS запись как для каждого внешнего адреса/FQDN каждой ноды кластера, так и для VIP.
Проверяем работу кластера с двумя подключенными клиентами:
Сделаем опыт работы клиента более удобным с автоматически загружаемым профилем AnyConnect через ASDM.
Называем профиль удобным образом и ассоциируем нашу групповую политику с ним:
После следующего подключения клиента данный профиль будет автоматически скачан и установлен в AnyConnect клиент, таким образом останется при необходимости подключения просто выбрать его из списка:
Поскольку, используя ASDM мы создали этот профиль только на одной ASA, не забудьте повторить действия на остальных ASA кластера.
Вывод: Таким образом, мы быстро развернули кластер из нескольких VPN шлюзов с автоматической балансировкой нагрузки. Добавить новые ноды к кластеру не составляет труда, получив простое горизонтальное масштабирование путем развертывания новых виртуальных машин ASAv или использования аппаратных ASA. Многофункциональный клиент AnyConnect может сильно расширить возможности безопасного удаленного подключения с использованием функции Posture (оценки состояния), наиболее эффективно применяемой совместно с системой централизованного контроля и учета доступа Identity Services Engine.